【问题标题】:calling Windows API from assembly but there is no hardcoded address从程序集中调用 Windows API 但没有硬编码地址
【发布时间】:2012-12-11 17:00:33
【问题描述】:

我在 windows XP 环境下学习 fasm 在阅读 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偏移量)

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

谢谢

【问题讨论】:

    标签: windows api assembly call fasm


    【解决方案1】:

    Read the FASM documentation,它解释了如何在 user32.dll 中引用 MessageBoxA()

    然后read the MSDN documentation 关于 Windows 可执行文件的实际工作方式。特别注意PE文件导入部分,它解释了导入的DLL函数的地址是如何在运行时解析的。

    简而言之,FASM 中的import 语句是在已编译的 EXE 文件的查找表中设置一个条目。然后,当 EXE 在其代码开始运行之前加载到内存中时,操作系统会填写该查找表。

    【讨论】:

      【解决方案2】:

      这是免费的 Dependency Walker 工具的屏幕截图。

      注意:有一个函数名,序号和入口点。

      所以是的,你推断的差不多。这些函数在运行时而不是在编译时链接。 (DLL 动态链接库)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-26
        • 2018-06-09
        • 2017-10-04
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多