
VTILを搭載した動的VMPダンパーおよびインポートフィクサー。

VTILを利用した動的VMPダンパーおよびインポートフィクサーです。VMProtect 3.X x64に対応しています。

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
引数:
<Target PID>: ターゲットプロセスのID(10進数または16進数)<Target Module>: ダンプして修正するモジュールの名前。プロセスイメージモジュールを指定する場合は空文字列("")を使用可能。[-ep=<Entry Point RVA>]: オプションで指定するエントリポイントRVA(16進数)。VMPDumpはこの値でオプションヘッダのエントリポイントを上書きします。[-disable-reloc]: 出力イメージでリロケーションが削除されたことをマークするようVMPDumpに指示するオプション設定。これにより、ダンプされたImageBaseにイメージが強制的にロードされます。実行可能なダンプが必要な場合に便利です。VMProtectの初期化とアンパックは、VMPDumpを実行する前にターゲットプロセスで完了している必要があります。つまり、OEP(オリジナルエントリポイント)以降に達している必要があります。
ダンプされ修正されたイメージは、プロセスイメージモジュールディレクトリに <Target Module Name>.VMPDump.<Target Module Extension> という名前で作成されます。
VMProtectはすべてのインポートコールやjmpに対してスタブを注入します。これらのスタブは .vmpX セクション内の「難読化された」サンクを解決し、固定定数を加算して「復号化」します。コールやジャンプ自体はその後、ret命令でディスパッチされます。
VMPDumpはすべての実行可能セクションをスキャンしてこれらのスタブを探し、VTIL x64リフターを使用してVTILにリフトします。その後、これらのスタブに対して解析を実行し、どの種類のコールを置き換えるべきか、どのバイトを上書きすべきかを決定します。
すべてのコールが取得されると、VMPDumpは新しいインポートテーブルを作成し、既存のIATにサンクを追加します。VMPインポートスタブへのコールは、これらのサンクへの直接コールに置き換えられます。
変異されたルーチンでは、VMPインポートスタブコールを直接サンクコールに置き換えるのに十分なバイト数がない場合があることに注意してください(後者は1バイト大きいため)。そのような場合、セクションが拡張され、インポートサンクにジャンプするスタブが注入されます。そして、VMPインポートスタブコールは、その注入されたスタブへの5バイトの相対コールまたはjmpに置き換えられます。
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
VSでのビルドは、vcxproj内のインクルード/ライブラリディレクトリをVTIL-NativeLifers/VTIL-Core/Keystone/Capstoneに置き換えるだけです。
プロジェクトにはC++20が必要です。
コードセクションが線形にスキャンされるため、特に高度に変異され難読化されたコードでは、一部のインポートスタブコールがスキップされ、解決されない可能性があります。ただし、VMPDumpはVMProtectの変異の不整合の大部分に対する回避策を含んでいるため、高度に変異されたコードでも良好な結果を生成できるはずです。
この問題に遭遇した場合は、関連情報とともにIssueを作成してください。確認いたします。
GPL-3.0ライセンスの下で提供されています。いかなる種類の保証も提供されません。