CreateProcess を使用したメモリ バッファからの EXE の実行
CreateProcess 関数は、通常、ファイルに保存されている実行可能ファイル (EXE) を起動するために使用されます。 。しかし、EXE をファイルに書き込まずにメモリ バッファから直接実行することは可能でしょうか?この質問は、DRM を無効にせずにラップされた EXE を更新する必要があるゲームのパッチ適用などのシナリオで発生します。
解決策:
はい、次の手順で CreateProcess を使用してメモリ バッファから EXE を実行します。
-
プロセス作成の一時停止: CREATE_SUSPENDED フラグを指定して CreateProcess を呼び出し、プロセスを一時停止します。これにより、プロセス メモリを変更する時間が与えられます。
-
Get Process Context: GetThreadContext を使用して、中断されたスレッドのコンテキストを取得します。 EBX レジスタには、プロセス環境ブロック (PEB) 構造体へのポインターが含まれています。
-
ベース アドレスの決定: PEB 構造体の [EBX 8] からプロセスのベース アドレスを取得します。
-
メモリ内 EXE のコピー: ベース アドレスとイメージ サイズが一致する場合、WriteProcessMemory を使用して、メモリ内 EXE を中断されたプロセスのメモリ領域に書き込みます。
-
不一致条件の調整: 条件不一致の場合は、ZwUnmapViewOfSection を使用して元のイメージのマップを解除し、VirtualAllocEx を使用してメモリを割り当て、メモリ内 EXE を書き込み、PEB->ImageBaseAddress にパッチを適用します。
-
Set Entry Point: スレッド コンテキストの EntryPoint アドレスをメモリ内 EXE のエントリ ポイントに書き換えます。
-
Resume Process: 最後に、次を使用して中断されたプロセスを再開します。 ResumeThread.
これらの手順に従うと、EXE をファイルに書き込むことなくメモリ バッファから効果的に実行でき、DRM ラッパーを中断せずにパッチを配布するという要件を満たすことができます。
以上がCreateProcessを使用してメモリバッファからEXEを実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。