微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从程序集调用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动态链接库)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐