我在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是最好的/正确的方法,我这样做是为了好玩我只是不明白为什么这不起作用。
答案 0 :(得分:1)
地址0x77e2b020
不是静态的,您必须按名称而不是显式地址来调用。
重新启动时,如果启用了ASLR,则库将加载到不同的地址。您也无法保证库加载顺序,因此也会影响地址。
如果您尝试进行间接呼叫,请考虑使用LoadLibrary
和GetProcAddress
在运行时查找IsDebuggerPresent
的地址。
另一个问题是,您正在废弃eax
和ebx
。在进行此类内联汇编时,应使用pushad
和popad
来保证寄存器的安全,例如:
__asm {
pushad
call IsDebuggerPresent
mov dbgPresent, eax
popad
}