有人可以向我解释 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 上看起来情况并非如此。