VMProtect 3.x 保護バイナリをエミュレーションで展開する(vmp-lazy-unpack)
Unicorn 上で起動直後だけ再現し、本来コード展開とインポート解決が終わった時点で止めてメモリをダンプする。仮想化解除の前段作業用。
何を解決するか / いつ使うか
- VMProtect 3.x で保護された Windows(64-bit)実行ファイルのマルウェア解析で、実機デバッガーや稼働プロセスからのメモリ抜き出しを避けたいとき。
- 仮想化(VM)解除の前に、展開済みコードと IAT が復元されたファイルが欲しいとき。
手順の概要
- GitHub の
x86rc/vmp-lazy-unpackを pip でリポジトリから導入する(ライセンス明記なしのため利用条件は各自確認)。 - ツールが保護バイナリの起動直後を Unicorn 上でエミュレートする。VMProtect が本来コードを展開し、自前でインポートを解決して本来の実行に移る直前で停止し、その時点のメモリをファイルへ書き出す。
- エミュレーション中に呼ばれる Windows API/syscall には、ツールが同梱の Windows 11(ビルド 26200)向け一覧を使って応答する。VMProtect の「仮想マシン上での実行検知」への対処もコミット履歴で改良されている。
- 出力には記録から作り直した IAT を組み込み、識別できた API スタブは呼び出し先が分かるよう書き換え、例外テーブルも修復する。
- 既に別手段で展開済みのファイルには
--imports_onlyでインポート修復だけも可能。 - Microsoft C++ ビルドツールがあれば C 補助モジュールが入り速く、無ければ Python のみ(遅い)で動く。
- 出力は入力名に
_unpackedを付けたファイルとしてoutput/配下へ。本来コードに到達できなければ、停止理由やレジスタなどを JSON に残して終了する。
テスト済みとされる VMProtect 版は 3.4 / 3.9 / 3.10(投稿時点)。
注意点
- 仮想化解除は対象外。仮想化された部分を元命令に戻す作業は別ツール/別工程。
- 仮想化関数内から呼ばれる API は呼び出し箇所までは直さない(IAT への追加と、後段リフティング用の手がかりに留める)。
- 解析対象は悪性の可能性がある。隔離環境で実行し、ライセンス未記載のツールは組織の OSS ポリシーに照らす。