我在Windows XP环境下学习fasm,当我阅读fasm源代码时,我发现调用宏:
invoke MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK
字符串
导入macro。
import user,\
MessageBox,'MessageBoxA',\
wsprintf,'wsprintfA'
型
但是我找不到MessageBoxA
的任何硬编码地址,也没有在汇编代码中加载user32.dll。只有宏定义标记字符串,而不是地址。
我的假设是:
1.这里有一段加载user32.dll并返回加载的dll的起始地址=>的代码,让我们调用返回的地址到位置A
1.有硬编码地址和标签对(例如MessageBoxA
= 0x0000000)
1.因此,指令“call”可以调用MessageBoxA
标签(将转换为位置A + MessageBoxA
偏移量)
我的假设错了吗?我想知道API是如何被调用的。
2条答案
按热度按时间oo7oh9g91#
Read the FASM documentation,它解释了如何在user32.dll中引用
MessageBoxA()
。然后read the MSDN documentation关于Windows可执行文件实际上是如何工作的。特别注意关于PE文件导入的部分,该部分解释了如何在运行时解析导入的DLL函数的地址。
简而言之,FASM中的
import
语句是在编译后的EXE文件中的查找表中设置一个条目。然后,当EXE加载到内存中时,操作系统在其代码开始运行之前填充该查找表。nr9pn0ug2#
这里是一个屏幕截图从免费的dependant步行者工具。
注意:有一个函数名,Ordinal和Entry Point。
所以是的,你推断的差不多就是这样。函数是在运行时链接的,而不是在编译时。(DLL动态链接库)。
的数据