直接 eval() は VM 難読化を無効にする
関数の本体(ネストされた関数を含む)のどこかに直接 eval(code) 呼び出しが含まれている場合、その関数全体とすべてのネストされた関数が VM 難読化からスキップされます。これは、直接 eval が外側の関数のローカル変数にアクセスでき、その変数は関数が VM バイトコードにコンパイルされると利用できなくなるためです。
// ❌ Entire IIFE is NOT VM-obfuscated because of direct eval inside
(function () {
function loadConfig() {
eval(decodedLoader); // direct eval - blocks VM for the whole IIFE
}
// ... all your code ...
})();
// ✅ Use indirect eval - runs in global scope, does not block VM
(function () {
function loadConfig() {
(0, eval)(decodedLoader); // indirect eval - VM obfuscates the IIFE
}
// ... all your code ...
})();
// ✅ Or unwrap the IIFE - each top-level function is checked independently
function loadConfig() {
eval(decodedLoader); // only this function is skipped
}
// ... other top-level functions are still VM-obfuscated ...
検知の対象となるのは直接 eval(eval(code) と eval?.(code))です。(0, eval)(code) や window.eval(code) のような間接的な形式はグローバルスコープで実行され、VM 難読化を妨げません。
エスケープハッチ(v6.14.0 以降): vmForceCompileDynamicCode: true を設定する(または VM セクションの Overrides グループにある Force Compile Dynamic Code スイッチを切り替える)と、周囲の関数を強制的にバイトコード化し、VMDynamicCodeSkipped を抑制できます。これが安全なのは、実行時に構築される本体が難読化ツールによってリネームされる識別子を参照し得ない場合に限られます。そうでない場合、コードは実行時に ReferenceError を投げます。トレードオフの全体像については レシピのページ を参照してください。
