我正在学习Windows XP环境 当我读到一个fasm源代码时,我找到了调用宏
invoke MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK
并导入宏。
import user,\
MessageBox,'MessageBoxA',\
wsprintf,'wsprintfA'
但是我找不到MessageBoxA的任何硬编码地址,也没有在汇编代码中加载user32.dll。 只有宏定义标记字符串而不是地址。
我的假设就是这个
有代码加载user32.dll并返回已加载的dll的开始地址=>在这里,让我们将返回的地址称为位置A
有硬编码地址和标签对(例如MessageBoxA = 0x00000000)
因此指令'call'可以调用MessageBoxA标签(将转换为位置A + MessageBoxA偏移)
我的假设错了吗? 我想知道如何调用API。
感谢
答案 0 :(得分:1)
Read the FASM documentation,它解释了如何在user32.dll中引用MessageBoxA()
。
然后read the MSDN documentation关于Windows可执行文件的实际工作方式。请特别注意有关PE文件导入的部分,该部分解释了如何在运行时解析导入的DLL函数的地址。
简而言之,FASM中的import
语句是在已编译的EXE文件中的查找表中设置条目。然后,当EXE在代码开始运行之前加载到内存中时,操作系统会填充该查找表。
答案 1 :(得分:0)
这是一个免费的Dependency Walker工具的屏幕截图。
注意:有一个函数名称,Ordinal和Entry Point。
所以是的,你推断的几乎就是它。这些函数在运行时而不是在编译时链接。 (DLL动态链接库)。