2

アプリケーションでコードケーブ用のスペースを予約したい。VirtualAlloc関数を使用してこのスペースを予約します。Xの質問があります。

  1. コードケイブにメモリを割り当てるには、どのパラメータ(割り当てタイプと保護)を使用する必要がありますか?

  2. 戻り値として、コードケーブのアドレスを取得します。プログラムの他の部分では、そのコードケーブにJMPしたいと思います。どうやってするの?私は、JMPが現在の場所からオフセットされたアグメントヌーバーとして受け取ることを知っています(私が間違っている場合は訂正してください)。しかし、私はコードケーブにJMPしたいと思います。このオフセットを計算する方法。

ここに画像の説明を入力してください

4

3 に答える 3

6

偶然出くわした。このトピックを明確にするために、コードケーブ パッチに対する相対 JMP オフセットの計算は、現在のプログラム カウンター アドレスからパッチ アドレスを差し引くことで機能します。

uint32_t patch_address = (uint32_t) VirtualAlloc(...);
uint32_t jmp_offset = patch_address - (current_offset + current_len);

注: current_lenは、JMP 命令が必要とするバイト数です。これは、ショートジャンプ (EB) かロングジャンプ (E9) かによって異なります。あなたの例では2バイトですが、通常のJMP(E8 0x12345678)は5バイトかかります。

したがって、次の MOV および CALL 命令に属する次のバイトをオーバーライドする必要があるため、この例は簡単には機能しないことがわかります。これは、コードケーブがアドレス空間の別の領域に割り当てられているため、現在の命令オフセットまでの距離が長いという事実に依存しています。

したがって、上書きされた 7 バイトを洞窟にコピーすることができます。これは、パッチで EDI レジスタをいじらない場合にのみ機能します (「MOV ECX, EDI」のため)。また、上書きしている CALL アドレスを修正する必要があります。したがって、これはおそらく codecave を配置するのに最適な場所ではありませんが、実行可能です。

ジェネリック レジスタ引数、スタック クリーンアップ、上書きされた asm パディングを処理する独自のフック ライブラリを作成しましたが、上記のフレームワークを使用することをお勧めします。

よろしく、マイケル

于 2011-08-09T23:22:33.823 に答える
2

ジャンプ後の命令のアドレスからジャンプターゲットのアドレスを差し引くと、ジャンプオフセットが得られます。

于 2011-03-09T10:40:05.437 に答える
0

そのようなものが得られない場合は、MS Detours や N-CodeHook などのライブラリを使用してください。

于 2011-03-09T08:19:01.380 に答える