2

誰かが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では、そうではないように見えます。

4

2 に答える 2

7

call qword ptr [__imp_CFuncInDll (14000E3D8h)]ポインタによる間接呼び出しです。ポインターのアドレスは 0x14000E3D8 です。無意味な逆アセンブリのコード バイトを見ると、次のものが含まれていることがわかります。

19 10 25 FC FE 07 00 00 

リトルエンディアンのクワッドワードは次のとおりです。 -シングルステップで到達する命令000007fe.fc251019のアドレス。jmp CFuncInDll

基本的に、インポート関数の呼び出しは、実際の関数の実装にジャンプする小さな「サンク」へのアドレス テーブルのエントリを介した呼び出しとしてアセンブルされます。

于 2012-07-11T05:40:30.150 に答える
2

コードではなく、コードへのポインターを逆アセンブルしようとしています。

この指示

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

後続の命令の先頭に相対的なアドレスからポインターを読み取ります。つまり、14000149EH、6 (このcall命令の長さ)、および 0CF34H を加算し、アドレス 14000E3D8H に到達し、そこから 8 バイトを読み取り、それ (それら8 バイト: 19H、10H、25H、0FCH、0FEH、7H、0、0) は、これがcall制御を転送するアドレス 7FEFC251019H です。

アドレス 7FEFC251019H で逆アセンブルする必要があります。

于 2012-07-11T05:42:54.837 に答える