вызов IsDebuggerPresent с использованием встроенной сборки - PullRequest
0 голосов
/ 03 ноября 2011

Я на машине с 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, и при выполнении инструкции call вызывается ошибка «Access access».

Да, я знаю, что вызов API напрямую из C ++ - лучший / правильный способ сделать это, я делаю это для развлечения, я просто не понимаю, почему это не работает.

1 Ответ

1 голос
/ 03 ноября 2011

Адрес 0x77e2b020 не является статическим, вы ДОЛЖНЫ называть его по имени, а не по явному адресу.

При перезагрузке библиотека будет загружена по другому адресу, если включена функция ASLR. Вы также не можете гарантировать порядок загрузки библиотеки, что также повлияет на адрес.

Если вы пытаетесь сделать косвенный вызов, рассмотрите возможность использования LoadLibrary и GetProcAddress, чтобы найти адрес IsDebuggerPresent во время выполнения.

Другая проблема в том, что вы уничтожаете eax и ebx. Вы должны использовать pushad и popad для обеспечения безопасности регистров во время такой встроенной сборки, например:

__asm {
    pushad
    call IsDebuggerPresent
    mov dbgPresent, eax
    popad
}
...