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

VM がコードを変換する仕組み

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
}

この設計により、これらの関数をグローバルスコープから呼び出したり、グローバルオブジェクト上に存在することを期待したりするコードとの互換性が保たれます。関数の本体は完全に保護されますが、名前は見える状態のまま残ります。

機密性の高い関数名を隠す:

関数名がコードの機能を露呈している場合(例: validateLicensedecryptData)は、次のいずれかの方法を使用してください:

  • 方法 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: truevmBytecodeEncoding: truevmBytecodeArrayEncoding: true を有効にします。これによりルートレベルの識別子がリネームされ、バイトコード内で暗号化されます。