Из своей программы, получаю адресс загрузки NTDLL.DLL и хочу анализировать PE-заголовок, но при попытки проверки MZ-сигнатуры выдается сообщение об ошибки, ошибка доступа к памяти, доступ к памяти запрешен! VirtualProtect на весь SizeOfImage из NTDLL.DLL тоже не помогает, хотя функция возвращает не ноль. При просмотре программы через ollyDBG, моя программа анализирует загловок NTDLL.DLL и выполняет то, что запланировано без ошибок. Как я понел: При выполнении моей проги в контексте отладчика (т.е. при просмотре в ольке) ошибок при обращении к адрессному пространству NTDLL.DLL - НЕТ, как добиться нормальной работы, в чем тут проблема???
Code: mov edx, 7C900000 cmp word ptr[edx], 5A4Dh ; cmp 'MZ' jnz @end Ошибка при попытке чтения word по адресу загрузки ntdll.dll (7C900000 - на WinXP SP2).
>>mov edx, 7C900000 cmp word ptr[edx], 5A4Dh ; cmp 'MZ' jnz @end А ты уверен, что адрес загрузки там? C помощью LoadLibrary или GetModuleHandleA получаешь адрес загрузки и все прекрасно работает.
0x0c0de При загрузки модуля NTDLL.DLL по умолчанию уже подгружено к каждому процесу, наподобия как kernel32.dll?
>>0x0c0de При загрузки модуля NTDLL.DLL по умолчанию уже подгружено к каждому процесу, наподобия как kernel32.dll? Да
GlOFF, компилятор? даже делфя нормально сгенерила код и все отрабатывает вне оли: Code: procedure TForm1.FormCreate(Sender: TObject); var res: integer; begin res := 0; asm pushad MOV EDX,$7C900000 CMP WORD PTR [EDX],$5A4D JNZ @fail mov res, 1 jmp @ending @fail: mov res, 0 @ending: popad end; if res = 1 then Showmessage('Found!') else Showmessage('Failed !') end;
Разобрался Странный факт! Заходим в ОЛЮ, при загрузке модуля на вершине стека [esp] лежит адресс в kernel32 , а на [esp+4] адресс в ntdll. А при запуске вне отладчика, по [esp+4] совсем другой адресс. Вот я и оперался на [esp+4].