ドキュメント
/
VM 難読化
/

レジスタベース VM

レジスタベース VM

Pro
v7.12.0+

VM をレジスタベースの実行モデルに切り替えて、実行時を高速化し、デフォルトとは異なる VM の形にします。

vmRegisterBased オプションは、VM をデフォルトのスタックベースバイトコードからレジスタベースの実行モデルに切り替えます。場合によっては VM の実行時性能が約 15〜20 % 向上しますが、その代わり難読化後のバンドルがわずかに大きくなります。

スタックベースとレジスタベース

スタックベースの VM はオペランドを暗黙のスタックに保持します。各値はプッシュされ、次の命令に消費され、結果が再びプッシュされます。一方でレジスタベースの VM はオペランドを直接アドレス指定するため、同じ処理がより少ない命令で、その間のプッシュ/ポップのやり取りなしに表現されます。実行時の利得はここから生まれます。そして、各命令が読み書きするレジスタを(スタック上に暗黙に残すのではなく)明示しなければならなくなるため、バイトコードがわずかに大きくなる理由でもあります。

どちらのモデルも、あなたのコードが何をするか、VM が何を保護するかを変えません。これらは同じ仮想化ロジックの 2 つのエンコーディングであり、レジスタベースは単に少しのサイズを少しの速度と引き換えにするだけです。

いつ使うか

VM の実行コストが問題になるときに使ってください。 仮想化されたコードは設計上、素の JavaScript より遅いため、ホットパス — アニメーションループ、フレームごとのハンドラー、タイトなパースルーチン — では、レジスタベースの実行エンジンが節約できる ~15〜20 % は大きめのバンドルに見合います。めったに実行されないコードでは、サイズのコストは通常見合いません。

VM の形も変えます。 構造の異なるバイトコードと実行エンジンを生成するため、出力はデフォルトのスタックベース VM よりも際立ったフィンガープリントを帯びます。配布する VM を一般的なスタックベースのものにあまり似せたくない場合 — 汎用的なパターンベースの解析に認識されにくくするため — これはそれを変える 1 つの方法です。

内部での仕組み

これはネイティブなレジスタベースのコンパイラではありません。バイトコードは、オプションなしの場合とまったく同じく従来どおりスタックベースのコンパイラが生成し、その後に別の変換ステージがそのバイトコードをレジスタベースの形式へ書き換えます。実際上の帰結として、VM 難読化のそれ以外のすべて — ターゲティング、バイトコードエンコーディング、ディスパッチャーオプション — は同じように振る舞います。レジスタベースのモードはそれらすべての下流に位置するからです。

要件

  • vmObfuscation が必要です。このオプションは vmObfuscation が生成する VM を形作り直すだけです。
  • Obfuscator バージョン 7.12.0 以降

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmRegisterBased: true
});