我正在windows XP环境下学习fasm 当我阅读fasm源代码时,我发现了invoke宏:
invoke MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK
并导入宏。
import user,\
MessageBox,'MessageBoxA',\
wsprintf,'wsprintfA'
但我找不到 MessageBoxA
的任何硬编码地址,也无法在汇编代码中加载 user32.dll。
只有宏定义标记字符串,但没有标记地址。
我的假设是这样的:
有代码加载user32.dll并返回加载的dll的起始地址=>这里,让我们调用返回的地址到位置A
存在硬编码地址和标签对(例如
MessageBoxA
= 0x00000000)因此指令“call”可以调用
MessageBoxA
标签(将转换为位置 A +MessageBoxA
偏移量)
我的假设是错误的吗? 我想知道API是如何调用的。
最佳答案
Read the FASM documentation ,它解释了如何在 user32.dll 中引用 MessageBoxA()
。
然后read the MSDN documentation有关 Windows 可执行文件实际如何工作的信息。请特别注意有关 PE 文件导入的部分,它解释了如何在运行时解析导入的 DLL 函数的地址。
简而言之,FASM 中的 import
语句正在编译的 EXE 文件内的查找表中设置一个条目。然后,当 EXE 在其代码开始运行之前加载到内存中时,操作系统会填充该查找表。
关于windows - 从程序集调用 Windows API,但没有硬编码地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035456/