我在学习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偏移量)
谢谢
从中断返回时必须使用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 举报,一经查实,本站将立刻删除。