windows - x64 调用另一个 dll 中的函数

标签 windows visual-studio-2010 assembly 64-bit

有人可以向我解释 x64 平台上的以下行为吗: 如果我从我的可执行文件调用 x64 中另一个 dll 中的函数,则反汇编代码如下所示:

000000014000149E FF 15 34 CF 00 00  call  qword ptr [__imp_CFuncInDll (14000E3D8h)]

我意识到调试器计算的是这个绝对地址 14000E3C0h 的相对地址。然而,与 x86 代码不同,如果我反汇编地址 14000E3D8h,它看起来像垃圾:

__imp_CFuncInDll:
000000014000E3D8 19 10                sbb         dword ptr [rax],edx  
000000014000E3DA 25 FC FE 07 00       and         eax,7FEFCh  
000000014000E3DF 00 14 10             add         byte ptr [rax+rdx],dl  
000000014000E3E2 25 FC FE 07 00       and         eax,7FEFCh  
000000014000E3E7 00 00                add         byte ptr [rax],al  
....... 

当我进入调用时,我可以看到代码没有进入垃圾地址,而是跳转到了有效地址:

000007FEFC251019 E9 62 00 00 00       jmp         CFuncInDll (7FEFC251080h)  

我的问题:
当目标位于另一个模块中时,如何在 x64 上解码调用指令? 在 x86 中此代码的调用目标:

FF 15 34 CF 00 00    call 

是:目标=下一条指令地址+0x0000CF34
在 x64 上,情况似乎并非如此。

最佳答案

call qword ptr [__imp_CFuncInDll (14000E3D8h)]是通过指针的间接调用。指针的地址是 0x14000E3D8。如果您查看无意义反汇编的代码字节,它们会包含以下内容:

19 10 25 FC FE 07 00 00 

小端四字是:000007fe.fc251019 - 单步执行时到达的 jmp CFuncInDll 指令的地址。

基本上,对导入函数的调用被组装为通过地址表中的条目调用跳转到实际函数实现的小“thunk”。

关于windows - x64 调用另一个 dll 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11426124/

相关文章:

c - 学校编程类问题(Visual Studio)

c# - 无法使用C#连接到其他机器的mysql服务器?

java - 验证错误: Stack size too large (what does it mean?)

c - 为什么编译器将 RDI 复制到另一个寄存器,然后在循环内将其复制回 RDI?

python - 试图模拟恒定字节率。混淆 time.sleep 结果

windows - 更换开始菜单

windows - echo 命令不适用于 Windows 10 中的 PowerShell

c# - web.config 转换元素无法通过 System.Configuration.ConfigurationManager 使用

visual-studio-2010 - Visual Studio 2010 中的 openCV 2.2 createButton LNK 2019 错误

assembly - 如何将拇指条件指令放入 IT block