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

时间:2012-12-26 02:38:27

标签: windows api assembly call fasm

我正在学习Windows XP环境 当我读到一个fasm源代码时,我找到了调用宏

invoke  MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK

并导入宏。

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

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

我的假设就是这个

  1. 有代码加载user32.dll并返回已加载的dll的开始地址=>在这里,让我们将返回的地址称为位置A

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

  3. 因此指令'call'可以调用MessageBoxA标签(将转换为位置A + MessageBoxA偏移)

  4. 我的假设错了吗? 我想知道如何调用API。

    感谢

2 个答案:

答案 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动态链接库)。

enter image description here