我在学习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工具的屏幕截图。