x64调用另一个dll中的函数

Oha*_*esh 2 windows 64-bit assembly visual-studio-2010

有人可以在x64平台上向我解释以下行为:如果我从可执行文件调用x64中的另一个dll中的函数,反汇编的代码看起来像这样:

000000014000149E FF 15 34 CF 00 00  call  qword ptr [__imp_CFuncInDll (14000E3D8h)]
Run Code Online (Sandbox Code Playgroud)

我意识到调试器计算到该绝对地址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  
....... 
Run Code Online (Sandbox Code Playgroud)

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

000007FEFC251019 E9 62 00 00 00       jmp         CFuncInDll (7FEFC251080h)  
Run Code Online (Sandbox Code Playgroud)

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

FF 15 34 CF 00 00    call 
Run Code Online (Sandbox Code Playgroud)

是:target =下一个指令地址+ 0x0000CF34
虽然在x64上看起来并非如此.

Mic*_*urr 7

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

19 10 25 FC FE 07 00 00 
Run Code Online (Sandbox Code Playgroud)

哪个是小端四字符是:000007fe.fc251019- jmp CFuncInDll单步执行时获得的指令的地址.

基本上,对一个导入函数的调用正被组装为一个调用,通过一个地址表中的一个条目来调用跳转到实际函数实现的一个小"thunk".