0

我在 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,当“调用”指令执行时,错误是“访问冲突”。

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

4

1 回答 1

1

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

重新启动时,如果启用了 ASLR,则库将加载到不同的地址。你也不能保证库的加载顺序,这样也会影响地址。

如果您尝试进行间接调用,请考虑使用LoadLibraryandGetProcAddress来查找IsDebuggerPresent运行时的地址。

另一个问题是您正在丢弃eaxebx. 在执行此类内联汇编时,您应该使用pushadpopad保持寄存器安全,例如:

__asm {
    pushad
    call IsDebuggerPresent
    mov dbgPresent, eax
    popad
}
于 2011-11-03T12:27:35.630 回答