Вызов IsDebuggerPresent с использованием встроенной сборки
Я на 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 загружается.
Я попытался отладить исполняемый файл в OllyDbg, и ошибка - "Нарушение прав доступа", когда выполняется инструкция "вызова".
Да, я знаю, что вызов API напрямую из C++ - лучший / правильный способ сделать это, я делаю это для развлечения, я просто не понимаю, почему это не работает.
1 ответ
Адрес 0x77e2b020
не является статичным, вы ДОЛЖНЫ называть его по имени, а не по явному адресу.
При перезагрузке библиотека будет загружена по другому адресу, если ASLR включен. Вы также не можете гарантировать порядок загрузки библиотеки, что также повлияет на адрес.
Если вы пытаетесь сделать косвенный вызов, рассмотрите возможность использования LoadLibrary
а также GetProcAddress
найти адрес IsDebuggerPresent
во время выполнения.
Другая проблема заключается в том, что вы уничтожаете eax
а также ebx
, Вы должны использовать pushad
а также popad
для обеспечения безопасности регистров во время такой встроенной сборки, например:
__asm {
pushad
call IsDebuggerPresent
mov dbgPresent, eax
popad
}