【发布时间】:2019-04-26 22:30:08
【问题描述】:
前段时间,我从一个人那里读到一篇文章,他演示了如何通过内存地址直接调用程序集 (NASM) 中的 user32.dll 中的函数。我没有这篇文章了,但我正在尝试重现这个实验。
我要执行的函数是user32.dll中的MessageBoxA,在我的电脑上,该函数应该位于地址0x76cd75c0。
函数如下:
int MessageBoxA(
HWND hWnd, # NULL
LPCSTR IpText, # text
LPCSTR IpCaption, # title
UINT uType # style
);
这是程序:
global _main
section .data
msgText: db 'Hello World', 0
msgCaption: db 'Title', 0
section .text
_main:
push 0
push msgCaption
push msgText
push 0
call 0x76cd75c0
add esp, 4
ret 0x10
为了编译我使用的程序:
nasm –f win32 message_box.asm
但是,我收到以下错误消息:
error: Win32 COFF does not correctly support relative references to absolute
addresses
无论我使用普通地址还是相对地址,我都会收到相同的错误消息。
谁知道问题出在哪里?
【问题讨论】:
-
这看起来像是一种使用 Win32 API 的过于复杂的方式。为什么不使用 Hutch 的 MASM32 包?它的包含和库文件,以及使用
invoke,使得访问 Win32 API 非常舒适。如果您喜欢坚持使用开放软件,请尝试兼容 MASM 的JWASM。 -
是的,这就是重点:) 否则我会使用 _MessageBoxA@16。这纯粹是实验性的,如果可行的话会很酷。