assembly 从程序集调用Windows API,但没有硬编码地址

zaq34kh6  于 4个月前  发布在  Windows
关注(0)|答案(2)|浏览(63)

我在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是如何被调用的。

oo7oh9g9

oo7oh9g91#

Read the FASM documentation,它解释了如何在user32.dll中引用MessageBoxA()
然后read the MSDN documentation关于Windows可执行文件实际上是如何工作的。特别注意关于PE文件导入的部分,该部分解释了如何在运行时解析导入的DLL函数的地址。
简而言之,FASM中的import语句是在编译后的EXE文件中的查找表中设置一个条目。然后,当EXE加载到内存中时,操作系统在其代码开始运行之前填充该查找表。

nr9pn0ug

nr9pn0ug2#

这里是一个屏幕截图从免费的dependant步行者工具。
注意:有一个函数名,Ordinal和Entry Point。
所以是的,你推断的差不多就是这样。函数是在运行时链接的,而不是在编译时。(DLL动态链接库)。


的数据

相关问题