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

标签 windows assembly fasm

我正在windows XP环境下学习fasm 当我阅读fasm源代码时,我发现了invoke宏:

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

最佳答案

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/

相关文章:

c++ - 限制程序对 unc 服务器的访问

assembly - 在堆栈中创建命名变量

c - 汇编中的无符号整数

assembly - 为什么从 _start 段错误返回?

assembly - lea和offset之间的差异

assembly - 将 1 字节参数传递给函数?

assembly - 将两个 ORG 放在一起

windows - 停止 Windows 上的 sed 从\r 更改为\r\n

C: realloc 适用于 Linux,但不适用于 Windows

c++ - 打印机驱动程序开发 - 从 32 位到 64 位