テック技報最新号へ →
セキュリティ

VMProtect 3.x 保護バイナリをエミュレーションで展開する(vmp-lazy-unpack)

Unicorn 上で起動直後だけ再現し、本来コード展開とインポート解決が終わった時点で止めてメモリをダンプする。仮想化解除の前段作業用。

@MalwareBibleJP · 2026-10-10
#malware-analysis#reverse-engineering#vmprotect#unpacking#unicorn

何を解決するか / いつ使うか

  • VMProtect 3.x で保護された Windows(64-bit)実行ファイルのマルウェア解析で、実機デバッガーや稼働プロセスからのメモリ抜き出しを避けたいとき。
  • 仮想化(VM)解除の前に、展開済みコードと IAT が復元されたファイルが欲しいとき。

手順の概要

  1. GitHub の x86rc/vmp-lazy-unpack を pip でリポジトリから導入する(ライセンス明記なしのため利用条件は各自確認)。
  2. ツールが保護バイナリの起動直後を Unicorn 上でエミュレートする。VMProtect が本来コードを展開し、自前でインポートを解決して本来の実行に移る直前で停止し、その時点のメモリをファイルへ書き出す。
  3. エミュレーション中に呼ばれる Windows API/syscall には、ツールが同梱の Windows 11(ビルド 26200)向け一覧を使って応答する。VMProtect の「仮想マシン上での実行検知」への対処もコミット履歴で改良されている。
  4. 出力には記録から作り直した IAT を組み込み、識別できた API スタブは呼び出し先が分かるよう書き換え、例外テーブルも修復する。
  5. 既に別手段で展開済みのファイルには --imports_only でインポート修復だけも可能。
  6. Microsoft C++ ビルドツールがあれば C 補助モジュールが入り速く、無ければ Python のみ(遅い)で動く。
  7. 出力は入力名に _unpacked を付けたファイルとして output/ 配下へ。本来コードに到達できなければ、停止理由やレジスタなどを JSON に残して終了する。

テスト済みとされる VMProtect 版は 3.4 / 3.9 / 3.10(投稿時点)。

注意点

  • 仮想化解除は対象外。仮想化された部分を元命令に戻す作業は別ツール/別工程。
  • 仮想化関数内から呼ばれる API は呼び出し箇所までは直さない(IAT への追加と、後段リフティング用の手がかりに留める)。
  • 解析対象は悪性の可能性がある。隔離環境で実行し、ライセンス未記載のツールは組織の OSS ポリシーに照らす。

出典

X の元の投稿を開く