使用内联汇编调用IsDebuggerPresent

时间:2011-11-03 12:24:59

标签: visual-studio-2010 visual-c++ x86 disassembly ollydbg

我在Windows 7机器上,我尝试在IDA中打开kernel32.dll,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中调试exe,当“call”指令执行时,错误是“访问冲突”。

是的,我知道直接从C ++调用API是最好的/正确的方法,我这样做是为了好玩我只是不明白为什么这不起作用。

1 个答案:

答案 0 :(得分:1)

地址0x77e2b020不是静态的,您必须按名称而不是显式地址来调用。

重新启动时,如果启用了ASLR,则库将加载到不同的地址。您也无法保证库加载顺序,因此也会影响地址。

如果您尝试进行间接呼叫,请考虑使用LoadLibraryGetProcAddress在运行时查找IsDebuggerPresent的地址。

另一个问题是,您正在废弃eaxebx。在进行此类内联汇编时,应使用pushadpopad来保证寄存器的安全,例如:

__asm {
    pushad
    call IsDebuggerPresent
    mov dbgPresent, eax
    popad
}