3

GDB を使用して Mac OS X 64 ビット アプリをデバッグしています。コードのチャンクをジャンプすると、すべての問題が解決することがわかります。

しかし:

実行可能ファイルにパッチを適用してジャンプを実装するにはどうすればよいですか? デバッガーを使用せずに、アプリがコード内の定義されたポイントに自動的にジャンプするようにします。

これは私がやりたいことです:

0x1000027a9(デバッガーによって指定された) アドレスで、 address にジャンプします0x100003b6e。私は HexEdit を介してそれを行うために一生懸命努力していますが、成功していません。私は絶対アドレスのオペコードへのjmpについてどこでも読みましFFた(正しいオペコードのようですが、ジャンプではなく呼び出しです...)が、何も機能しません。アクセス不良、セグメンテーション。

どうやってやるの?

4

1 に答える 1

5

あなたが望むのは ではなくcalljmpあり、あなたは直接 を望んでいますjmp。直接ジャンプは通常、次の命令のアドレスに相対的なアドレス指定を使用します ( SO の質問に対する私の回答を参照してください: How encode a relative short jmp in x86 )。ジャンプ命令の最後に相対することは、それを見る別の方法です。

それで、あなたは0x1000027a9にいて にジャンプしたいと思ってい0x100003b6eます。

0x100003b6e- 0x1000027a9= 0x000013C5=5061dであるため、短いジャンプには絶対に収まりません ( rel8Intel のドキュメントで) が、必要jmp rel32です。これも適合しrel16ますが、x86-64 (64 ビット モード) ではサポートされていません。

だから、あなたが欲しいですjmp rel32これは、 の次の命令に対して相対的にjmpエンコードされ、命令の長さが 5 バイトであるため ( E9 xx xx xx xx)、rel32になります0x000013C0。x86 はリトルエンディアン アーキテクチャであるため、 としてエンコードされE9 C0 13 00 00ます。

これを確認するために、NASM で小さなテスト実行可能ファイルをアセンブルし、ndisasm で逆アセンブルしました (最初の0x10000000バイトを省略しましたが、ジャンプは相対的であるため、エンコーディングは何も変更されません)。

000027A8  90                nop
000027A9  E9C0130000        jmp dword 0x3b6e ; this is the instruction you need.
000027AE  90                nop
于 2013-02-17T14:59:25.160 に答える