2013-10-30 14 views
6

まず、dllを注入したくありません。 WriteProcessMemory()を使ってコードを注入したい(これが可能な場合でも)。私はすでにReadProcessMemory()を使用していましたので、書き込みは大したことではないと思います。
まあ、TargetProgram.exe + D78C612
での関数があるとしましょうとのは、それがこのように呼ばれることができましょう:C++:関数を呼び出すためのコードインジェクション

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

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

答えて

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 
+0

私はOPと同様の問題がありますが、私はあなたの1st WriteProcessMemory呼び出しを取得しません。 local_addressとして私は自分の関数のアドレスを渡すことができますが、次の引数でその長さを渡すことはできません。単にコンパイラがそれをまだコンパイルしていないので、それがどれだけ大きいかわからないからです。 WriteProcessMemoryはプロセスから関数/コードを書くのに適していますか?編集:またはC + +の代わりにアセンブラの唯一のキー書き込み関数(私はそれを数えることができます)ですか? – Kra

+2

@Kraほとんどの場合、ジャンプ先アドレスが壊れるので、C関数を別のプロセスにコピーすることはできません。再配置を修正するか、再配置可能なコードを作成する必要があります。いずれの場合も、アセンブリ言語を使用する必要があります。関数コードの長さに関する質問に答えるために、最適化を無効にしてf1()とf2()の2つの関数を書くことができます。次に、f2のアドレスからf1のアドレスを減算し、f1の長さを得ることができます。しかし、関数のサイズはここではあなたの問題の中で最小です。 – Max

+0

ポイントを得ました。ありがとう。 – Kra

1

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

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

ただし、ここで達成しようとしていることを正確に把握していないと、新しいターゲットコードを実行するための手法をお勧めできません。新しいコードがあれば、CreateRemoteThreadを使ってリモートスレッドを挿入すれば、既存のスレッドを中断することなく実行することができます。これは新しいコードを実行する最も簡単なソリューションですが、呼び出すコードはスレッドセーフである必要があります。既に実行中のスレッドを選んだり、一時停止したり、EIPを修正したり、迂回路を導入したり、副作用なしに再開したりすることは非常に難しいです。

個人的なメモ:Visual Studio 2012のコードカバレッジツールの作成者は、サードパーティのx86/x86-64コードをオンザフライで書き直してカバレッジデータを収集していますが、これはああそうです - ハックして考えることに多大な楽しみ:

関連する問題