CreateProcess を使用してメモリ内 EXE を実行する
概要:
からプロセスを作成するCreateProcess のメモリ バッファには独特の課題があります。この記事では、実行前に実行可能ファイルをファイルに書き込む必要をなくし、これを可能にする方法について説明します。
背景:
ゲーム業界では、暗号化されていない実行可能ファイルを配布すると、DRM の回避につながる可能性があります。この懸念に対処するために、ゲーム開発者は暗号化された EXE を配布者に送信し、配布者はそれをプレイヤーにリリースする前に独自の DRM でラップします。
パッチ適用ソリューションの作成:
EXE でクラッシュが発生すると、DRM チャネルを通じてパッチを配布するのに数日から数週間かかる場合があります。パッチ適用プロセスを迅速化するために、開発者は暗号化されたデータファイル内に元の EXE を埋め込むことができます。これにより、DRM に影響を与えることなく簡単にパッチを適用できます。
実装:
この解決策には、CREATE_SUSPENDED を指定した CreateProcess を使用して、メモリ内 EXE からプロセスを作成することが含まれます。 フラグ。このフラグにより、実行前に中断されたプロセスを変更する時間が与えられます。
プロセス情報の取得:
中断されたプロセスのスレッド コンテキストを取得することで、プロセス環境にアクセスできます。ブロック(PBE)構造。 PBE にはイメージのベース アドレスが含まれており、これはその後の操作に重要です。
メモリ内 EXE のロード:
ベース アドレスを取得したら、 WriteProcessMemory を使用して、中断されたプロセスのメモリ空間にインメモリ EXE をロードできます。ただし、サイズとアライメントの違いに応じて、アライメントを調整したり、追加のメモリを割り当てる必要がある場合があります。
パッチ適用と実行:
プロセスを完了するには、ベースにパッチを適用します。メモリ内 EXE のアドレスを一時停止されたプロセスの PBE に追加し、新しいエントリ ポイントでスレッド コンテキストを更新します。最後に、ResumeThread を使用して、メモリ内の EXE から変更されたプロセスの実行を再開します。
以上がCreateProcess を使用してインメモリ EXE を実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。