![]() |
eXeL@B —› Вопросы новичков —› Какими способами прога может получать дату Биос под 9x (и под NT тоже)? |
Посл.ответ | Сообщение |
|
Создано: 20 ноября 2006 03:24 · Личное сообщение · #1 Под 9x: обязательно ли должна юзаться RtlMoveMemory, или есть другие способы (кроме реестра)? ps Кстати, прога при запуске точно юзает RtlMoveMenory (точнее, выполняется ее код в Kernel). Но место вызова отловить не получается: на бряке падает Олька, а если зациклить -- подвисает ось. Пробовал дойти до события (падения Ольки) по F8/F7, но раз на раз не приходится (хитрый код). Удалось только грубо вычислить километровую процедуру, перепрыгивать которую нельзя... Что посоветуете? ![]() |
|
Создано: 20 ноября 2006 04:19 · Личное сообщение · #2 function GetBIOSDate: string; {получение даты BIOS в Win95} var s: array[0..7] of char; p: pchar; begin p := @s; asm push esi push edi push ecx mov esi,$0ffff5 mov edi,p mov cx,8 @@1:mov al,[esi] mov [edi],al inc edi inc esi loop @@1 pop ecx pop edi pop esi end; setstring(result, s, 8); end; //----------------------------------------------------- procedure TBIOSInfo.GetRegInfoWinNT; var Registryv: TRegistry; RegPath: string; sl: TStrings; begin Params.Clear; RegPath := 'HARDWAREDESCRIPTIONSystem'; registryv := tregistry.Create; registryv.rootkey := HKEY_LOCAL_MACHINE; sl := nil; try registryv.Openkey(RegPath, false); ShowMessage('BIOS Date: ' + RegistryV.ReadString('SystemBiosDate')); sl := ReadMultirowKey(RegistryV, 'SystemBiosVersion'); ShowMessage('BIOS Version: ' + sl.Text); except end; Registryv.Free; if Assigned(sl) then sl.Free; end; ----- Сколько ни наталкивали на мысль – все равно сумел увернуться ![]() |
|
Создано: 20 ноября 2006 05:02 · Поправил: amely · Личное сообщение · #3 WinNT Дату биоса не пробовал, но серийник когда-то получал. Делал приблизительно так: Поскольку ROM BIOS маппится на адреса 0xF9000-0xFFFFF, то задача сводится до прочитки этой памяти. Для этого нужны 3 функции 1. NtOpenSection 2. NtMapViewOfSection 3. NtUnmapViewOfSection далее код HANDLE hSectionHandle,
Возможно эту процедуру можна также использовать для получения даты. В device manager посмотреть память на которую маппится CMOS таймер и читать оттуда. Также рекомендую посмотреть книгу Коберниченко "Недокументированные возможности Windows NT" - возможно даст новые идеи и статью МЕНЕДЖЕР ПАМЯТИ И ПРОЦЕССЫ http://gl00my.chat.ru/nt/mem.txt http://gl00my.chat.ru/nt/mem.txt ![]() |
|
Создано: 20 ноября 2006 06:46 · Поправил: 0xy · Личное сообщение · #4 ValdiS пишет: function GetBIOSDate: string; {получение даты BIOS в Win95} Прям внаглую, без ни каких АПИ? И как же эту жуть с ружжом в коде найти? ![]() ps А в NT -- дай Бог, чтоб из реестра брало! Там тоже есть и более наркоманские способы: через драйвер, ну и тот, что amely написал (правда, последний не проверял) ![]() |
|
Создано: 20 ноября 2006 11:53 · Личное сообщение · #5 ValdiS пишет: -- skipped -- mov esi,$0ffff5 -- skipped -- Поскольку взятие даты, серийника и тп из биоса сводится к прочитке некоторого куска памяти - тогда можна попробовать прочитать память по адресу $0ffff5 (входит в регион 0xF9000-0xFFFFF ) подставив pAddress = 0ffff5. В Win98 к адресам памяти 0xF9000-0xFFFFF есть прямой доступ, в WinNT надо извращатся ![]() ![]() |
|
Создано: 20 ноября 2006 11:56 · Личное сообщение · #6 |
|
Создано: 20 ноября 2006 12:35 · Личное сообщение · #7 |
|
Создано: 20 ноября 2006 14:41 · Личное сообщение · #8 ValdiS пишет: Ставь бряк по адресу 0х0ffff5 и от него пляши дальше Дык нету у меня такого адреса! ![]() ![]() ![]() ![]() |
|
Создано: 20 ноября 2006 21:37 · Личное сообщение · #9 |
|
Создано: 20 ноября 2006 23:00 · Личное сообщение · #10 |
|
Создано: 21 ноября 2006 03:18 · Поправил: 0xy · Личное сообщение · #11 |
|
Создано: 21 ноября 2006 03:44 · Личное сообщение · #12 0xy пишет: диапазон памяти FA000-FFFFF под Олькой у меня всегда отсутствует Ну это ведь физические адреса. Как ставить бряки на физические адреса я незнаю, даже незнаю возможно ли это ![]() есть программа PhysMem от Mark Russinovich download.sysinternals.com/Files/PhysMem.zip - которая читает физическую память. Подробности о программе здесь www.microsoft.com/technet/sysinternals/information/TipsAndTrivia.mspx ![]() |
|
Создано: 21 ноября 2006 05:27 · Поправил: 0xy · Личное сообщение · #13 amely пишет: Можно посмотреть с какими адресами в адресном пространстве процесса работает функция RtlMoveMemory и на них ставить бряки. RtlMoveMemory в явном виде не вызывается! ValdiS пишет: Ставь бряк по адресу 0х0ffff5 Так все-таки, возможно ли это сделать в моем случае, и как? ![]() ps Пробовал код mov eax,[fffff5] работает нормально. Причем Олька еще до выполнения этого mov видит, что лежит по этому адресу, а вот отобразить его в дампе почему-то НЕ ПОЗВОЛЯЕТ! ![]() ![]() ![]() |
|
Создано: 22 ноября 2006 07:49 · Личное сообщение · #14 0xy 1. Искать констанду 0ffff5 в коде (если она есть в чистом виде). 2. Посмотреть дату биоса, ставить бряки в коде и искать эту дату как константу в коде и далее все refferences на нее. Должна ведь программа копировать эту дату в адресное пространство своего процесса - дата ведь как строчка представлена. ![]() |
|
Создано: 22 ноября 2006 13:00 · Поправил: 0xy · Личное сообщение · #15 amely пишет: 1. Искать констанду 0ffff5 в коде (если она есть в чистом виде). В чистом виде не наблюдается. amely пишет: Должна ведь программа копировать эту дату в адресное пространство своего процесса - дата ведь как строчка представлена. Не факт, что как строчка: прога хитрая, может и по быйтам разбросать. Так сто лет искать можно ![]() ValdiS Как же все-таки поставить бряк на ffff5, если Олька не видет этого диапазона??? ![]() |
|
Создано: 23 ноября 2006 02:24 · Личное сообщение · #16 0xy пишет: Не факт, что как строчка: имелось ввиду, что дата представлена как строчка в биосе. Возможно прога по байтам разбрасывает эту строчку, а возможно и нет. Все-таки ставить бряку на адреса не в аддресном просторе процесса думаю невозможно. хотя возможно я ошибаюсь. Можно еще идти по пути хуков - смотреть Hooking the native API или использовать программы которые показывают какие native API вызывает программа и смотреть работают ли они с нужными адресами. ![]() |
|
Создано: 28 ноября 2006 10:59 · Личное сообщение · #17 amely пишет: Можно еще идти по пути хуков - смотреть Hooking the native API или использовать программы которые показывают какие native API вызывает программа и смотреть работают ли они с нужными адресами. Млин, но не юзаются ни какие апи! Тупо: mov eax,[ffff5] -- и получаем дату! Т.е. отлаживаемая прога имеет доступ к этому ffff5. А вот для Ольки он почему-то недоступен ![]() ![]() |
|
Создано: 30 ноября 2006 06:49 · Личное сообщение · #18 0xy пишет: Млин, но не юзаются ни какие апи! Тупо: mov eax,[ffff5] -- и получаем дату! В NT этот адрес обычно прогами не используется. Значит в твоей проге этот диапазон открыт на доступ. Чудес не бывает - использовано какое-то API. Смотри карту памяти и следи. RtlMoveMemory тут не при чем - она только проверяет легальность адресов. ![]() |
|
Создано: 30 ноября 2006 10:59 · Личное сообщение · #19 |
|
Создано: 03 декабря 2006 14:07 · Личное сообщение · #20 Народ, давайте по порядку: tundra37 пишет: В NT этот адрес обычно прогами не используется Речь об 9x! mov eax, [ffff5] нормально срабатывает в ЛЮБОМ месте ЛЮБОЙ(!) проги (хоть на EP). А вот Олька этого диапазона НЕ видит! ![]() amely пишет: Тут надо оговорить, что это в Win9x Уже оговорили ![]() amely пишет: hr 000FFFF5, где hr(hardware break on access) или mr Не ставится ![]() ![]() |
|
Создано: 05 декабря 2006 06:12 · Личное сообщение · #21 |
|
Создано: 06 декабря 2006 17:48 · Личное сообщение · #22 |
|
Создано: 06 декабря 2006 23:26 · Личное сообщение · #23 0xy пишет: как можно ткнуть носом Олю Олю никак. Так она написана. Либо из соображений безопасности ситемная область закрыта от доступа - видимо в 98-м отсутствует защита на запись. Либо автор не особо заботился об удобстве работы именно в 98-м. В любом случае лучше автору претензии выставить. И никто не мешает поотлаживать саму олю ![]() ![]() |
|
Создано: 07 декабря 2006 06:57 · Личное сообщение · #24 |
|
Создано: 22 декабря 2006 04:24 · Личное сообщение · #25 0xy пишет: Закрыли. А зря. Все на самом деле гораздо проще. Попалась утилита SMBIOS - 16-битная, но работает под ХП и 98. Версия от этого года ![]() Любопытные могут залезть внутрь и поиметь алгоритм, но думаю все сводится к чтению памяти, правда в 16-битном режиме. ![]() ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Какими способами прога может получать дату Биос под 9x (и под NT тоже)? |