VM がコードを変換する仕組み
vmTargetFunctionsMode: 'root'(デフォルト)では、VM 難読化は各ルートレベル関数の本体をバイトコードに変換しますが(vmObfuscationThreshold に依存)、関数名は変更しません。
// Input
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// Output - function NAME is preserved, BODY is VM-transformed
function fibonacci(b) { // name kept as-is
return vm.call(...); // body converted to bytecode
}
この設計により、これらの関数をグローバルスコープから呼び出したり、グローバルオブジェクト上に存在することを期待したりするコードとの互換性が保たれます。関数の本体は完全に保護されますが、名前は見える状態のまま残ります。
機密性の高い関数名を隠す:
関数名がコードの機能を露呈している場合(例: validateLicense、decryptData)は、次のいずれかの方法を使用してください:
方法 1: IIFE でラップする(推奨)
機密性の高い関数を IIFE またはその他の関数本体の中に配置します。他の関数の内部にある関数はルートレベルではないため、名前を含めて完全に VM 変換されます。
// Wrap sensitive code in IIFE (function() { function fibonacci(n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } // Use fibonacci here... })(); // "fibonacci" name is completely hidden in output方法 2: グローバルのリネーム + エンコード(要注意)
renameGlobals: true、vmBytecodeEncoding: true、vmBytecodeArrayEncoding: trueを有効にします。これによりルートレベルの識別子がリネームされ、バイトコード内で暗号化されます。
