VMPacker — ARM64向け関数単位の仮想化プロテクション

Security

概要

VMPackerは「ARM64 ELF Virtual Machine Protection System」を目標にした、関数単位でネイティブARM64命令を独自のVMバイトコードに変換して保護するツールです。対象バイナリから関数を抽出して命令列を解析・翻訳し、変換したバイトコードとインタプリタをELFに埋め込むことで、実行時に元の処理をVMで再現します。Goで実装されており、実行バイナリに対する自己完結型の関数保護を実現します。

GitHub

リポジトリの統計情報

  • スター数: 43
  • フォーク数: 21
  • ウォッチャー数: 43
  • コミット数: 21
  • ファイル数: 10
  • メインの言語: Go

主な特徴

  • ARM64ネイティブ命令をカスタムVMバイトコードに翻訳して関数単位で保護
  • 変換済みバイトコードとVMインタプリタをELFに埋め込む自己完結型の構成
  • Goで実装され、クロスプラットフォームでのビルドや導入が容易
  • 関数レベルの選択的保護により性能影響を最小化可能

技術的なポイント

VMPackerの核は「命令の解析→中間表現化→バイトコード生成→インタプリタ実行」というワークフローです。まず対象ELFファイルから保護対象の関数を抽出し、ARM64命令列を解析して制御フロー(基本ブロックや分岐)を把握します。その上で各アーキテクチャ命令を独自のVM命令セットへマッピングし、レジスタ状態やフラグ、メモリアクセスをVMの仮想レジスタ・スタック模型に落とし込みます。生成されたバイトコードは暗号化や圧縮を施して埋め込める設計が想定され、実行時にVMインタプリタが復号・解釈して元の処理を再現します。

技術的に注目すべき点は、ABI互換性と副作用の再現、例外・シグナル処理の扱い、及びパフォーマンス制御です。関数が外部シンボルやシステムコールに依存する場合は、VM側で呼び出しをプロキシする仕組みが必要になり、スタックレイアウトや渡し値(引数・戻り値)を正しく橋渡しする設計が求められます。また、分岐やループを含む制御フローを効率よくバイトコードに落とし込むために、基本ブロック単位のトランスレーションや最小限の最適化が有用です。さらに、検出回避(アンチデバッグ、難読化)とパフォーマンスのトレードオフが常に存在するため、性能劣化を許容しないホットパスは保護対象から外すなどの選択的適用が現実的です。本リポジトリはGoで実装されているため、ELF操作や静的解析、バイト列処理を比較的簡潔に実装でき、クロスコンパイルやCIによる自動化にも向きます。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • LICENSE: file
  • README.md: file
  • README_CN.md: file
  • cmd: dir

…他 5 ファイル

まとめ

関数単位でのARM64バイトコード仮想化による実用的な保護ツールチェーン。

リポジトリ情報:

READMEの抜粋:

🛡️ VMPacker

ARM64 ELF Virtual Machine Protection System

Translate ARM64 native instructions into custom VM bytecode for function-level code protection

🇨🇳 中文文档FeaturesArchitectureQuick StartUsage<...