6

コードケーブが配置されているアドレスをVirtualAllocEx(アドレスを返す)を使用して割り当て、を使用してそのアドレスにコードを書き込んだとしますWriteProcessMemory()

ここに質問があります:

コードケーブへのジャンプを作成するにはどうすればよいですか?ジャンプが「」で始まることは知ってE9いますが、返されるアドレスVirtualAllocExを正しいUInt32(dword)に変換して、デバッガー/コンパイラーが命令を理解できるようにするにはどうすればよいですか?

例えば:

私は住所00402020(ネイティブアプリのOEP)にいます。004028CF(空の場所)" "へのジャンプを書きJMP 004028CFます。バイト単位の命令は次のようになります。

CPU Disasm
Address   Hex dump      Command                                  Comments
00402020  E9 AA080000   JMP 004028CF

E9」は、JMPを示す方法です。「AA080000」はどうですか、これを生成するにはどうすればよいですか?

JMPをコードケーブに初期化できるように、同様のことを行う必要があります。コードケーブは、によって返されるアドレスにありますVirtualAllocEx()

どんな助けでもありがたいです!

前もって感謝します。

4

2 に答える 2

4

E9は相対ジャンプであるため、後の32ビットは現在の命令ポインタへのオフセットにすぎません。詳細については、インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアル第2A巻:命令セットリファレンス、AMページ549ffを参照してください。詳細については、インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルを参照してください。

したがって、00402020から004028CFにジャンプするオペコードは次のようになります。

    E9 00 00 08 AA
Offset   = DestinationAddress - CurrentInstructionPointer
000008AA = 004028CF           - 00402025

ジャンプ命令を実行すると、命令ポインタはすでに次の命令に設定されています。したがって、ジャンプ命令のオフセットと現在の命令ポインタ値は5だけ異なります。

CurrentInstructionPointer = AddressOfJumpInstruction + 5

アップデート

現在の命令ポインタ値に関するエラーを修正しました。ありがとうjn。

于 2009-04-24T18:35:06.433 に答える
1

相対オフセットを取得するには、アドレスを減算するだけです。

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

注:current_lenは、x86E9JMP命令では5バイトです。詳細については、このスレッドの私の投稿を参照してください。

VirtualAlloc C ++、挿入されたdll、asm

于 2011-08-10T09:29:27.293 に答える