#visual-studio-2010 #visual-c #x86 #disassembly #ollydbg
#visual-studio-2010 #visual-c #x86 #разборка #ollydbg
Вопрос:
Я на компьютере с Windows 7 и попытался открыть kernel32.dll в IDA и IDA говорится, что адрес функции IsDebuggerPresent равен 0x77e2b020. Я пытаюсь вызвать функцию, используя встроенную сборку.
На платформе vs2010 я попытался использовать следующий код:-
#include<iostream>
using namespace std;
int blah() {
__asm {
xor eax, eax
mov ebx, 0x77e2b020
call ebx
}
}
int main() {
cout<<blah();
return 0;
}
При сборке exe он показывает kernel32.dll загружается.
Я попытался отладить exe-файл в OllyDbg, и ошибка является «Нарушением доступа» при выполнении инструкции «call».
Да, я знаю, что вызов API напрямую из C — лучший / правильный способ сделать это, я делаю это для развлечения, я просто не понимаю, почему это не работает.
Ответ №1:
Адрес 0x77e2b020
не является статическим, вы ДОЛЖНЫ вызывать его по имени, а не по явному адресу.
При перезагрузке библиотека будет загружена по другому адресу, если включен ASLR. Вы также не можете гарантировать порядок загрузки библиотеки, так что это также повлияет на адрес.
Если вы пытаетесь выполнить косвенный вызов, рассмотрите возможность использования LoadLibrary
и GetProcAddress
для поиска адреса IsDebuggerPresent
во время выполнения.
Другая проблема заключается в том, что вы уничтожаете eax
и ebx
. Вы должны использовать pushad
и popad
, чтобы сохранить регистры в безопасности, пока вы выполняете такую встроенную сборку, например:
__asm {
pushad
call IsDebuggerPresent
mov dbgPresent, eax
popad
}
Комментарии:
1. Спасибо! но, хм, да, я пробовал это, но компилятор, похоже, считает, что метка IsDebuggerPresent не определена.
2. Вы включаете определение для него?