我正在尝试使用 gcc 内联直接在程序集中调用 MessageBoxA()。但是我需要以两种方式做到这一点:首先是使用动态寻址,使用 LoadLibrary() 和 GetProcAddress() - 我找到了一个关于这个的教程,试图遵循它。但我也有兴趣直接调用 MessageBoxA 的地址,在我的 Windows SP3 英语中是 0x7e4507ea。
我正在尝试执行此代码:
/*
* eax holds return value
* ebx will hold function addresses
* ecx will hold string pointers
* edx will hold NULL
*
*/
int main(int argc, char **argv)
{
asm(" xor %eax, %eax \t\n\
xor %ebx, %ebx \t\n\
xor %ecx, %ecx \t\n\
xor %edx, %edx \t\n\
push $0x0 \t\n\
push $0x44444444 \t\n\
push $0x44444444 \t\n\
pop %ecx \t\n\
mov %dl,0x3(%ecx) \t\n\
mov $0x7e4507ea, %ebx \t\n\
push %edx \t\n\
push %ecx \t\n\
push %ecx \t\n\
push %edx \t\n\
mov $0x8, %ax \t\n\
call *%ebx \t\n\
");
}
我不确定在 Windows 中是否可以做到这一点,直接调用地址,而不指定库(在这种情况下为 user32.dll)。我知道在 Linux 中调用 write() 系统调用很简单,但在 Windows 中我还不太熟悉..
我希望看到一个带有“DDDDDDDD”的消息框。有人可以帮我吗?感谢任何帮助,还有教程链接!
非常感谢