Вызов 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
}
Другие вопросы по тегам