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

我在学习Windows XP环境下的fasm时,我读到一个fasm源代码,发现调用macros

invoke MessageBox,[_strbuf],_msgcap,MB_ICONinformatION+MB_OK

并导入macros。

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

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

我的假设是这样的

用户间的x86-64 Linux上的CS和SS寄存器的含义?

如何使用gettimeofday()获取当前date

在mov之后正确读取gdb值

阴影空间的例子

Linux AMD64中使用的fs / gs寄存器如何?

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

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

所以指令“呼叫”可以调用MessageBoxA标签(将被转换为位置A + MessageBoxA偏移量)

我的假设是错误的? 我不知道如何调用API。

谢谢

从中断返回时必须使用IRET吗?

如何将C代码转换为程序集的hex表示?

隔离nasm程序中的其余部分

x86安装 – Windows下的非法操作码0xff / 7

良好的汇编语言debugging器的Linux?

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

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

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

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

注意:有一个函数名称,序号和入口点。

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

相关文章

可以认为OpenFeign是Feign的增强版,不同的是OpenFeign支持S...
为进一步规范小程序交易生态、提升用户购物体验、满足用户在...
云原生之使用Docker部署Dashdot服务器仪表盘
本文主要描述TensorFlow之回归模型的基本原理
1.漏洞描述Apache Druid 是一个集时间序列数据库、数据仓库和...
内部类(当作类中的一个普通成员变量,只不过此成员变量是cl...