1

我在阅读 fasm 源代码时在 windows XP 环境中学习 fasm,我发现调用宏

invoke  MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK

并导入宏。

import user,\
     MessageBox,'MessageBoxA',\
     wsprintf,'wsprintfA'

但我找不到 MessageBoxA 的任何硬编码地址,也找不到在汇编代码中加载 user32.dll 。只有宏定义标记字符串而不是地址。

我的假设是这样

  1. 有代码加载 user32.dll 并返回加载的 dll 的起始地址 => 这里,让我们调用返回的地址到位置 A

  2. 有硬编码地址和标签对(例如 MessageBoxA = 0x00000000)

  3. 所以指令'call'可以调用MessageBoxA标签(将转换为位置A + MessageBoxA偏移量)

我的假设错了吗?我想知道如何调用 API。

谢谢

4

2 回答 2

1

阅读 FASM 文档,它解释了如何MessageBoxA()在 user32.dll 中引用。

然后阅读有关 Windows 可执行文件实际工作方式的 MSDN 文档。请特别注意有关 PE 文件导入的部分,该部分解释了如何在运行时解析导入的 DLL 函数的地址。

简而言之,importFASM 中的语句是在已编译的 EXE 文件中的查找表中设置一个条目。然后,当 EXE 在其代码开始运行之前加载到内存中时,操作系统会填写该查找表。

于 2012-12-26T03:42:32.770 回答
0

这是免费的 Dependency Walker 工具的屏幕截图。

注意:有一个函数名,Ordinal 和 Entry Point。

所以是的,你推断的差不多。这些函数在运行时而不是在编译时链接。(DLL 动态链接库)。

在此处输入图像描述

于 2012-12-26T03:36:18.327 回答