6

まず、dll を注入したくありません。WriteProcessMemory() を使用してコードを挿入したい (これが可能であれば)。私はすでに ReadProcessMemory() を使用しているので、書くことは大したことではないと思います。
たとえば、TargetProgram.exe+D78C612 に関数があり、次
のように呼び出すことができるとします。

push eax
push [esp+08]
push edx
push 00
push TargetProgram.exe+AF76235
push 04
call TargetProgram.exe+D78C612

これを WriteProcessMemory() でどのように正確に達成できますか?
つまり、重要なものを上書きせずにコードを挿入できるセクションはどこにあるのでしょうか。そして最も重要なのは、関数をどのように呼び出すかということです。
アクティブなルーチンにコードへのジャンプを配置し、ジャンプして後で削除するだけですか? しかし、どのようにルーチンを見つけるのでしょうか?
質問が多すぎて、どうやって始めればよいかわかりません... 助けていただければ幸いです。:)
そして、時間があれば、関数呼び出しインジェクションのサンプルコードを見たいです。

4

2 に答える 2

4

を使用VirtualAllocExして、リモート プロセスにメモリを割り当て、手順をこのメモリにコピーできます。

注入を行う手順は次のとおりです。

SuspendThread(hThread); // Suspend the remote thread
remote_address = VirtualAllocEx(hProcess, ...) // allocate memory for your code
WriteProcessMemory(hProcess, remote_address, local_address, length, NULL)  // copy your code to remote process
WriteProcessMemory(hProcess, remote_fixup, ...) // insert a jump to your code 
ResumeThread(hThread); // Resume the remote thread
于 2013-10-30T20:32:41.623 に答える
1

Max の回答で述べたように、問題のプロセスに対するPROCESS_VM_OPERATIONアクセス権があると仮定すると、 VirtualAllocExはリモート プロセスにメモリ ページを割り当てる 1 つの方法です。また、書き込み中に新しいページが保護レベルのためにPAGE_EXECUTE_READWRITEとしてマークされていることを確認し、後でVirtualProtectExを使用するように変更する必要があります。PAGE_EXECUTE_READ

x86 での分岐と一部の呼び出し命令は IP 相対であることに注意してください。これは、命令の末尾からの符号付き相対変位を使用するため、エンコーディングがメモリ内の場所に依存することを意味します。したがって、新しいコードから既存の関数を呼び出す予定がある場合は、相対呼び出し命令を使用するか、代わりに間接/即時形式を使用するときにこれを考慮してください。

ただし、ここで何を達成しようとしているのかを正確に把握していないと、新しいターゲット コードを実行するための手法を推奨することは困難です。新しいコードを配置すると、既存のスレッドを中断することなく、CreateRemoteThreadを使用してリモート スレッドを挿入するだけで実行できます。これは、新しいコードを実行するための最も簡単なソリューションですが、呼び出すコードがスレッドセーフである必要があります。すでに実行中のスレッドを選択し、一時停止し、EIP を変更するか迂回路を導入し、副作用なしで再開する (注入された呼び出し全体でコンテキストを適切に保存する) ことは、控えめに言っても非常にトリッキーです。

個人的なメモ: Visual Studio 2012 のコード カバレッジ ツールの作成者として、一連のトリックを使用してサード パーティの x86/x86-64 コードをオンザフライで書き換えてカバレッジ データを収集します。ハックして考えてみてください:)

于 2013-10-30T21:32:11.950 に答える