Seçenekler Referansı

İçindekiler

compact

config

controlFlowFlattening

controlFlowFlatteningThreshold

deadCodeInjection

deadCodeInjectionThreshold

debugProtection

debugProtectionInterval

disableConsoleOutput

domainLock

Birden çok alan adı ve alt alan adı

domainLockRedirectUrl

exclude

forceTransformStrings

identifierNamesCache

Node.js API

CLI

identifierNamesGenerator

identifiersDictionary

identifiersPrefix

randomIdentifiersPrefix

ignoreImports

inputFileName

log

numbersToExpressions

optionsPreset

parseHtml

renameGlobals

renameProperties

renamePropertiesMode

reservedNames

reservedStrings

seed

selfDefending

simplify

sourceMap

sourceMapBaseUrl

sourceMapFileName

sourceMapMode

sourceMapSourcesMode

splitStrings

splitStringsChunkLength

stringArray

stringArrayCallsTransform

stringArrayCallsTransformThreshold

stringArrayEncoding

stringArrayIndexesType

stringArrayIndexShift

stringArrayRotate

stringArrayShuffle

stringArrayWrappersCount

stringArrayWrappersChainedCalls

stringArrayWrappersParametersMaxCount

stringArrayWrappersType

stringArrayThreshold

strictMode

target

transformObjectKeys

warnings

vmObfuscation

vmTargetFunctions

vmExcludeFunctions

vmTargetFunctionsMode

vmForceCompileDynamicCode

vmWrapTopLevelInitializers

vmDynamicOpcodes

vmBytecodeEncoding

vmBytecodeArrayEncoding

vmBytecodeArrayEncodingKey

vmBytecodeArrayEncodingKeyGetter

vmAsyncExecutor

vmJumpsEncoding

vmMacroOps

vmDebugProtection

vmSelfDefending

vmDefenseHook

vmDefenseReaction

vmStatefulOpcodes

vmCallContextOpcodes

vmStackEncoding

vmCompactDispatcher

vmStringArrayBytecodeOnly

vmDomainLock

Birden çok alan adı ve alt alan adı

vmDomainLockRedirectUrl

Preset Options

Yüksek obfuscation, düşük performans

Orta obfuscation, optimal performans

Düşük obfuscation, Yüksek performans

Varsayılan hazır ayar, Yüksek performans

VM Ultra High obfuscation (Maksimum Güvenlik)

VM Anti-LLM (Yapay Zeka Ajanı Koruması)

VM High obfuscation (En Yüksek Güvenlik)

VM Medium obfuscation (Dengeli Güvenlik)

VM Low obfuscation (Temel Güvenlik, Daha İyi Performans)

VM Default (VM + String Array Koruması)

compact

Type: boolean Default: true

Kod çıktısını tek satırda sıkıştırır.

config

Type: string Default: ``

Obfuscator seçeneklerini içeren JS/JSON yapılandırma dosyasının adı. Bunlar, doğrudan CLI'ya geçirilen seçenekler tarafından geçersiz kılınır

controlFlowFlattening

Type: boolean Default: false

⚠️ Bu seçenek performansı büyük ölçüde etkiler ve çalışma zamanı hızını 1,5 kata kadar yavaşlatabilir. Kontrol akışı düzleştirmeden etkilenecek düğümlerin yüzdesini ayarlamak için controlFlowFlatteningThreshold seçeneğini kullanın.

Kodun kontrol akışı düzleştirmesini etkinleştirir. Kontrol akışı düzleştirme, program anlaşılırlığını zorlaştıran, kaynak kodun yapısal bir dönüşümüdür.

Örnek:

// input
(function(){
    function foo () {
        return function () {
            var sum = 1 + 2;
            console.log(1);
            console.log(2);
            console.log(3);
            console.log(4);
            console.log(5);
            console.log(6);
        }
    }
    
    foo()();
})();

// output
(function () {
    function _0x3bfc5c() {
        return function () {
            var _0x3260a5 = {
                'WtABe': '4|0|6|5|3|2|1',
                'GokKo': function _0xf87260(_0x427a8e, _0x43354c) {
                    return _0x427a8e + _0x43354c;
                }
            };
            var _0x1ad4d6 = _0x3260a5['WtABe']['split']('|'), _0x1a7b12 = 0x0;
            while (!![]) {
                switch (_0x1ad4d6[_0x1a7b12++]) {
                case '0':
                    console['log'](0x1);
                    continue;
                case '1':
                    console['log'](0x6);
                    continue;
                case '2':
                    console['log'](0x5);
                    continue;
                case '3':
                    console['log'](0x4);
                    continue;
                case '4':
                    var _0x1f2f2f = _0x3260a5['GokKo'](0x1, 0x2);
                    continue;
                case '5':
                    console['log'](0x3);
                    continue;
                case '6':
                    console['log'](0x2);
                    continue;
                }
                break;
            }
        };
    }

	_0x3bfc5c()();
}());

controlFlowFlatteningThreshold

Type: number Default: 0.75 Min: 0 Max: 1

controlFlowFlattening dönüşümünün belirli bir düğüme uygulanma olasılığı.

Bu ayar, özellikle büyük kod boyutları için kullanışlıdır çünkü çok sayıda kontrol akışı dönüşümü kodunuzu yavaşlatabilir ve kod boyutunu artırabilir.

controlFlowFlatteningThreshold: 0, controlFlowFlattening: false ile aynıdır.

deadCodeInjection

Type: boolean Default: false

⚠️ Obfuscate edilmiş kodun boyutunu ciddi biçimde artırır (%200'e kadar); yalnızca obfuscate edilmiş kodun boyutu önemli değilse kullanın. Ölü kod enjeksiyonundan etkilenecek düğümlerin yüzdesini ayarlamak için deadCodeInjectionThreshold seçeneğini kullanın.
⚠️ Bu seçenek stringArray seçeneğini zorla etkinleştirir.
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır.

Bu seçenekle, obfuscate edilmiş koda rastgele ölü kod blokları eklenir.

Örnek:

// input
(function(){
    if (true) {
        var foo = function () {
            console.log('abc');
        };
        var bar = function () {
            console.log('def');
        };
        var baz = function () {
            console.log('ghi');
        };
        var bark = function () {
            console.log('jkl');
        };
        var hawk = function () {
            console.log('mno');
        };

        foo();
        bar();
        baz();
        bark();
        hawk();
    }
})();

// output
var _0x37b8 = [
    'YBCtz',
    'GlrkA',
    'urPbb',
    'abc',
    'NMIhC',
    'yZgAj',
    'zrAId',
    'EtyJA',
    'log',
    'mno',
    'jkl',
    'def',
    'Quzya',
    'IWbBa',
    'ghi'
];
function _0x43a7(_0x12cf56, _0x587376) {
    _0x43a7 = function (_0x2f87a8, _0x47eac2) {
        _0x2f87a8 = _0x2f87a8 - (0x16a7 * 0x1 + 0x5 * 0x151 + -0x1c92);
        var _0x341e03 = _0x37b8[_0x2f87a8];
        return _0x341e03;
    };
    return _0x43a7(_0x12cf56, _0x587376);
}
(function () {
    if (!![]) {
        var _0xbbe28f = function () {
            var _0x2fc85f = _0x43a7;
            if (_0x2fc85f(0xaf) === _0x2fc85f(0xae)) {
                _0x1dd94f[_0x2fc85f(0xb2)](_0x2fc85f(0xb5));
            } else {
                console[_0x2fc85f(0xb2)](_0x2fc85f(0xad));
            }
        };
        var _0x5e46bc = function () {
            var _0x15b472 = _0x43a7;
            if (_0x15b472(0xb6) !== _0x15b472(0xaa)) {
                console[_0x15b472(0xb2)](_0x15b472(0xb5));
            } else {
                _0x47eac2[_0x15b472(0xb2)](_0x15b472(0xad));
            }
        };
        var _0x3669e8 = function () {
            var _0x47a442 = _0x43a7;
            if (_0x47a442(0xb7) !== _0x47a442(0xb0)) {
                console[_0x47a442(0xb2)](_0x47a442(0xb8));
            } else {
                _0x24e0bf[_0x47a442(0xb2)](_0x47a442(0xb3));
            }
        };
        var _0x28b05a = function () {
            var _0x497902 = _0x43a7;
            if (_0x497902(0xb1) === _0x497902(0xb1)) {
                console[_0x497902(0xb2)](_0x497902(0xb4));
            } else {
                _0x59c9c6[_0x497902(0xb2)](_0x497902(0xb4));
            }
        };
        var _0x402a54 = function () {
            var _0x1906b7 = _0x43a7;
            if (_0x1906b7(0xab) === _0x1906b7(0xac)) {
                _0xb89cd0[_0x1906b7(0xb2)](_0x1906b7(0xb8));
            } else {
                console[_0x1906b7(0xb2)](_0x1906b7(0xb3));
            }
        };
        _0xbbe28f();
        _0x5e46bc();
        _0x3669e8();
        _0x28b05a();
        _0x402a54();
    }
}());

deadCodeInjectionThreshold

Type: number Default: 0.4 Min: 0 Max: 1

deadCodeInjection seçeneğinden etkilenecek düğümlerin yüzdesini ayarlamaya olanak tanır.

debugProtection

Type: boolean Default: false

⚠️ Geliştirici Araçları'nı açarsanız tarayıcınızı dondurabilir.
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır. Bunun yerine vmDebugProtection seçeneğini kullanın.

Bu seçenek, Geliştirici Araçları'nın debugger işlevini kullanmayı neredeyse imkânsız hale getirir (hem WebKit tabanlı tarayıcılarda hem de Mozilla Firefox'ta).

debugProtectionInterval

Type: number Default: 0

⚠️ Tarayıcınızı dondurabilir! Kendi sorumluluğunuzda kullanın.
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır. Bunun yerine vmDebugProtection seçeneğini kullanın.

Ayarlanırsa, milisaniye cinsinden bir aralık kullanılarak Konsol sekmesinde hata ayıklama modu zorlanır ve Geliştirici Araçları'nın diğer özelliklerini kullanmak zorlaşır. debugProtection etkinse çalışır. Önerilen değer 2000 ile 4000 milisaniye arasındadır.

disableConsoleOutput

Type: boolean Default: false

⚠️ Bu seçenek, tüm betikler için console çağrılarını genel olarak devre dışı bırakır

console.log, console.info, console.error, console.warn, console.debug, console.exception ve console.trace çağrılarını boş fonksiyonlarla değiştirerek kullanımlarını devre dışı bırakır. Bu, hata ayıklayıcının kullanımını zorlaştırır.

domainLock

Type: string[] Default: []

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Obfuscate edilmiş kaynak kodun yalnızca belirli alan adlarında ve/veya alt alan adlarında çalıştırılmasına olanak tanır. Bu, birinin kaynak kodunuzu kopyalayıp başka bir yerde çalıştırmasını gerçekten zorlaştırır.

Kaynak kod bu seçenekle belirtilen alan adlarında çalıştırılmazsa, tarayıcı domainLockRedirectUrl seçeneğine geçirilen URL'ye yönlendirilir.

Birden çok alan adı ve alt alan adı

Kodunuzu birden fazla alan adına veya alt alan adına kilitlemek mümkündür. Örneğin, kodun yalnızca www.example.com üzerinde çalışacak şekilde kilitlemek için www.example.com ekleyin. Kök alan adında ve tüm alt alan adları dahil (example.com, sub.example.com) çalışmasını sağlamak için .example.com kullanın.

domainLockRedirectUrl

Type: string Default: about:blank

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Kaynak kod domainLock ile belirtilen alan adlarında çalıştırılmazsa, tarayıcının geçirilen bir URL'ye yönlendirilmesine olanak tanır

exclude

Type: string[] Default: []

Obfuscation'dan hariç tutulacak dosyaları belirten dosya adları veya glob desenleri.

forceTransformStrings

Type: string[] Default: []

Geçirilen RegExp desenleriyle eşleşen string değişmezlerinin zorla dönüştürülmesini etkinleştirir.

⚠️ Bu seçenek yalnızca stringArrayThreshold (veya gelecekte olası diğer eşikler) tarafından dönüştürülmemesi gereken stringleri etkiler

Seçenek, reservedStrings seçeneğine göre önceliklidir ancak conditional comments (koşullu yorumlar) karşısında öncelikli değildir.

Örnek:

	{
		forceTransformStrings: [
			'some-important-value',
			'some-string_\d'
		]
	}

identifierNamesCache

Type: Object | null Default: null

Bu seçeneğin temel amacı, birden çok kaynağın/dosyanın obfuscation'ı sırasında aynı tanımlayıcı adlarını kullanabilmektir.

Şu anda iki tür tanımlayıcı desteklenir:

  • Global tanımlayıcılar:
    • Tüm global tanımlayıcılar önbelleğe yazılır;
    • Eşleşen tüm bildirilmemiş global tanımlayıcılar önbellekteki değerlerle değiştirilir.
  • Özellik tanımlayıcıları, yalnızca renameProperties seçeneği etkinleştirildiğinde:
    • Tüm özellik tanımlayıcıları önbelleğe yazılır;
    • Eşleşen tüm özellik tanımlayıcıları önbellekteki değerlerle değiştirilir.

Node.js API

null değeri geçirilirse önbellek tamamen devre dışı bırakılır.

Boş bir nesne ({}) geçirilirse, tanımlayıcı adlarının önbellek nesnesine (TIdentifierNamesCache türü) yazılması etkinleştirilir. Bu önbellek nesnesine, ObfuscationResult nesnesinin getIdentifierNamesCache metot çağrısı aracılığıyla erişilir.

Ortaya çıkan önbellek nesnesi, sonraki kaynakların eşleşen tüm tanımlayıcı adlarının obfuscation'ı sırasında bu adları kullanmak için identifierNamesGenerator seçeneği değeri olarak kullanılabilir.

Örnek:

const source1ObfuscationResult = JavaScriptObfuscator.obfuscate(
    `
        function foo(arg) {
           console.log(arg)
        }
        
        function bar() {
            var bark = 2;
        }
    `,
    {
        compact: false,
        identifierNamesCache: {},
        renameGlobals: true
    }
)

console.log(source1ObfuscationResult.getIdentifierNamesCache());
/*
    { 
        globalIdentifiers: {
            foo: '_0x5de86d',
            bar: '_0x2a943b'
        }
    }
*/



const source2ObfuscationResult = JavaScriptObfuscator.obfuscate(
    `
        // Expecting that these global functions are defined in another obfuscated file
        foo(1);
        bar();
        
        // Expecting that this global function is defined in third-party package
        baz();
    `,
    {
        compact: false,
        identifierNamesCache: source1ObfuscationResult.getIdentifierNamesCache(),
        renameGlobals: true
    }
)

console.log(source2ObfuscationResult.getObfuscatedCode());
/*
    _0x5de86d(0x1);
    _0x2a943b();
    baz();
 */

CLI

CLI'da, tanımlayıcı adları önbelleğini okumak ve yazmak için kullanılacak mevcut bir .json dosyasına yol tanımlamaya olanak tanıyan farklı bir --identifier-names-cache-path seçeneği bulunur.

Boş bir dosyaya yol geçirilirse - tanımlayıcı adları önbelleği o dosyaya yazılır.

Mevcut önbelleği içeren bu dosya, sonraki dosyaların eşleşen tüm tanımlayıcı adlarının obfuscation'ı sırasında bu adları kullanmak için tekrar --identifier-names-cache-path seçeneği değeri olarak kullanılabilir.

identifierNamesGenerator

Type: string Default: hexadecimal

Tanımlayıcı adları üreticisini ayarlar.

Kullanılabilir değerler:

  • dictionary: identifiersDictionary listesinden tanımlayıcı adları
  • hexadecimal: _0xabc123 gibi tanımlayıcı adları
  • mangled: a, b, c gibi kısa tanımlayıcı adları
  • mangled-shuffled: mangled ile aynı, ancak alfabesi karıştırılmış

identifiersDictionary

Type: string[] Default: []

identifierNamesGenerator: dictionary seçeneği için tanımlayıcı sözlüğünü ayarlar. Sözlükteki her tanımlayıcı, her karakterin farklı büyük/küçük harf düzeniyle birkaç varyantta kullanılır. Bu nedenle, sözlükteki tanımlayıcı sayısı orijinal kaynak kodundaki tanımlayıcı miktarına bağlı olmalıdır.

identifiersPrefix

Type: string Default: ''

Tüm global tanımlayıcılar için önek ayarlar.

Birden çok dosyayı obfuscate etmek istediğinizde bu seçeneği kullanın. Bu seçenek, bu dosyaların global tanımlayıcıları arasındaki çakışmaların önlenmesine yardımcı olur. Önek her dosya için farklı olmalıdır.

randomIdentifiersPrefix

Type: boolean Default: false

Tüm global tanımlayıcıların önüne tohumlanmış rastgele bir önek (6 alfasayısal karakter) ekler. Aynı global kapsama yüklenen, ayrı ayrı obfuscate edilmiş paketler arasındaki çakışmaları önlemek için bu seçeneği kullanın — her paket için elle benzersiz bir identifiersPrefix seçme gereğini ortadan kaldırır.

  • Rastgele değer, seed seçeneğinden ve kaynak kodu karmasından türetilir; böylece aynı tohumla yapılan yeniden üretilebilir derlemeler aynı öneki üretir.
  • identifiersPrefix ile birleştirildiğinde, rastgele karakterler kullanıcının sağladığı önekin sonuna eklenir (örneğin myApp + rastgele aBc123myAppaBc123).
  • vmObfuscation ile birleştirildiğinde, rastgele değer varsayılan vm önekinin yerini alır — rastgelelik zaten benzersizliği garanti eder.

ignoreImports

Type: boolean Default: false

require içe aktarmalarının obfuscation'ını önler. Çalışma zamanı ortamının bir nedenle bu içe aktarmaları yalnızca statik stringlerle gerektirdiği bazı durumlarda yardımcı olabilir.

inputFileName

Type: string Default: ''

Kaynak kodu içeren girdi dosyasının adını ayarlamaya olanak tanır. Bu ad, source map üretimi için dahili olarak kullanılır. NodeJS API kullanılırken ve sourceMapSourcesMode seçeneği sources değerine sahipken gereklidir.

log

Type: boolean Default: false

Bilgilerin konsola günlüğe kaydedilmesini etkinleştirir.

numbersToExpressions

Type: boolean Default: false

Sayıların ifadelere dönüştürülmesini etkinleştirir

Örnek:

// input
const foo = 1234;

// output
const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;

optionsPreset

Type: string Default: default

Bir seçenek hazır ayarı ayarlamaya olanak tanır.

Kullanılabilir değerler:

  • vm-default;
  • vm-low-obfuscation;
  • vm-medium-obfuscation;
  • vm-high-obfuscation;
  • vm-ultra-high-obfuscation;
  • vm-anti-llm;
  • default;
  • low-obfuscation;
  • medium-obfuscation;
  • high-obfuscation.

Ek seçeneklerin tümü, seçili seçenek hazır ayarıyla birleştirilir.

parseHtml

Type: boolean Default: false

HTML <script> etiketleri içindeki JavaScript'in obfuscation'ını etkinleştirir.

Etkinleştirildiğinde, obfuscator şunları yapar:

  • Girdinin HTML olup olmadığını otomatik olarak tespit eder (<!DOCTYPE, <html>, <head>, <body> veya <script> etiketlerini kontrol ederek)
  • data-javascript-obfuscator özniteliğiyle işaretlenmiş <script> etiketlerinden JavaScript'i çıkarır
  • HTML yapısını korurken işaretlenmiş her betiği ayrı ayrı obfuscate eder
  • Obfuscate edilmiş kodu orijinal konumlarına geri enjekte eder

Önemli: Yalnızca data-javascript-obfuscator özniteliğine sahip betikler obfuscate edilir. İşaretlenmiş her betik ayrı ayrı ve bağımsız olarak obfuscate edilir. Bu şu anlama gelir:

  • İşaretlenmiş betik etiketleri içindeki kod izole edilmelidir - diğer işaretlenmiş betik etiketlerinde tanımlanan değişkenlere, fonksiyonlara veya sınıflara başvurMAMALIDIR
  • İşaretlenmemiş betikler, işaretlenmiş betikler tarafından tanımlanan global'lere yine de erişebilir (var bildirimleri veya açık globalThis atamaları aracılığıyla)
  • Bu, hangi betikleri koruyacağınız üzerinde açık denetim sağlar

Obfuscate edilir (data-javascript-obfuscator özniteliğine sahip olmalıdır):

  • <script data-javascript-obfuscator> - normal betikler
  • <script type="text/javascript" data-javascript-obfuscator> - açıkça türü belirtilmiş betikler
  • Herhangi bir ek özniteliğe sahip betikler (id, class, diğer data-*, vb.)

Atlanır (değiştirilmeden bırakılır):

  • data-javascript-obfuscator özniteliği olmayan betikler
  • <script type="module"> - ES modülleri (öznitelik olsa bile)
  • <script src="..."> - harici betikler (öznitelik olsa bile)
  • Boş betik etiketleri

Not: parseHtml etkinleştirildiğinde source map'ler üretilmez, çünkü HTML çıktısına doğru şekilde eşlenmezler.

Örnek:

// input
const html = `<!DOCTYPE html>
<html>
<body>
<!-- This script will NOT be obfuscated -->
<script>
var helper = 'utility';
</script>

<!-- This script WILL be obfuscated -->
<script data-javascript-obfuscator>
var greeting = 'Hello World';
console.log(greeting);
</script>
</body>
</html>`;

JavaScriptObfuscator.obfuscate(html, {
    parseHtml: true,
    stringArray: true
});

// output: HTML with only the marked script obfuscated

renameGlobals

Type: boolean Default: false

⚠️ bu seçenek kodunuzu bozabilir. Yalnızca ne yaptığını biliyorsanız etkinleştirin!

Global değişken ve fonksiyon adlarının bildirimiyle birlikte obfuscation'ını etkinleştirir.

Bu seçenek devre dışı bırakıldığında ve girdi kodu global kapsamda fonksiyonlar veya sınıflar bildirdiğinde (yani kod bir IIFE içine sarmalanmadığında), adları obfuscate edilmiş çıktıda olduğu gibi korunur — diğer betikler bunlara adlarıyla başvurabilir. vmObfuscation altında, bu adları listeleyen bir VMGlobalFunctionNamesNotRenamed uyarısı raporlanır; çünkü fonksiyon gövdesi bayt kodu olarak gizlenir ancak okunabilir üst düzey ad, kodun ne yaptığını yine de açığa çıkarır (örneğin bir LLM'e). Bu maruz kalmayı önlemek için kodu bir IIFE içine sarmalayın veya bu seçeneği etkinleştirin.

renameProperties

Type: boolean Default: false

⚠️ bu seçenek kodunuzu BOZABİLİR. Yalnızca ne yaptığını biliyorsanız etkinleştirin!

Özellik adlarının yeniden adlandırılmasını etkinleştirir. Tüm yerleşik DOM özellikleri ve çekirdek JavaScript sınıflarındaki özellikler göz ardı edilir.

Bu seçeneğin safe ve unsafe modları arasında geçiş yapmak için renamePropertiesMode seçeneğini kullanın.

Yeniden adlandırılan özellik adlarının biçimini ayarlamak için identifierNamesGenerator seçeneğini kullanın.

Hangi özelliklerin yeniden adlandırılacağını denetlemek için reservedNames seçeneğini kullanın.

Örnek:

// input
(function () {
    const foo = {
        prop1: 1,
        prop2: 2,
        calc: function () {
            return this.prop1 + this.prop2;
        }
    };
    
    console.log(foo.calc());
})();

// output
(function () {
    const _0x46529b = {
        '_0x10cec7': 0x1,
        '_0xc1c0ca': 0x2,
        '_0x4b961d': function () {
            return this['_0x10cec7'] + this['_0xc1c0ca'];
        }
    };
    console['log'](_0x46529b['_0x4b961d']());
}());

renamePropertiesMode

Type: string Default: safe

⚠️ safe modunda bile renameProperties seçeneği kodunuzu BOZABİLİR.

renameProperties seçeneğinin modunu belirtir:

  • safe - 2.11.0 sürümünden sonraki varsayılan davranış. Çalışma zamanı hatalarını önlemek için özellikleri daha güvenli bir şekilde yeniden adlandırmayı dener. Bu modda bazı özellikler yeniden adlandırmadan hariç tutulur.
  • unsafe - 2.11.0 sürümünden önceki varsayılan davranış. Özellikleri herhangi bir kısıtlama olmadan güvensiz bir şekilde yeniden adlandırır.

Bir dosya başka bir dosyadaki özellikleri kullanıyorsa, bu dosyalar arasında aynı özellik adlarını korumak için identifierNamesCache seçeneğini kullanın.

reservedNames

Type: string[] Default: []

Geçirilen RegExp desenleriyle eşleşen tanımlayıcıların obfuscation'ını ve üretilmesini devre dışı bırakır.

Örnek:

	{
		reservedNames: [
			'^someVariable',
			'functionParameter_\d'
		]
	}

reservedStrings

Type: string[] Default: []

Geçirilen RegExp desenleriyle eşleşen string değişmezlerinin dönüştürülmesini devre dışı bırakır. Eşleşen stringler obfuscate edilmiş çıktıda görünür kalır.

VM obfuscation kullanılırken, ayrılmış stringler görünür kalmaları için ayrı bir şifrelenmemiş dizide saklanır. Bu, izleme için API uç noktaları veya kütüphane tanımlayıcıları gibi okunabilir kalması gereken stringler için kullanışlıdır.

Örnek:

	{
		reservedStrings: [
			'react-native',
			'\.\/src\/test',
			'some-string_\d'
		]
	}

seed

Type: string|number Default: 0

Bu seçenek, rastgele üreteç için tohum (seed) değerini ayarlar. Bu, tekrarlanabilir sonuçlar oluşturmak için kullanışlıdır.

Tohum 0 ise - rastgele üreteç tohumsuz çalışır.

selfDefending

Type: boolean Default: false

⚠️ Bu seçenekle obfuscation yaptıktan sonra obfuscate edilmiş kodu hiçbir şekilde değiştirmeyin, çünkü kodu küçültmek (uglify) gibi herhangi bir değişiklik self defending'i tetikleyebilir ve kod artık çalışmaz!
⚠️ Bu seçenek compact değerini zorla true olarak ayarlar
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır. Bunun yerine vmSelfDefending seçeneğini kullanın.

Bu seçenek, çıktı kodunu biçimlendirmeye ve değişken yeniden adlandırmaya karşı dayanıklı hale getirir. Biri obfuscate edilmiş kod üzerinde bir JavaScript güzelleştirici (beautifier) kullanmayı denerse, kod artık çalışmaz; bu da onu anlamayı ve değiştirmeyi zorlaştırır.

simplify

Type: boolean Default: true

Sadeleştirme yoluyla ek kod obfuscation'ını etkinleştirir.

⚠️ gelecek sürümlerde boolean değişmezlerinin obfuscation'ı (true => !![]) bu seçeneğin altına taşınacaktır.

Örnek:

// input
if (condition1) {
    const foo = 1;
    const bar = 2;
  
    console.log(foo);
  
    return bar;
} else if (condition2) {
    console.log(1);
    console.log(2);
    console.log(3);
  
    return 4;
} else {
    return 5;
}

// output
if (condition1) {
    const foo = 0x1, bar = 0x2;
    return console['log'](foo), bar;
} else
    return condition2 ? (console['log'](0x1), console['log'](0x2), console['log'](0x3), 0x4) : 0x5;

sourceMap

Type: boolean Default: false

Obfuscate edilmiş kod için source map üretimini etkinleştirir.

Source map'ler, obfuscate edilmiş JavaScript kaynak kodunuzda hata ayıklamanıza yardımcı olabilir. Üretimde hata ayıklamak isterseniz veya buna ihtiyacınız olursa, ayrı source map dosyasını gizli bir konuma yükleyip tarayıcınızı oraya yönlendirebilirsiniz.

sourceMapBaseUrl

Type: string Default: ``

sourceMapMode: 'separate' olduğunda source map içe aktarma url'sinin temel url'sini ayarlar.

CLI örneği:

javascript-obfuscator input.js --output out.js --source-map true --source-map-base-url 'http://localhost:9000'

Sonuç:

//# sourceMappingURL=http://localhost:9000/out.js.map

sourceMapFileName

Type: string Default: ``

sourceMapMode: 'separate' olduğunda çıktı source map için dosya adını ayarlar.

CLI örneği:

javascript-obfuscator input.js --output out.js --source-map true --source-map-base-url 'http://localhost:9000' --source-map-file-name example

Sonuç:

//# sourceMappingURL=http://localhost:9000/example.js.map

sourceMapMode

Type: string Default: separate

Source map üretim modunu belirtir:

  • inline - her .js dosyasının sonuna source map ekler;
  • separate - source map içeren karşılık gelen '.map' dosyasını üretir. Obfuscator'ı CLI aracılığıyla çalıştırdığınızda - obfuscate edilmiş kodu içeren dosyanın sonuna source map dosyasına bağlantı ekler //# sourceMappingUrl=file.js.map.

sourceMapSourcesMode

Type: string Default: sources-content

Source map'in sources ve sourcesContent alanlarını denetlemeye olanak tanır:

  • sources-content - sahte bir sources alanı ekler, orijinal kaynak kodu içeren bir sourcesContent alanı ekler;
  • sources - geçerli bir kaynak açıklaması içeren bir sources alanı ekler, sourcesContent alanını eklemez. NodeJS API kullanırken, sources alanı değeri olarak kullanılacak inputFileName seçeneğinin tanımlanması gerekir.

splitStrings

Type: boolean Default: false

Değişmez stringleri, splitStringsChunkLength seçeneği değeri uzunluğunda parçalara böler.

Örnek:

// input
(function(){
    var test = 'abcdefg';
})();

// output
(function(){
    var _0x5a21 = 'ab' + 'cd' + 'ef' + 'g';
})();

splitStringsChunkLength

Type: number Default: 10

splitStrings seçeneğinin parça uzunluğunu ayarlar.

stringArray

Type: boolean Default: true

String değişmezlerini kaldırıp özel bir diziye yerleştirir. Örneğin, var m = "Hello World"; içindeki "Hello World" stringi var m = _0x12c456[0x1]; gibi bir şeyle değiştirilir

stringArrayCallsTransform

Type: boolean Default: false

⚠️ stringArray seçeneği etkinleştirilmelidir

stringArray çağrılarının dönüştürülmesini etkinleştirir. Bu çağrıların tüm argümanları, stringArrayCallsTransformThreshold değerine bağlı olarak farklı bir nesneye çıkarılabilir. Böylece string array'e yapılan çağrıları otomatik olarak bulmak daha da zorlaşır.

Örnek:

function foo() {
    var k = {
        c: 0x2f2,
        d: '0x396',
        e: '0x397',
        f: '0x39a',
        g: '0x39d',
        h: 0x398,
        l: 0x394,
        m: '0x39b',
        n: '0x39f',
        o: 0x395,
        p: 0x395,
        q: 0x399,
        r: '0x399'
    };
    var c = i(k.d, k.e);
    var d = i(k.f, k.g);
    var e = i(k.h, k.l);
    var f = i(k.m, k.n);
    function i(c, d) {
        return b(c - k.c, d);
    }
    var g = i(k.o, k.p);
    var h = i(k.q, k.r);
}
function j(c, d) {
    var l = { c: 0x14b };
    return b(c - -l.c, d);
}
console[j(-'0xa6', -'0xa6')](foo());
function b(c, d) {
    var e = a();
    b = function (f, g) {
        f = f - 0xa3;
        var h = e[f];
        return h;
    };
    return b(c, d);
}
function a() {
    var m = [
        'string5',
        'string1',
        'log',
        'string3',
        'string6',
        'string2',
        'string4'
    ];
    a = function () {
        return m;
    };
    return a();
}

stringArrayCallsTransformThreshold

Type: number Default: 0.5

⚠️ stringArray ve stringArrayCallsTransformThreshold seçenekleri etkinleştirilmelidir

Bu ayarı, string array'e yapılan çağrıların dönüştürülme olasılığını (0 ile 1 arasında) ayarlamak için kullanabilirsiniz.

stringArrayEncoding

Type: string[] Default: []

⚠️ stringArray seçeneği etkinleştirilmelidir

Bu seçenek betiğinizi yavaşlatabilir.

stringArray öğesinin tüm string değişmezlerini base64 veya rc4 kullanarak kodlar ve çalışma zamanında bunları geri çözmek için kullanılan özel bir kod ekler.

Her stringArray değeri, geçirilen listeden rastgele seçilen kodlamayla kodlanır. Bu, birden çok kodlamanın kullanılmasını mümkün kılar.

Kullanılabilir değerler:

  • 'none' (boolean): stringArray değerini kodlamaz
  • 'base64' (string): stringArray değerini base64 kullanarak kodlar
  • 'rc4' (string): stringArray değerini rc4 kullanarak kodlar. base64'ten yaklaşık %30-50 daha yavaştır, ancak başlangıç değerlerini elde etmek daha zordur.

Örneğin, aşağıdaki seçenek değerleriyle bazı stringArray değerleri kodlanmaz ve bazı değerler base64 ve rc4 kodlamasıyla kodlanır:

stringArrayEncoding: [
    'none',
    'base64',
    'rc4'
]

stringArrayIndexesType

Type: string[] Default: ['hexadecimal-number']

⚠️ stringArray seçeneği etkinleştirilmelidir

String array çağrı indekslerinin türünü denetlemeye olanak tanır.

Her stringArray çağrı indeksi, geçirilen listeden rastgele seçilen türle dönüştürülür. Bu, birden çok türün kullanılmasını mümkün kılar.

Kullanılabilir değerler:

  • 'hexadecimal-number' (default): string array çağrı indekslerini hexadecimal sayılar olarak dönüştürür
  • 'hexadecimal-numeric-string': string array çağrı indekslerini hexadecimal sayısal string olarak dönüştürür

2.9.0 sürümünden önce javascript-obfuscator, tüm string array çağrı indekslerini hexadecimal-numeric-string türüyle dönüştürüyordu. Bu, bazı manuel deobfuscation'ı biraz daha zorlaştırır ancak otomatik deobfuscator'ların bu çağrıları kolayca tespit etmesine olanak tanır.

Yeni hexadecimal-number türü, koddaki string array çağrı desenlerinin otomatik tespitini zorlaştırmayı amaçlar.

Gelecekte daha fazla tür eklenecektir.

stringArrayIndexShift

Type: boolean Default: true

⚠️ stringArray seçeneği etkinleştirilmelidir

Tüm string array çağrıları için ek indeks kaydırması etkinleştirir

stringArrayRotate

Type: boolean Default: true

⚠️ stringArray etkinleştirilmelidir

stringArray dizisini sabit ve rastgele (kod obfuscation'ı sırasında üretilen) sayıda konum kadar kaydırır. Bu, kaldırılan stringlerin sırasını orijinal yerleriyle eşleştirmeyi zorlaştırır.

stringArrayShuffle

Type: boolean Default: true

⚠️ stringArray etkinleştirilmelidir

stringArray dizisi öğelerini rastgele karıştırır.

stringArrayWrappersCount

Type: number Default: 1

⚠️ stringArray seçeneği etkinleştirilmelidir

Her kök veya fonksiyon kapsamı içinde string array için sarmalayıcı sayısını ayarlar. Her kapsam içindeki gerçek sarmalayıcı sayısı, bu kapsamdaki literal düğümlerinin sayısıyla sınırlıdır.

Örnek:

// Input
const foo = 'foo';
const bar = 'bar';
        
function test () {
    const baz = 'baz';
    const bark = 'bark';
    const hawk = 'hawk';
}

const eagle = 'eagle';

// Output, stringArrayWrappersCount: 5
const _0x3f6c = [
    'bark',
    'bar',
    'foo',
    'eagle',
    'hawk',
    'baz'
];
const _0x48f96e = _0x2e13;
const _0x4dfed8 = _0x2e13;
const _0x55e970 = _0x2e13;
function _0x2e13(_0x33c4f5, _0x3f6c62) {
    _0x2e13 = function (_0x2e1388, _0x60b1e) {
        _0x2e1388 = _0x2e1388 - 0xe2;
        let _0x53d475 = _0x3f6c[_0x2e1388];
        return _0x53d475;
    };
    return _0x2e13(_0x33c4f5, _0x3f6c62);
}
const foo = _0x48f96e(0xe4);
const bar = _0x4dfed8(0xe3);
function test() {
    const _0x1c262f = _0x2e13;
    const _0x54d7a4 = _0x2e13;
    const _0x5142fe = _0x2e13;
    const _0x1392b0 = _0x1c262f(0xe7);
    const _0x201a58 = _0x1c262f(0xe2);
    const _0xd3a7fb = _0x1c262f(0xe6);
}
const eagle = _0x48f96e(0xe5);

stringArrayWrappersChainedCalls

Type: boolean Default: true

⚠️ stringArray ve stringArrayWrappersCount seçenekleri etkinleştirilmelidir

string array sarmalayıcıları arasında zincirleme çağrıları etkinleştirir.

Örnek:

// Input
const foo = 'foo';
const bar = 'bar';
        
function test () {
    const baz = 'baz';
    const bark = 'bark';

    function test1() {
        const hawk = 'hawk';
        const eagle = 'eagle';
    } 
}

// Output, stringArrayWrappersCount: 5, stringArrayWrappersChainedCalls: true
const _0x40c2 = [
    'bar',
    'bark',
    'hawk',
    'eagle',
    'foo',
    'baz'
];
const _0x31c087 = _0x3280;
const _0x31759a = _0x3280;
function _0x3280(_0x1f52ee, _0x40c2a2) {
    _0x3280 = function (_0x3280a4, _0xf07b02) {
        _0x3280a4 = _0x3280a4 - 0x1c4;
        let _0x57a182 = _0x40c2[_0x3280a4];
        return _0x57a182;
    };
    return _0x3280(_0x1f52ee, _0x40c2a2);
}
const foo = _0x31c087(0x1c8);
const bar = _0x31c087(0x1c4);
function test() {
    const _0x848719 = _0x31759a;
    const _0x2693bf = _0x31c087;
    const _0x2c08e8 = _0x848719(0x1c9);
    const _0x359365 = _0x2693bf(0x1c5);
    function _0x175e90() {
        const _0x310023 = _0x848719;
        const _0x2302ef = _0x2693bf;
        const _0x237437 = _0x310023(0x1c6);
        const _0x56145c = _0x310023(0x1c7);
    }
}

stringArrayWrappersParametersMaxCount

Type: number Default: 2

⚠️ stringArray seçeneği etkinleştirilmelidir
⚠️ Şu anda bu seçenek yalnızca stringArrayWrappersType function seçeneği değeriyle eklenen sarmalayıcıları etkiler

String array sarmalayıcı parametrelerinin maksimum sayısını denetlemeye olanak tanır. Varsayılan ve minimum değer 2'dir. Önerilen değer 2 ile 5 arasındadır.

stringArrayWrappersType

Type: string Default: variable

⚠️ stringArray ve stringArrayWrappersCount seçenekleri etkinleştirilmelidir

stringArrayWrappersCount seçeneği tarafından eklenen sarmalayıcıların türünü seçmeye olanak tanır.

Kullanılabilir değerler:

  • 'variable': her kapsamın en üstüne değişken sarmalayıcılar ekler. Hızlı performans.
  • 'function': her kapsam içinde rastgele konumlara fonksiyon sarmalayıcılar ekler. variable'dan daha yavaş performans ancak daha katı obfuscation sağlar.

Performans kaybının obfuscate edilmiş bir uygulama üzerinde yüksek etkisi olmadığında, daha yüksek obfuscation için function sarmalayıcıların kullanılması şiddetle önerilir.

'function' seçeneği değerine örnek:

// input
const foo = 'foo';

function test () {
    const bar = 'bar';
    console.log(foo, bar);
}

test();

// output
const a = [
    'log',
    'bar',
    'foo'
];
const foo = d(0x567, 0x568);
function b(c, d) {
    b = function (e, f) {
        e = e - 0x185;
        let g = a[e];
        return g;
    };
    return b(c, d);
}
function test() {
    const c = e(0x51c, 0x51b);
    function e (c, g) {
        return b(c - 0x396, g);
    }
    console[f(0x51b, 0x51d)](foo, c);
    function f (c, g) {
        return b(c - 0x396, g);
    }
}
function d (c, g) {
    return b(g - 0x3e1, c);
}
test();

stringArrayThreshold

Type: number Default: 0.8 Min: 0 Max: 1

⚠️ stringArray seçeneği etkinleştirilmelidir

Bu ayarı, bir string değişmezinin stringArray'e ekleneceği olasılığı (0 ile 1 arasında) ayarlamak için kullanabilirsiniz.

Bu ayar, özellikle büyük kod boyutları için kullanışlıdır çünkü string array'i tekrar tekrar çağırır ve kodunuzu yavaşlatabilir.

stringArrayThreshold: 0, stringArray: false ile aynıdır.

strictMode

Type: boolean | null Default: null

Obfuscator'ın kodu JavaScript strict mode açısından nasıl ele alacağını belirtmeye olanak tanır.

Kullanılabilir değerler:

  • null (varsayılan) - strict mode'u koddan otomatik tespit eder. Kod açık bir 'use strict' yönergesine, ES modülü sözdizimine veya sınıf metotlarına sahipse, strict mode olarak ele alınır. Aksi takdirde sloppy mode varsayılır.
  • true - açık bir 'use strict' yönergesi olmasa bile tüm kod için strict mode işlemesini zorlar. Kodunuz strict mode bağlamında çalışacaksa bunu kullanın (örneğin ES modüllerinde, paketleyicilerde veya modern çerçevelerde).
  • false - yalnızca açık strict mode göstergeleri ('use strict', ES modülleri, sınıf metotları) strict olarak ele alınır. JS spesifikasyonu uyarınca üst kapsam devralması yine de geçerlidir.

target

Type: string Default: browser

Obfuscate edilmiş kod için hedef ortamı ayarlamaya olanak tanır.

Kullanılabilir değerler:

  • browser (varsayılan) — standart web sayfası ortamı. Çıktı kodu node ile aynıdır, ancak bazı tarayıcıya özgü seçeneklerin node hedefiyle kullanılmasına izin verilmez
  • browser-no-evalbrowser ile aynı, ancak çıktı eval() kullanmaz. Hedef sayfada eval/unsafe-eval kullanımını yasaklayan bir İçerik Güvenliği Politikası (CSP) olduğunda kullanın.
  • node — Node.js ortamı. Tarayıcıya özgü seçenekler devre dışı bırakılır (bunlar window/document gerektirir ve Node'da işlevsiz olur veya hata fırlatır). Yalnızca tarayıcıya özgü API'lere dayanan bazı vmSelfDefending savunmaları — headless tarayıcı tespiti, iframe tabanlı temiz-realm kurtarma, denetleyici karşıtı/DOM kontrolleri — bu hedef için üretilmez.
  • service-worker — Service Worker bağlamı. window yok, document yok, farklı bir self global'i.
  • userscript — userscript yöneticisi sandbox'ı (örneğin Tampermonkey). vmSelfDefending savunmaları buna göre ayarlanır.
  • bytenode — obfuscation'dan sonra bytenode yükleyicisiyle (V8 önbelleğe alınmış bayt kodu .jsc) derlenecek Node.js kodu. Obfuscator'ın kendisi bytenode'u çağırmaz; çalışma zamanı bytenode'un derleme adımından sağ çıkacak şekilde yapılandırılmış VM ile obfuscate edilmiş JavaScript üretir ve vmSelfDefending savunmaları buna göre ayarlanır. Nihai .jsc'yi üretmek için bytenode'u obfuscate edilmiş çıktı üzerinde kendiniz çalıştırın.

transformObjectKeys

Type: boolean Default: false

Nesne anahtarlarının dönüştürülmesini etkinleştirir.

Örnek:

// input
(function(){
    var object = {
        foo: 'test1',
        bar: {
            baz: 'test2'
        }
    };
})();

// output
var _0x4735 = [
    'foo',
    'baz',
    'bar',
    'test1',
    'test2'
];
function _0x390c(_0x33d6b6, _0x4735f4) {
    _0x390c = function (_0x390c37, _0x1eed85) {
        _0x390c37 = _0x390c37 - 0x198;
        var _0x2275f8 = _0x4735[_0x390c37];
        return _0x2275f8;
    };
    return _0x390c(_0x33d6b6, _0x4735f4);
}
(function () {
    var _0x17d1b7 = _0x390c;
    var _0xc9b6bb = {};
    _0xc9b6bb[_0x17d1b7(0x199)] = _0x17d1b7(0x19c);
    var _0x3d959a = {};
    _0x3d959a[_0x17d1b7(0x198)] = _0x17d1b7(0x19b);
    _0x3d959a[_0x17d1b7(0x19a)] = _0xc9b6bb;
    var _0x41fd86 = _0x3d959a;
}());

warnings

Type: string | object Default: all

ObfuscationResult.getWarnings() metodu aracılığıyla hangi ölümcül olmayan obfuscation uyarılarının yayınlanacağını denetler.

Kullanılabilir değerler:

  • 'all' (varsayılan) — her uyarı yayınlanır.
  • 'none' — tüm uyarılar bastırılır.
  • uyarı türlerini boole değerlerine eşleyen bir nesne — false ile eşlenen bir tür bastırılır; mevcut olmayan (veya true ile eşlenen) her tür etkin kalır. Örneğin, { "VMGlobalFunctionNamesNotRenamed": false } yalnızca o uyarı dışındaki her uyarıyı korur.

Uyarı türleri:

  • VMGlobalFunctionNamesNotRenamedvmObfuscation altında, üst düzey fonksiyon bildirimlerinin, sınıf bildirimlerinin ve bir fonksiyon/arrow/sınıf ifadesi atanan değişkenlerin adları olduğu gibi korundu (renameGlobals seçeneği devre dışı ve kod bir IIFE içine sarmalanmamış), dolayısıyla gövdeleri bayt kodu olarak gizlenmiş olsa da çıktıda okunabilir kalırlar. Dışa aktarılan adlar raporlanmaz.
  • VMTopLevelInitializerNotVirtualizedvmWrapTopLevelInitializers devre dışı olduğu veya bunları sanallaştıramadığı için üst düzey değişken başlatıcıları VM obfuscation altında düz JavaScript olarak kaldı.
  • DynamicCodeRenameRisk — kod, çalışma zamanında bir stringden fonksiyon oluşturuyor (doğrudan eval, Function yapıcısı veya bir <script>/Worker'a enjekte edilen fn.toString()); bu, obfuscator'ın yeniden adlandırdığı tanımlayıcılara başvurabilir.
  • VMDynamicCodeSkipped — bir fonksiyon, doğrudan eval / dinamik new Function / Function içerdiği için VM bayt kodlamasından atlandı (bkz. vmForceCompileDynamicCode).
  • VMSyncFunctionSkippedInAsyncModevmAsyncExecutor etkinken, comment modunda açıkça işaretlediğiniz bir fonksiyonun senkron olduğu ortaya çıktı ve atlandı (bu modda yalnızca async fonksiyonlar sanallaştırılır).
  • VMAsyncGeneratorSkippedInAsyncModevmAsyncExecutor ve etkin bir async anahtar getirici ile, işaretlenmiş bir async üreteç sanallaştırılamadı (yineleyicisini senkron olarak döndürmesi gerekir).
  • BrowserTargetWithNodeStyleCode — kod, target seçeneği tarayıcı benzeri bir ortama ayarlıyken Node.js'i hedefliyor gibi görünüyor (örneğin require('fs'), __dirname, process.argv).

vmObfuscation

Type: boolean Default: false

VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Etkinleştirildiğinde, JavaScript fonksiyonları gömülü bir sanal makinede çalışan özel bayt koduna derlenir. Orijinal kod mantığı tamamen dönüştürüldüğü için bu, en yüksek düzeyde koruma sağlar.

Örnek: return qty * price gibi okunabilir kodunuz, yalnızca gömülü VM yorumlayıcısının yürütebileceği [0x15,0x03,0x17,...] gibi bir sayı listesine dönüşür. Orijinal mantık artık JavaScript olarak görünmez.

vmTargetFunctions

Type: string[] Default: []

Hangi kök düzeyi fonksiyonların ada göre VM koruması alacağını tam olarak belirtin.

Örnek:

{
    vmObfuscation: true,
    vmTargetFunctions: ['someFunctionName']
}

Sonuç: Yalnızca bu üç fonksiyon VM ile korunur. Geri kalan her şey normal (ancak yine de obfuscate edilmiş) JavaScript olarak kalır. Kodunuzun geri kalanını hafif tutarken hassas lisans kontrollerini veya kimlik doğrulama mantığını korumak için idealdir.

vmExcludeFunctions

Type: string[] Default: []

Asla VM koruması almaması gereken kök düzeyi fonksiyonları belirtin. Diğer ayarlara göre önceliklidir.

Örnek:

{
    vmObfuscation: true,
    vmExcludeFunctions: ['someFunctionName']
}

Ne zaman kullanılır: Performans açısından kritik kök düzeyi fonksiyonlar (animasyon döngüleri, gerçek zamanlı veri işleme), geri kalan her şey korunmaya devam ederken VM ek yükünü önlemek için hariç tutulabilir.

vmTargetFunctionsMode

Type: string Default: root

Fonksiyonların/metotların VM obfuscation için nasıl seçileceğini denetler.

ModAçıklama
rootVarsayılan davranış. VM obfuscation için yalnızca kök düzeyi fonksiyonlar dikkate alınır. Filtrelemek için vmTargetFunctions izin listesini ve vmExcludeFunctions ret listesini kullanır.
commentYalnızca /* javascript-obfuscator:vm */ yorumuyla işaretlenmiş fonksiyonlar/metotlar VM ile obfuscate edilir. Herhangi bir iç içe geçme düzeyindeki fonksiyonlarla/metotlarla çalışır.

Örnek - Comment modu:

// Source code
function regularFunction() {
    return 'not virtualized';
}

/* javascript-obfuscator:vm */
function sensitiveFunction() {
    return 'this will be VM-protected';
}

function outer() {
    /* javascript-obfuscator:vm */
    function nestedSensitive() {
        return 'nested but still VM-protected';
    }
    return nestedSensitive();
}
// Obfuscator options
{
    vmObfuscation: true,
    vmTargetFunctionsMode: 'comment'
}

Ne zaman kullanılır: Hangi fonksiyonların VM koruması alacağı üzerinde cerrahi denetime ihtiyaç duyduğunuzda, özellikle hassas mantık içeren iç içe fonksiyonlar için. Yalnızca kök düzeyi adlandırılmış fonksiyonlarla çalışan vmTargetFunctions'ın aksine, comment modu kodunuzun herhangi bir yerindeki herhangi bir fonksiyonu korumanıza olanak tanır.

vmForceCompileDynamicCode

Type: boolean Default: false

VM obfuscation'ın, doğrudan eval, new Function(...) veya Function(...) çağrısı içeren bir fonksiyonla ne yapacağını denetler.

Varsayılan olarak, böyle bir fonksiyon (ve içinde tanımlanan her fonksiyon) VM bayt kodlamasından atlanır ve result.getWarnings() üzerinde bir VMDynamicCodeSkipped uyarısı raporlanır. Bunun nedeni, çalışma zamanında oluşturulan kaynağın çevreleyen kapsam zincirindeki tanımlayıcılara — obfuscator'ın yeniden adlandırdığı tanımlayıcılara — başvurabilmesidir.

true olarak ayarlandığında, fonksiyon yine de bayt koduna dönüştürülür ve VMDynamicCodeSkipped uyarısı artık yayınlanmaz.

Ayrı DynamicCodeRenameRisk uyarısı bu seçenekten bağımsız olarak çalışmaya devam eder, çünkü tanımladığı yeniden adlandırma riski VM atlamasından bağımsızdır — bu seçeneği açmak, altta yatan deseni daha güvenli hale getirmez.

// Source code
function loadConfig(src) {
    return eval(src);
}
loadConfig('1 + 2');
// Options
{
    vmObfuscation: true,
    vmForceCompileDynamicCode: true
}

Seçenek kapalıyken (varsayılan), loadConfig düz JavaScript olarak bırakılır. Seçenek açıkken, loadConfig diğer herhangi bir fonksiyon gibi VM bayt koduna derlenir. Çağrı noktasını denetlediğinizde ve çalışma zamanında oluşturulan kodun closure ile yeniden adlandırılmış tanımlayıcılara bağlı olmadığını bildiğinizde bunu kullanın.

vmWrapTopLevelInitializers

Type: boolean Default: false

Bazı üst düzey değişken başlatıcılarını, VM ile obfuscate edilebilmeleri için IIFE'lere (Hemen Çağrılan Fonksiyon İfadeleri) sarmalar.

Ne yapar: Bu seçenek olmadan, üst düzey sabitler ve değişkenler çıktıda görünür kalır:

// Input
const MY_STRING = "my-string";

// Output (without vmWrapTopLevelInitializers)
const MY_STRING = "my-string";  // String is visible!

Bu seçenek etkinleştirildiğinde, başlatıcı VM ile obfuscate edilen bir IIFE içine sarmalanır:

// Input
const MY_STRING = "my-string";

// Output (with vmWrapTopLevelInitializers: true)
const MY_STRING = (() => { return /* VM bytecode call */ })();  // String hidden in bytecode

Not: Bu seçenek yalnızca vmTargetFunctionsMode değeri 'root' (varsayılan) olduğunda çalışır.

Uyarılar: Bir üst düzey başlatıcı VM obfuscation altında düz JavaScript olarak kaldığında, etkilenen değişken adlarını listeleyen bir VMTopLevelInitializerNotVirtualized uyarısı raporlanır. Bu şunları kapsar: bu seçeneğin devre dışı olması, bu seçeneğin atlamak zorunda kaldığı başlatıcılar (her biri nedeniyle birlikte — örneğin başlatıcının bir kardeş bildiriciye başvurması veya üst düzey await içermesi) ve senkron sarmalayıcıların hiç sanallaştırılamadığı vmAsyncExecutor modu.

vmDynamicOpcodes

Type: boolean Default: false

VM yorumlayıcısını daha küçük ve her derleme için benzersiz hale getirir.

Ne yapar:

  1. Kullanılmayan talimatları filtreler - Kodunuz sınıf kullanmıyorsa, sınıfla ilgili talimatlar tamamen kaldırılır
  2. Yapıyı rastgeleleştirir - Talimat işleyicilerinin sırası her derlemede karıştırılır

Sonuç olarak - daha küçük çıktı ve her derleme farklı görünür.

vmBytecodeEncoding

Type: boolean Default: false

Her bayt kodu talimatını kodlar. Talimatlar yürütme sırasında birer birer çözülür.

vmBytecodeArrayEncoding

Type: boolean Default: false

Tüm bayt kodu dizisini tek bir blok olarak kodlar. Dizi, yürütme başlamadan önce başlangıçta bir kez çözülür. İki katman koruma için vmBytecodeEncoding ile birlikte kullanın.

vmBytecodeArrayEncodingKey

Type: string Default: ''

Bayt kodu dizisi kodlaması için özel şifreleme anahtarı. Ayarlandığında, varsayılan ortamdan türetilen anahtar yerine bu anahtar kullanılır. Anahtar, çalışma zamanında vmBytecodeArrayEncodingKeyGetter aracılığıyla sağlanmalıdır.

Bu seçenek şifreleme anahtarını dışarıya alır - obfuscate edilmiş kodun kendisine gömülü değildir. Anahtar çalışma zamanında hâlâ erişilebilir olsa da (ve dolayısıyla gerçekten gizli olmasa da), bu ayrım statik analiz araçlarının anahtarı yalnızca kodu inceleyerek bulmasını önler.

Önemli: Anahtar, obfuscate edilmiş kod yüklendiğinde senkron olarak kullanılabilir olmalıdır. Çerezler, localStorage, sessionStorage, global değişkenler veya DOM öğeleri (örneğin sunucu tarafından enjekte edilen meta etiketleri) gibi senkron depolamayı kullanın. fetch() gibi asenkron yöntemler anahtar getirici ifadesinde doğrudan kullanılamaz.

vmBytecodeArrayEncodingKeyGetter

Type: string Default: ''

Çalışma zamanında şifreleme anahtarını döndüren senkron JavaScript ifadesi. Bu ifade, obfuscate edilmiş kod yüklendiğinde değerlendirilir ve vmBytecodeArrayEncodingKey içinde sağlanan anahtarın aynısını döndürmelidir. Anahtarı asenkron olarak (bir Promise) çözmek için vmAsyncExecutor seçeneğini etkinleştirin.

Not: Promise döndüren bir getirici vmAsyncExecutor gerektirir. Bu, derleme zamanında kontrol edilemez; bu nedenle vmAsyncExecutor kapalıyken Promise döndüren bir getirici çalışma zamanında başarısız olur — çözücü, anahtar yerine Promise'i alır.

Obfuscate edilmiş kod yalnızca anahtar getirici, obfuscation sırasında kullanılan anahtarın tam olarak aynısını döndürdüğünde çalışır. Anahtarlar eşleşmezse, şifre çözme başarısız olur ve kod anlamsız çıktı veya hatalar üretir. Anahtar getirici undefined, null veya boş bir string döndürürse, kod bir hata fırlatır: "VM decryption key not available".

Önemli: Anahtarı, obfuscate edilmiş kodla aynı dosyanın/betiğin dışında tutun — onu oraya satır içi eklemek, paketin tamamen statik bir taramasının bile onu kurtarmasına olanak tanır. Bunun yerine ayrı bir kaynakta saklayın: sunucunun ayarladığı çerezler, başka bir betik tarafından doldurulan localStorage, sunucu tarafından enjekte edilen bir HTML meta etiketi, farklı bir betik tarafından ayarlanan bir global veya (vmAsyncExecutor ile) çalışma zamanında arka ucunuzdan alınan bir değer.

Anahtar arka ucunuzdan alındığında (vmAsyncExecutor aracılığıyla), o uç noktaya oturum veya origin tabanlı kontroller ekleyin: gerçek kullanıcılara doğru anahtarı (geçerli oturum, beklenen Origin/Referer) ve şüpheli isteklere anlamsız bir anahtar (örneğin bir localhost/beklenmeyen origin, oturum yok) döndürün. Gerçek kullanıcılar normal çalışır; ortamınızın dışında çalışan bir kopya, hiçbir şeye çözülmeyen bir anahtar alır. Tam mantık sitenize bağlıdır.

Örnekler:

// From cookie
vmBytecodeArrayEncodingKeyGetter: "document.cookie.match(/vmKey=([^;]+)/)?.[1]"

// From localStorage
vmBytecodeArrayEncodingKeyGetter: "localStorage.getItem('vmKey')"

// From global variable
vmBytecodeArrayEncodingKeyGetter: "window.__VM_KEY__"

// From meta tag (server-injected)
vmBytecodeArrayEncodingKeyGetter: "document.querySelector('meta[name=\"vm-key\"]').content"

// From nested object
vmBytecodeArrayEncodingKeyGetter: "window.config.encryption.key"

// From backend, async (requires vmAsyncExecutor)
vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'

Kullanım örneği:

// Build time
JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    vmBytecodeArrayEncodingKeyGetter: 'window.__VM_KEY__'
});

// Runtime - key must be set before obfuscated code runs
window.__VM_KEY__ = 'mySecretKey123';

vmAsyncExecutor

Type: boolean Default: false

vmBytecodeArrayEncodingKeyGetter öğesinin bir Promise döndürmesine (bir asenkron anahtar getirici) izin veren asenkron VM yürütücüsünü etkinleştirir — böylece şifre çözme anahtarı, kod yüklendiğinde senkron olarak kullanılabilir olmak zorunda kalmadan çalışma zamanında (ağ isteği, IndexedDB vb.) alınabilir.

Tamamen asenkron kod tabanları için şiddetle önerilir. Bu modda yalnızca async fonksiyonlar sanallaştırılır — senkron bir fonksiyon, dönüş değeri bir Promise haline getirilip çağıranları bozulmadan asenkron yapılamaz — dolayısıyla baştan sona async olan kod en geniş kapsamı elde eder. Kök senkron olduğunda da (örneğin senkron bir IIFE / UMD sarmalayıcı) yine çalışır: içindeki en dıştaki async fonksiyonlar korunur, senkron kısımlar olduğu gibi bırakılır.

Neler dönüştürülür: Nerede görünürse görünsün (senkron sarmalayıcıların içinde iç içe olanlar dahil) her en dıştaki async fonksiyon. Her zincirdeki en dıştaki async, korunan birimdir — içindeki her şey, senkron ve asenkron, derlemeye dahil edilir. Senkron fonksiyonlar ve düz üreteçler obfuscate edilmeden bırakılır.

function foo() {              // sync — left as-is
    function bar() {}         // sync — left as-is

    async function baz() {    // transformed
        // any code here, including calls to other async or sync functions
    }

    async function bark() {   // transformed
        // any code here, including calls to other async or sync functions
    }
}

Atlamalar ve uyarılar. Asenkron bir anahtar getirici etkinken async üreteçler de obfuscate edilmeden bırakılır (bir async üreteç, yineleyicisini senkron olarak döndürmelidir ve anahtarı bekleyemez). Varsayılan vmTargetFunctionsMode: 'root' modunda atlamalar sessizdir (seçim otomatiktir); comment modunda ise, açıkça işaretlediğiniz bir fonksiyon sanallaştırılamadığında — senkron olduğu ortaya çıktığında veya asenkron bir anahtar getirici altında bir async üreteç olduğunda — ObfuscationResult.getWarnings() aracılığıyla bir uyarı yayınlanır.

Asenkron anahtar getirici ayrıca bir vmBytecodeArrayEncodingKeyGetter ile birlikte vmBytecodeArrayEncoding gerektirir.

Kullanım örneği:

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmAsyncExecutor: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    // the key getter may now return a Promise
    vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});

vmJumpsEncoding

Type: boolean Default: false

Bayt kodundaki atlama hedeflerini kodlar. Atlama ofsetleri çalışma zamanında hesaplanır ve kontrol akışı yapısını (if/else, döngüler vb.) statik analizden gizler.

vmMacroOps

Type: boolean Default: false

Yaygın talimat dizilerini tek "makro" opcode'larda birleştirir. Örneğin, LOAD + ADD + STORE tek bir MACRO_ADD_TO_VAR talimatı haline gelebilir. Bu, desen tanımayı bozar ve performansı artırabilir.

vmDebugProtection

Type: boolean Default: false

VM çalışma zamanına çok katmanlı hata ayıklama karşıtı, analiz karşıtı ve LLM karşıtı savunmalar ekler. browser/browser-no-eval hedefleriyle en iyi şekilde çalışır.

vmSelfDefending

Type: boolean Default: false

VM çalışma zamanına çok katmanlı kurcalama tespiti, hook karşıtı ve tersine mühendislik karşıtı koruma ekler.

⚠️ Bu seçenek vmBytecodeArrayEncoding seçeneğini zorla etkinleştirir.

⚠️ Hassas ortam tespiti. Bu seçenek, obfuscate edilmiş kodu hedef çalışma zamanı ortamına bağlar ve otomasyon araçlarını tespit etmek için gelişmiş tarayıcı parmak izi çıkarma kullanır. Bu seçenekle korunan kod, şu ortamlarda çalıştırıldığında kasıtlı olarak bozulur:

  • Headless tarayıcılar (headless Chrome/Chromium, PhantomJS)
  • Tarayıcı otomasyon araçları (Puppeteer, Playwright, Cypress, Selenium/ChromeDriver, Nightmare)
  • Node.js (target değeri browser olarak ayarlandığında)
  • jsdom veya benzeri sunucu tarafı DOM öykünmeleri
  • Yerel tarayıcı yerleşiklerinin hook'landığı veya değiştirildiği ortamlar

Kod, normal tarayıcılarda (Chrome, Firefox, Safari, Edge) doğru şekilde çalışır; iframe'ler, tarayıcı uzantıları (content script'ler) ve Web Worker'lar içinde yüklendiğinde de dahil. Korunan koda karşı otomatik testler çalıştırmanız gerekiyorsa, test derlemeleri için vmSelfDefending'i devre dışı bırakın — bu seçenek otomatik analizi önlemek için tasarlanmıştır ve herhangi bir otomasyon çerçevesiyle güvenli bir şekilde kullanılamaz.

vmDebugProtection, vmBytecodeArrayEncodingKey ve vmBytecodeArrayEncodingKeyGetter ile birlikte kullanılması şiddetle önerilir.

vmDefenseHook

Type: { name: string, aliases?: object } Default: ''

vmDefenseHook, iki anahtarla bir nesne alır: name (zorunlu) ve aliases (isteğe bağlı).

name, bir VM savunmasının (vmDebugProtection / vmSelfDefending) düşmanca bir sinyal tespit ettiğinde — bir hata ayıklayıcı veya denetleyici, bir headless / otomasyon tarayıcısı, bir yapay zeka kodlama ajanı süreci, izin verilmeyen bir alan adı vb. — bir sinyal nesnesiyle çağırdığı, host sayfanızın tanımladığı bir global fonksiyondur. Olayı arka ucunuza raporlamak için kullanın (örneğin navigator.sendBeacon). Hook, saf bir telemetri alıcısıdır: dönüş değeri göz ardı edilir ve eksik ya da hata fırlatan bir hook, bir savunmayı asla devre dışı bırakamayan sessiz bir işlemsizliktir. Bir savunmanın tespit anında ne yaptığını değiştirmek için vmDefenseReaction seçeneğini kullanın.

aliases, isteğe bağlı olarak o sinyal nesnesinin alanlarını yeniden adlandırır — aşağıdaki Sinyal alanlarını yeniden adlandırma bölümünde ele alınmıştır.

Sinyal nesnesi. Hook, tek bir signal alır:

  • source — tetiklenen belirli dedektör (tabloya bakın).
  • category — altında raporladığı grup: automation (insan olmayan tarayıcılar), debugger (bir hata ayıklayıcı/denetleyici etkin), sandbox (araçsallaştırılmış/sahte host), domain (alan adı kilidi ihlali), tamper (çalışma zamanında yamalanmış yerleşikler) veya integrity (VM'in kendi kodu değiştirildi).
  • score / threshold — dedektörün ne kadar güçlü tetiklendiği ve ulaşması gereken değer; hook yalnızca score >= threshold olduğunda tetiklenir. Çoğu kontrol ya hep ya hiçtir (tek belirleyici bir sinyal); headless, birkaç tarayıcı-şekli sinyalini toplar, dolayısıyla score değeri genellikle threshold değerinden yüksektir.
sourcetespit ettiğicategory
integrityobfuscate edilmiş VM kodunun kendisi değiştirilmişintegrity
nodeNode.js altında çalışan, tarayıcı hedefli koddebugger
debuggerekli veya etkin bir hata ayıklayıcı ya da denetleyici oturumu ya da bir hata ayıklama ortamıdebugger
headlesskodu çalıştırmak için headless bir tarayıcı kullanılıyorautomation
agentkodu çalıştıran bir yapay zeka kodlama ajanıautomation
timingbir kesme noktası veya adım adım ilerleyen bir hata ayıklayıcıyı düşündüren bir yürütme duraklamasıdebugger
sandboxkod bir sandbox'ta veya sahte bir host ortamında çalışıyorsandbox
domainsayfa origin'i vmDomainLock izin listesinde değildomain
nativeHookyerel bir yerleşik fonksiyon değiştirilmiş veya hook'lanmıştamper

Hook'u kaydetme. Onu, obfuscate edilmiş paket yüklenmeden önce düz bir global olarak tanımlayın — VM çalışma zamanı ve savunmaları (korunan) programınızdan önce çalışır, dolayısıyla birçok tespit başlangıç sırasında tetiklenir:

// in your page, before the obfuscated script:
window.__vmDetection = function (signal) { navigator.sendBeacon('/vm-defense', JSON.stringify(signal)); };
// obfuscation option:
vmDefenseHook: { name: '__vmDetection' }

Obfuscate edilmiş kaynağın içinde tanımlanan bir hook, başlangıç zamanındaki tespitleri yakalamak için çok geç kaydedilir ve VM ile derlenirse programınız çalışana kadar erişilemez. Her iki durumda da güvende tutulur (eksik bir hook işlemsizdir ve bir yeniden giriş koruması herhangi bir kontrolsüz durumu önler), ancak tam kapsam için onu önceden kaydedin. Raporlama mantığınızı yine de korumak için kaydedilen hook'u tek satırlık bir tampon olarak tutun ((window.__vmDet = window.__vmDet || []).push(signal)) ve o tamponu obfuscate edilmiş kodunuzdan okuyup gönderin.

Sinyal alanlarını yeniden adlandırma (aliases). Varsayılan source/category değerleri açıklayıcı adlardır, dolayısıyla geri çağırmayı araçsallaştıran (veya çıktıyı okuyan) herkes, korumayı ve hangi dedektörün tetiklendiğini tanıyabilir. aliases, sinyal alanlarını seçtiğiniz opak tokenlara yeniden adlandırır ve bunu sinyal yayılmadan önce VM içinde uygular; böylece bu adlar çıktıda hiç görünmez ve geri çağırmaya ulaşmaz. Uygulamanız kendi eşlemesini bilir ve tokenları arka ucunuza iletir.

Takma adlar alan başınadır ve anahtar ile değer yeniden adlandırmalarını ayrı tutar: her alan bir key alır (geri çağırmanın aldığı özellik adı); string ad-alanları source ve category ayrıca bir values eşlemesi alırken, score/threshold sayıdır ve yalnızca bir key alır. Eşleyebileceğiniz adlar (başka her şey derleme zamanında reddedilir):

  • alan anahtarlarısource, category, score, threshold
  • source değerleriheadless, agent, node, debugger, timing, sandbox, domain, nativeHook, integrity
  • category değerleriautomation, debugger, sandbox, domain, tamper, integrity
vmDefenseHook: {
    name: '__vmDetection',
    aliases: {
        source:    { key: 'a8Qm', values: { headless: 'xP4m9Q' } },
        category:  { key: 'p3Tx', values: { automation: 'bQ7s1M' } },
        score:     { key: 's1' },
        threshold: { key: 't1' }
    }
    // the callback now receives e.g. { a8Qm: 'xP4m9Q', p3Tx: 'bQ7s1M', s1: <score>, t1: <threshold> }
}

Bu, gizlilik değil, parmak izinden kaçınmadır — eşleme yine de tekrarlı testlerle çıkarsanabilir — dolayısıyla tek yararı, sabit ve kendini açıklayan adları açığa çıkarmamaktır. Ayarlanmamış girdiler varsayılan adlarını korur.

Çıplak bir string (vmDefenseHook: '__vmDetection'), { name: '__vmDetection' } için kısayol olarak kabul edilir ancak kullanımdan kaldırılmıştır — nesne biçimini tercih edin.

vmDefenseReaction

Type: object Default: { automation: 'break', debugger: 'decoy', sandbox: 'decoy', domain: 'break', tamper: 'break', integrity: 'break' }

Her tespit kategorisinin nasıl tepki verdiğini yapılandırır. Hiçbir şeyi etkinleştirmez — savunmaların kendisi vmSelfDefending, vmDebugProtection ve vmDomainLock tarafından açılır; bu seçenek yalnızca etkin bir savunmanın nasıl tepki vereceğini seçer. Denetim birimi kategoridir — bir kategorideki her dedektör, o kategorinin tepkisini uygular.

Her kategori, bir tür düşmanca durumu gözleyen dedektörleri gruplandırır. Bir kategori yalnızca dedektörlerini yayan seçenek etkinleştirildiğinde tepki verir:

KategoriEtkinleştirenNe zaman tepki verir
automationvmSelfDefending veya vmDebugProtectionKod, bir kişi yerine yazılım tarafından sürülüyor: headless veya otomatikleştirilmiş bir tarayıcı, bir kazıma / test çerçevesi ya da sayfayı adım adım ilerleten bir yapay zeka kodlama ajanı.
debuggervmDebugProtection veya vmSelfDefendingBiri, bir hata ayıklayıcıyı ya da tarayıcının geliştirici araçları denetleyicisini açmış ve onu anlamak için çalışan kodda adım adım ilerliyor.
sandboxvmDebugProtectionKod gerçek bir tarayıcıda hiç çalışmıyor — çevrimdışı yürütülüp incelenmek üzere öykünülmüş veya betiklenmiş bir JavaScript ortamına taşınmış.
domainvmDomainLockKod, yetki vermediğiniz bir sitede çalışıyor: vmDomainLock izin listenizde olmayan bir host (örneğin paketiniz başka birinin alan adına kopyalanmış).
tampervmSelfDefendingVM'in etrafındaki JavaScript ortamı, onu izlemek veya ele geçirmek için değiştirilmiş; örneğin yerel tarayıcı yerleşikleri araçsallaştırılmış sürümlerle değiştirilmiş.
integrityvmSelfDefendingKorunan paketin kendi kodu, siz onu ürettiğinizden bu yana düzenlenmiş veya yamalanmış.

Her kategori, vmSelfDefending, vmDebugProtection ve vmDomainLock seçeneklerinden birine veya daha fazlasına eşlenir; bu üç seçeneğin dışında bir kategori yoktur ve seçeneği kapalı olan bir kategori için ayarlanan bir tepkinin hiçbir etkisi olmaz.

Anahtarlar bu altı kategori adı veya default'tur (belirtilmemiş kategoriler için bir yedek). Değerler şunlardır:

  • break — hemen kes
  • decoy — zehirlenmiş durumla çalışmaya devam et, sessizce yanlış sonuçlar üret
  • none — yerel olarak hiçbir şey yapma (yalnızca telemetri)

Kategori başına varsayılanlar yukarıda gösterilmiştir; ayarlamadığınız (veya varsayılan değerine ayarladığınız) bir kategori o varsayılanı kullanır. default, doğru-yapı gereği olanlar (integrity, tamper) dahil her kategoriye ulaşır; dolayısıyla { default: 'none' } gerçekten bozmayan, yalnızca telemetri sağlayan bir derlemedir:

vmDefenseReaction: { default: 'none' }              // never break — pair with vmDefenseHook
vmDefenseReaction: { automation: 'none', domain: 'break' }   // tolerate automation FPs, still break on a bad domain

vmStatefulOpcodes

Type: boolean Default: false

Opcode anlamlarını bayt kodundaki konuma bağımlı hale getirir. Her konum, bir tohumdan türetilen farklı bir opcode'dan işleyiciye eşlemeye sahiptir; böylece aynı opcode numarası farklı konumlarda farklı işlemler gerçekleştirir.

vmCallContextOpcodes

Type: boolean Default: false

Korunan bir fonksiyonu nereden çağrıldığına bağımlı hale getirir; böylece koddan çıkarılıp tek başına çalıştırılamaz veya analiz edilemez — yalnızca programdaki gerçek çağrı noktaları aracılığıyla çağrıldığında doğru davranır. Bu seçenek çalışma zamanı performansını etkiler.

Şu anda yalnızca aşağıdaki yapılar desteklenir:

  • fonksiyon bildirimleri (function f() {});
  • bir değişkene atanan fonksiyon ifadeleri ve arrow fonksiyonlar (const f = () => {});
  • örnek özel metotları (this.#m()).

Her durumda fonksiyona her zaman doğrudan bir çağrıyla ulaşılmalıdır (f(), this.#m()). Başka bir değişkende saklanırsa, argüman olarak geçirilirse veya başka bir şekilde değer olarak kullanılırsa, korumasız bırakılır. Async fonksiyonlar desteklenir; üreteçler desteklenmez.

Bu seçenek deneyseldir ve kodunuzu bozabilir, dolayısıyla kullanmadan önce çıktıyı iyice test edin.

vmStackEncoding

Type: boolean Default: false

Yürütme sırasında VM yığınındaki değerleri şifreler. Değerler yığına eklenirken (push) kodlanır ve çıkarılırken (pop) çözülür; böylece bellek incelemesi gerçek değerler yerine şifrelenmiş veri gösterir.

Bu seçenek performansı ağır biçimde etkiler.

vmCompactDispatcher

Type: boolean Default: false

İkili yürütücüler (sync + generator) yerine tek bir VM yürütücüsü kullanır. Obfuscate edilmiş kod boyutunu azaltır ancak yoğun özyineleme içeren kodda ~%20 performans ek yükü ekler.

  • false (varsayılan): ikili yürütücüler — optimal performans, daha büyük çıktı
  • true: tek yürütücü — daha küçük çıktı, biraz daha yavaş

vmStringArrayBytecodeOnly

Type: boolean Default: false

Etkinleştirildiğinde, string array stringleri yalnızca bayt kodu verilerinden çıkarır — koddaki başka hiçbir string dönüştürülmez. Bu, açıkça ayarlanmamış olsa bile stringArray'i zorla etkinleştirir.

Neden kullanılır: Tüm VM çalışma zamanı stringlerini bir string array'e çıkarmak yavaştır. Bu seçenek, string array çıkarımı için yalnızca bayt kodu içeriğini hedefler; bayt kodu sabitlerini korumaya devam ederken performansı artırır.

  • vmBytecodeArrayEncoding: false olduğunda — bayt kodu sabit havuzlarındaki (c dizileri) stringler çıkarılır
  • vmBytecodeArrayEncoding: true olduğunda — üst düzey base64 kodlu bayt kodu stringleri çıkarılır
  • stringArrayThreshold, bu bayt kodu stringlerinin yüzde kaçının çıkarılacağını yine de denetler

vmDomainLock

Type: string[] Default: []

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Obfuscate edilmiş kodu belirli alan adlarıyla ve/veya alt alan adlarıyla sınırlar ve domainLock'a göre bulunması ve sökülmesi çok daha zordur.

Kaynak kod bu seçenekle belirtilen alan adlarında çalıştırılmazsa, tarayıcı vmDomainLockRedirectUrl seçeneğine geçirilen URL'ye yönlendirilir ve yönlendirme bastırılsa bile sonraki korunan çağrılar yanlış sonuçlar döndürür.

Birden çok alan adı ve alt alan adı

Kodunuzu birden fazla alan adına veya alt alan adına kilitlemek mümkündür. Örneğin, kodun yalnızca www.example.com üzerinde çalışacak şekilde kilitlemek için www.example.com ekleyin. Kök alan adında ve tüm alt alan adları dahil (example.com, sub.example.com) çalışmasını sağlamak için .example.com kullanın.

vmDomainLockRedirectUrl

Type: string Default: about:blank

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Kaynak kod vmDomainLock ile belirtilen alan adlarında çalıştırılmazsa, tarayıcının geçirilen bir URL'ye yönlendirilmesine olanak tanır.

Preset Options

Yüksek obfuscation, düşük performans

Performans, obfuscation olmadan olduğundan çok daha yavaş olacaktır

{
    compact: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 1,
    deadCodeInjection: true,
    deadCodeInjectionThreshold: 1,
    debugProtection: true,
    debugProtectionInterval: 4000,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: true,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: true,
    splitStringsChunkLength: 5,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayEncoding: ['rc4'],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 5,
    stringArrayWrappersChainedCalls: true,    
    stringArrayWrappersParametersMaxCount: 5,
    stringArrayWrappersType: 'function',
    stringArrayThreshold: 1,
    transformObjectKeys: true
}

Orta obfuscation, optimal performans

Performans, obfuscation olmadan olduğundan daha yavaş olacaktır

{
    compact: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 0.75,
    deadCodeInjection: true,
    deadCodeInjectionThreshold: 0.4,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: true,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: true,
    splitStringsChunkLength: 10,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayCallsTransformThreshold: 0.75,
    stringArrayEncoding: ['base64'],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 2,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 4,
    stringArrayWrappersType: 'function',
    stringArrayThreshold: 0.75,
    transformObjectKeys: true
}

Düşük obfuscation, Yüksek performans

Performans nispeten normal bir seviyede olacaktır

{
    compact: true,
    controlFlowFlattening: false,
    deadCodeInjection: false,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: false,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: false,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: false,
    stringArrayEncoding: [],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 1,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 2,
    stringArrayWrappersType: 'variable',
    stringArrayThreshold: 0.75
}

Varsayılan hazır ayar, Yüksek performans

{
    compact: true,
    controlFlowFlattening: false,
    deadCodeInjection: false,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: false,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: false,
    renameGlobals: false,
    selfDefending: false,
    simplify: true,
    splitStrings: false,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: false,
    stringArrayCallsTransformThreshold: 0.5,
    stringArrayEncoding: [],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 1,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 2,
    stringArrayWrappersType: 'variable',
    stringArrayThreshold: 0.75
}

VM Ultra High obfuscation (Maksimum Güvenlik)

Bu hazır ayar, dolaylı dağıtım dahil tüm sağlamlaştırma özellikleriyle VM tabanlı bayt kodu obfuscation'ını etkinleştirir. En güçlü korumayı sağlar ancak daha büyük çıktı boyutu ve çok daha yavaş yürütme ile.

{
    optionsPreset: 'vm-ultra-high-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,

    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,

    vmBytecodeEncoding: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: true,
    vmMacroOps: true,
    vmDebugProtection: true,
    vmSelfDefending: true,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: true,
    vmCallContextOpcodes: false,
    vmStackEncoding: true,
    vmCompactDispatcher: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 0.5,
    deadCodeInjection: true,
    deadCodeInjectionThreshold: 0.5,
    debugProtection: true,
    debugProtectionInterval: 4000,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: true,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: true,
    splitStringsChunkLength: 5,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayEncoding: ['rc4'],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 5,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 5,
    stringArrayWrappersType: 'function',
    stringArrayThreshold: 0.5,
    transformObjectKeys: true
}

VM Anti-LLM (Yapay Zeka Ajanı Koruması)

Bu hazır ayar, yapay zeka ajanlarının ve LLM'lerin VM bayt koduna dönüştürülmüş kodu tersine mühendislikle çözmesini önlemek için özel olarak tasarlanmıştır. vm-default temel alınarak self-defending ve debug protection etkinleştirilmiştir. vm-high-obfuscation'dan daha hafiftir ancak özellikle otomatik analize karşı sağlamlaştırılmıştır.

{
    optionsPreset: 'vm-anti-llm'
}

İçerir:

  • String array ile VM bayt kodu obfuscation (vm-default'tan)
  • vmSelfDefending — hook karşıtı tespit, bütünlük karması, kaynak parmak izi, iframe temiz-realm doğrulaması, ARX şifre anahtarı türetme
  • vmDebugProtection — VM dağıtım döngüsünde hata ayıklama karşıtı kontroller
  • debugProtection: false — eski debug protection yok (VM debug protection üstündür)

VM High obfuscation (En Yüksek Güvenlik)

Bu hazır ayar, çoğu sağlamlaştırma özelliğiyle VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Ultra-high hazır ayarından daha iyi performansla güçlü koruma sağlar.

{
    optionsPreset: 'vm-high-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,
    vmBytecodeEncoding: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: true,
    vmMacroOps: true,
    vmDebugProtection: true,
    vmSelfDefending: true,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: true,
    vmCallContextOpcodes: false,
    vmStackEncoding: true,
    vmCompactDispatcher: false
}

VM Medium obfuscation (Dengeli Güvenlik)

Bu hazır ayar, dengeli bir sağlamlaştırma özellikleri kümesiyle VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Güvenlik ile performans arasında iyi bir uzlaşma.

{
    optionsPreset: 'vm-medium-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,
    vmBytecodeEncoding: true,
    vmBytecodeArrayEncoding: false,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: true,
    vmMacroOps: true,
    vmDebugProtection: true,
    vmSelfDefending: false,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: false,
    vmCallContextOpcodes: false,
    vmStackEncoding: false,
    vmCompactDispatcher: false
}

VM Low obfuscation (Temel Güvenlik, Daha İyi Performans)

Bu hazır ayar, ek sağlamlaştırma özellikleri olmadan temel VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Güvenlik ile çıktı boyutu arasında iyi bir denge.

{
    optionsPreset: 'vm-low-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: false,
    vmBytecodeEncoding: false,
    vmBytecodeArrayEncoding: false,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: false,
    vmMacroOps: false,
    vmDebugProtection: false,
    vmSelfDefending: false,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: false,
    vmCallContextOpcodes: false,
    vmStackEncoding: false,
    vmCompactDispatcher: false
}

VM Default (VM + String Array Koruması)

Bu hazır ayar, temel VM tabanlı bayt kodu obfuscation'ını string array korumasıyla birleştirir. String koruması ile VM obfuscation için iyi bir başlangıç noktası.

{
    optionsPreset: 'vm-default'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,
    vmBytecodeEncoding: false,
    vmBytecodeArrayEncoding: true,
    vmStringArrayBytecodeOnly: true,
    vmAsyncExecutor: false,
    vmJumpsEncoding: false,
    vmMacroOps: false,
    vmDebugProtection: false,
    vmSelfDefending: false,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: false,
    vmCallContextOpcodes: false,
    vmStackEncoding: false,
    vmCompactDispatcher: false,
    stringArray: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayThreshold: 1,
    stringArrayIndexShift: true,
    stringArrayIndexesType: ['hexadecimal-number'],
    stringArrayCallsTransform: true,
    stringArrayCallsTransformThreshold: 1,
    stringArrayWrappersCount: 3,
    stringArrayWrappersType: 'function',
    stringArrayWrappersParametersMaxCount: 5,
    stringArrayWrappersChainedCalls: true,
    stringArrayEncoding: ['base64'],
    splitStrings: true,
    splitStringsChunkLength: 6
}

compact

Type: boolean Default: true

Kod çıktısını tek satırda sıkıştırır.

config

Type: string Default: ``

Obfuscator seçeneklerini içeren JS/JSON yapılandırma dosyasının adı. Bunlar, doğrudan CLI'ya geçirilen seçenekler tarafından geçersiz kılınır

controlFlowFlattening

Type: boolean Default: false

⚠️ Bu seçenek performansı büyük ölçüde etkiler ve çalışma zamanı hızını 1,5 kata kadar yavaşlatabilir. Kontrol akışı düzleştirmeden etkilenecek düğümlerin yüzdesini ayarlamak için controlFlowFlatteningThreshold seçeneğini kullanın.

Kodun kontrol akışı düzleştirmesini etkinleştirir. Kontrol akışı düzleştirme, program anlaşılırlığını zorlaştıran, kaynak kodun yapısal bir dönüşümüdür.

Örnek:

// input
(function(){
    function foo () {
        return function () {
            var sum = 1 + 2;
            console.log(1);
            console.log(2);
            console.log(3);
            console.log(4);
            console.log(5);
            console.log(6);
        }
    }
    
    foo()();
})();

// output
(function () {
    function _0x3bfc5c() {
        return function () {
            var _0x3260a5 = {
                'WtABe': '4|0|6|5|3|2|1',
                'GokKo': function _0xf87260(_0x427a8e, _0x43354c) {
                    return _0x427a8e + _0x43354c;
                }
            };
            var _0x1ad4d6 = _0x3260a5['WtABe']['split']('|'), _0x1a7b12 = 0x0;
            while (!![]) {
                switch (_0x1ad4d6[_0x1a7b12++]) {
                case '0':
                    console['log'](0x1);
                    continue;
                case '1':
                    console['log'](0x6);
                    continue;
                case '2':
                    console['log'](0x5);
                    continue;
                case '3':
                    console['log'](0x4);
                    continue;
                case '4':
                    var _0x1f2f2f = _0x3260a5['GokKo'](0x1, 0x2);
                    continue;
                case '5':
                    console['log'](0x3);
                    continue;
                case '6':
                    console['log'](0x2);
                    continue;
                }
                break;
            }
        };
    }

	_0x3bfc5c()();
}());

controlFlowFlatteningThreshold

Type: number Default: 0.75 Min: 0 Max: 1

controlFlowFlattening dönüşümünün belirli bir düğüme uygulanma olasılığı.

Bu ayar, özellikle büyük kod boyutları için kullanışlıdır çünkü çok sayıda kontrol akışı dönüşümü kodunuzu yavaşlatabilir ve kod boyutunu artırabilir.

controlFlowFlatteningThreshold: 0, controlFlowFlattening: false ile aynıdır.

deadCodeInjection

Type: boolean Default: false

⚠️ Obfuscate edilmiş kodun boyutunu ciddi biçimde artırır (%200'e kadar); yalnızca obfuscate edilmiş kodun boyutu önemli değilse kullanın. Ölü kod enjeksiyonundan etkilenecek düğümlerin yüzdesini ayarlamak için deadCodeInjectionThreshold seçeneğini kullanın.
⚠️ Bu seçenek stringArray seçeneğini zorla etkinleştirir.
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır.

Bu seçenekle, obfuscate edilmiş koda rastgele ölü kod blokları eklenir.

Örnek:

// input
(function(){
    if (true) {
        var foo = function () {
            console.log('abc');
        };
        var bar = function () {
            console.log('def');
        };
        var baz = function () {
            console.log('ghi');
        };
        var bark = function () {
            console.log('jkl');
        };
        var hawk = function () {
            console.log('mno');
        };

        foo();
        bar();
        baz();
        bark();
        hawk();
    }
})();

// output
var _0x37b8 = [
    'YBCtz',
    'GlrkA',
    'urPbb',
    'abc',
    'NMIhC',
    'yZgAj',
    'zrAId',
    'EtyJA',
    'log',
    'mno',
    'jkl',
    'def',
    'Quzya',
    'IWbBa',
    'ghi'
];
function _0x43a7(_0x12cf56, _0x587376) {
    _0x43a7 = function (_0x2f87a8, _0x47eac2) {
        _0x2f87a8 = _0x2f87a8 - (0x16a7 * 0x1 + 0x5 * 0x151 + -0x1c92);
        var _0x341e03 = _0x37b8[_0x2f87a8];
        return _0x341e03;
    };
    return _0x43a7(_0x12cf56, _0x587376);
}
(function () {
    if (!![]) {
        var _0xbbe28f = function () {
            var _0x2fc85f = _0x43a7;
            if (_0x2fc85f(0xaf) === _0x2fc85f(0xae)) {
                _0x1dd94f[_0x2fc85f(0xb2)](_0x2fc85f(0xb5));
            } else {
                console[_0x2fc85f(0xb2)](_0x2fc85f(0xad));
            }
        };
        var _0x5e46bc = function () {
            var _0x15b472 = _0x43a7;
            if (_0x15b472(0xb6) !== _0x15b472(0xaa)) {
                console[_0x15b472(0xb2)](_0x15b472(0xb5));
            } else {
                _0x47eac2[_0x15b472(0xb2)](_0x15b472(0xad));
            }
        };
        var _0x3669e8 = function () {
            var _0x47a442 = _0x43a7;
            if (_0x47a442(0xb7) !== _0x47a442(0xb0)) {
                console[_0x47a442(0xb2)](_0x47a442(0xb8));
            } else {
                _0x24e0bf[_0x47a442(0xb2)](_0x47a442(0xb3));
            }
        };
        var _0x28b05a = function () {
            var _0x497902 = _0x43a7;
            if (_0x497902(0xb1) === _0x497902(0xb1)) {
                console[_0x497902(0xb2)](_0x497902(0xb4));
            } else {
                _0x59c9c6[_0x497902(0xb2)](_0x497902(0xb4));
            }
        };
        var _0x402a54 = function () {
            var _0x1906b7 = _0x43a7;
            if (_0x1906b7(0xab) === _0x1906b7(0xac)) {
                _0xb89cd0[_0x1906b7(0xb2)](_0x1906b7(0xb8));
            } else {
                console[_0x1906b7(0xb2)](_0x1906b7(0xb3));
            }
        };
        _0xbbe28f();
        _0x5e46bc();
        _0x3669e8();
        _0x28b05a();
        _0x402a54();
    }
}());

deadCodeInjectionThreshold

Type: number Default: 0.4 Min: 0 Max: 1

deadCodeInjection seçeneğinden etkilenecek düğümlerin yüzdesini ayarlamaya olanak tanır.

debugProtection

Type: boolean Default: false

⚠️ Geliştirici Araçları'nı açarsanız tarayıcınızı dondurabilir.
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır. Bunun yerine vmDebugProtection seçeneğini kullanın.

Bu seçenek, Geliştirici Araçları'nın debugger işlevini kullanmayı neredeyse imkânsız hale getirir (hem WebKit tabanlı tarayıcılarda hem de Mozilla Firefox'ta).

debugProtectionInterval

Type: number Default: 0

⚠️ Tarayıcınızı dondurabilir! Kendi sorumluluğunuzda kullanın.
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır. Bunun yerine vmDebugProtection seçeneğini kullanın.

Ayarlanırsa, milisaniye cinsinden bir aralık kullanılarak Konsol sekmesinde hata ayıklama modu zorlanır ve Geliştirici Araçları'nın diğer özelliklerini kullanmak zorlaşır. debugProtection etkinse çalışır. Önerilen değer 2000 ile 4000 milisaniye arasındadır.

disableConsoleOutput

Type: boolean Default: false

⚠️ Bu seçenek, tüm betikler için console çağrılarını genel olarak devre dışı bırakır

console.log, console.info, console.error, console.warn, console.debug, console.exception ve console.trace çağrılarını boş fonksiyonlarla değiştirerek kullanımlarını devre dışı bırakır. Bu, hata ayıklayıcının kullanımını zorlaştırır.

domainLock

Type: string[] Default: []

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Obfuscate edilmiş kaynak kodun yalnızca belirli alan adlarında ve/veya alt alan adlarında çalıştırılmasına olanak tanır. Bu, birinin kaynak kodunuzu kopyalayıp başka bir yerde çalıştırmasını gerçekten zorlaştırır.

Kaynak kod bu seçenekle belirtilen alan adlarında çalıştırılmazsa, tarayıcı domainLockRedirectUrl seçeneğine geçirilen URL'ye yönlendirilir.

Birden çok alan adı ve alt alan adı

Kodunuzu birden fazla alan adına veya alt alan adına kilitlemek mümkündür. Örneğin, kodun yalnızca www.example.com üzerinde çalışacak şekilde kilitlemek için www.example.com ekleyin. Kök alan adında ve tüm alt alan adları dahil (example.com, sub.example.com) çalışmasını sağlamak için .example.com kullanın.

domainLockRedirectUrl

Type: string Default: about:blank

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Kaynak kod domainLock ile belirtilen alan adlarında çalıştırılmazsa, tarayıcının geçirilen bir URL'ye yönlendirilmesine olanak tanır

exclude

Type: string[] Default: []

Obfuscation'dan hariç tutulacak dosyaları belirten dosya adları veya glob desenleri.

forceTransformStrings

Type: string[] Default: []

Geçirilen RegExp desenleriyle eşleşen string değişmezlerinin zorla dönüştürülmesini etkinleştirir.

⚠️ Bu seçenek yalnızca stringArrayThreshold (veya gelecekte olası diğer eşikler) tarafından dönüştürülmemesi gereken stringleri etkiler

Seçenek, reservedStrings seçeneğine göre önceliklidir ancak conditional comments (koşullu yorumlar) karşısında öncelikli değildir.

Örnek:

	{
		forceTransformStrings: [
			'some-important-value',
			'some-string_\d'
		]
	}

identifierNamesCache

Type: Object | null Default: null

Bu seçeneğin temel amacı, birden çok kaynağın/dosyanın obfuscation'ı sırasında aynı tanımlayıcı adlarını kullanabilmektir.

Şu anda iki tür tanımlayıcı desteklenir:

  • Global tanımlayıcılar:
    • Tüm global tanımlayıcılar önbelleğe yazılır;
    • Eşleşen tüm bildirilmemiş global tanımlayıcılar önbellekteki değerlerle değiştirilir.
  • Özellik tanımlayıcıları, yalnızca renameProperties seçeneği etkinleştirildiğinde:
    • Tüm özellik tanımlayıcıları önbelleğe yazılır;
    • Eşleşen tüm özellik tanımlayıcıları önbellekteki değerlerle değiştirilir.

Node.js API

null değeri geçirilirse önbellek tamamen devre dışı bırakılır.

Boş bir nesne ({}) geçirilirse, tanımlayıcı adlarının önbellek nesnesine (TIdentifierNamesCache türü) yazılması etkinleştirilir. Bu önbellek nesnesine, ObfuscationResult nesnesinin getIdentifierNamesCache metot çağrısı aracılığıyla erişilir.

Ortaya çıkan önbellek nesnesi, sonraki kaynakların eşleşen tüm tanımlayıcı adlarının obfuscation'ı sırasında bu adları kullanmak için identifierNamesGenerator seçeneği değeri olarak kullanılabilir.

Örnek:

const source1ObfuscationResult = JavaScriptObfuscator.obfuscate(
    `
        function foo(arg) {
           console.log(arg)
        }
        
        function bar() {
            var bark = 2;
        }
    `,
    {
        compact: false,
        identifierNamesCache: {},
        renameGlobals: true
    }
)

console.log(source1ObfuscationResult.getIdentifierNamesCache());
/*
    { 
        globalIdentifiers: {
            foo: '_0x5de86d',
            bar: '_0x2a943b'
        }
    }
*/



const source2ObfuscationResult = JavaScriptObfuscator.obfuscate(
    `
        // Expecting that these global functions are defined in another obfuscated file
        foo(1);
        bar();
        
        // Expecting that this global function is defined in third-party package
        baz();
    `,
    {
        compact: false,
        identifierNamesCache: source1ObfuscationResult.getIdentifierNamesCache(),
        renameGlobals: true
    }
)

console.log(source2ObfuscationResult.getObfuscatedCode());
/*
    _0x5de86d(0x1);
    _0x2a943b();
    baz();
 */

CLI

CLI'da, tanımlayıcı adları önbelleğini okumak ve yazmak için kullanılacak mevcut bir .json dosyasına yol tanımlamaya olanak tanıyan farklı bir --identifier-names-cache-path seçeneği bulunur.

Boş bir dosyaya yol geçirilirse - tanımlayıcı adları önbelleği o dosyaya yazılır.

Mevcut önbelleği içeren bu dosya, sonraki dosyaların eşleşen tüm tanımlayıcı adlarının obfuscation'ı sırasında bu adları kullanmak için tekrar --identifier-names-cache-path seçeneği değeri olarak kullanılabilir.

identifierNamesGenerator

Type: string Default: hexadecimal

Tanımlayıcı adları üreticisini ayarlar.

Kullanılabilir değerler:

  • dictionary: identifiersDictionary listesinden tanımlayıcı adları
  • hexadecimal: _0xabc123 gibi tanımlayıcı adları
  • mangled: a, b, c gibi kısa tanımlayıcı adları
  • mangled-shuffled: mangled ile aynı, ancak alfabesi karıştırılmış

identifiersDictionary

Type: string[] Default: []

identifierNamesGenerator: dictionary seçeneği için tanımlayıcı sözlüğünü ayarlar. Sözlükteki her tanımlayıcı, her karakterin farklı büyük/küçük harf düzeniyle birkaç varyantta kullanılır. Bu nedenle, sözlükteki tanımlayıcı sayısı orijinal kaynak kodundaki tanımlayıcı miktarına bağlı olmalıdır.

identifiersPrefix

Type: string Default: ''

Tüm global tanımlayıcılar için önek ayarlar.

Birden çok dosyayı obfuscate etmek istediğinizde bu seçeneği kullanın. Bu seçenek, bu dosyaların global tanımlayıcıları arasındaki çakışmaların önlenmesine yardımcı olur. Önek her dosya için farklı olmalıdır.

randomIdentifiersPrefix

Type: boolean Default: false

Tüm global tanımlayıcıların önüne tohumlanmış rastgele bir önek (6 alfasayısal karakter) ekler. Aynı global kapsama yüklenen, ayrı ayrı obfuscate edilmiş paketler arasındaki çakışmaları önlemek için bu seçeneği kullanın — her paket için elle benzersiz bir identifiersPrefix seçme gereğini ortadan kaldırır.

  • Rastgele değer, seed seçeneğinden ve kaynak kodu karmasından türetilir; böylece aynı tohumla yapılan yeniden üretilebilir derlemeler aynı öneki üretir.
  • identifiersPrefix ile birleştirildiğinde, rastgele karakterler kullanıcının sağladığı önekin sonuna eklenir (örneğin myApp + rastgele aBc123myAppaBc123).
  • vmObfuscation ile birleştirildiğinde, rastgele değer varsayılan vm önekinin yerini alır — rastgelelik zaten benzersizliği garanti eder.

ignoreImports

Type: boolean Default: false

require içe aktarmalarının obfuscation'ını önler. Çalışma zamanı ortamının bir nedenle bu içe aktarmaları yalnızca statik stringlerle gerektirdiği bazı durumlarda yardımcı olabilir.

inputFileName

Type: string Default: ''

Kaynak kodu içeren girdi dosyasının adını ayarlamaya olanak tanır. Bu ad, source map üretimi için dahili olarak kullanılır. NodeJS API kullanılırken ve sourceMapSourcesMode seçeneği sources değerine sahipken gereklidir.

log

Type: boolean Default: false

Bilgilerin konsola günlüğe kaydedilmesini etkinleştirir.

numbersToExpressions

Type: boolean Default: false

Sayıların ifadelere dönüştürülmesini etkinleştirir

Örnek:

// input
const foo = 1234;

// output
const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;

optionsPreset

Type: string Default: default

Bir seçenek hazır ayarı ayarlamaya olanak tanır.

Kullanılabilir değerler:

  • vm-default;
  • vm-low-obfuscation;
  • vm-medium-obfuscation;
  • vm-high-obfuscation;
  • vm-ultra-high-obfuscation;
  • vm-anti-llm;
  • default;
  • low-obfuscation;
  • medium-obfuscation;
  • high-obfuscation.

Ek seçeneklerin tümü, seçili seçenek hazır ayarıyla birleştirilir.

parseHtml

Type: boolean Default: false

HTML <script> etiketleri içindeki JavaScript'in obfuscation'ını etkinleştirir.

Etkinleştirildiğinde, obfuscator şunları yapar:

  • Girdinin HTML olup olmadığını otomatik olarak tespit eder (<!DOCTYPE, <html>, <head>, <body> veya <script> etiketlerini kontrol ederek)
  • data-javascript-obfuscator özniteliğiyle işaretlenmiş <script> etiketlerinden JavaScript'i çıkarır
  • HTML yapısını korurken işaretlenmiş her betiği ayrı ayrı obfuscate eder
  • Obfuscate edilmiş kodu orijinal konumlarına geri enjekte eder

Önemli: Yalnızca data-javascript-obfuscator özniteliğine sahip betikler obfuscate edilir. İşaretlenmiş her betik ayrı ayrı ve bağımsız olarak obfuscate edilir. Bu şu anlama gelir:

  • İşaretlenmiş betik etiketleri içindeki kod izole edilmelidir - diğer işaretlenmiş betik etiketlerinde tanımlanan değişkenlere, fonksiyonlara veya sınıflara başvurMAMALIDIR
  • İşaretlenmemiş betikler, işaretlenmiş betikler tarafından tanımlanan global'lere yine de erişebilir (var bildirimleri veya açık globalThis atamaları aracılığıyla)
  • Bu, hangi betikleri koruyacağınız üzerinde açık denetim sağlar

Obfuscate edilir (data-javascript-obfuscator özniteliğine sahip olmalıdır):

  • <script data-javascript-obfuscator> - normal betikler
  • <script type="text/javascript" data-javascript-obfuscator> - açıkça türü belirtilmiş betikler
  • Herhangi bir ek özniteliğe sahip betikler (id, class, diğer data-*, vb.)

Atlanır (değiştirilmeden bırakılır):

  • data-javascript-obfuscator özniteliği olmayan betikler
  • <script type="module"> - ES modülleri (öznitelik olsa bile)
  • <script src="..."> - harici betikler (öznitelik olsa bile)
  • Boş betik etiketleri

Not: parseHtml etkinleştirildiğinde source map'ler üretilmez, çünkü HTML çıktısına doğru şekilde eşlenmezler.

Örnek:

// input
const html = `<!DOCTYPE html>
<html>
<body>
<!-- This script will NOT be obfuscated -->
<script>
var helper = 'utility';
</script>

<!-- This script WILL be obfuscated -->
<script data-javascript-obfuscator>
var greeting = 'Hello World';
console.log(greeting);
</script>
</body>
</html>`;

JavaScriptObfuscator.obfuscate(html, {
    parseHtml: true,
    stringArray: true
});

// output: HTML with only the marked script obfuscated

renameGlobals

Type: boolean Default: false

⚠️ bu seçenek kodunuzu bozabilir. Yalnızca ne yaptığını biliyorsanız etkinleştirin!

Global değişken ve fonksiyon adlarının bildirimiyle birlikte obfuscation'ını etkinleştirir.

Bu seçenek devre dışı bırakıldığında ve girdi kodu global kapsamda fonksiyonlar veya sınıflar bildirdiğinde (yani kod bir IIFE içine sarmalanmadığında), adları obfuscate edilmiş çıktıda olduğu gibi korunur — diğer betikler bunlara adlarıyla başvurabilir. vmObfuscation altında, bu adları listeleyen bir VMGlobalFunctionNamesNotRenamed uyarısı raporlanır; çünkü fonksiyon gövdesi bayt kodu olarak gizlenir ancak okunabilir üst düzey ad, kodun ne yaptığını yine de açığa çıkarır (örneğin bir LLM'e). Bu maruz kalmayı önlemek için kodu bir IIFE içine sarmalayın veya bu seçeneği etkinleştirin.

renameProperties

Type: boolean Default: false

⚠️ bu seçenek kodunuzu BOZABİLİR. Yalnızca ne yaptığını biliyorsanız etkinleştirin!

Özellik adlarının yeniden adlandırılmasını etkinleştirir. Tüm yerleşik DOM özellikleri ve çekirdek JavaScript sınıflarındaki özellikler göz ardı edilir.

Bu seçeneğin safe ve unsafe modları arasında geçiş yapmak için renamePropertiesMode seçeneğini kullanın.

Yeniden adlandırılan özellik adlarının biçimini ayarlamak için identifierNamesGenerator seçeneğini kullanın.

Hangi özelliklerin yeniden adlandırılacağını denetlemek için reservedNames seçeneğini kullanın.

Örnek:

// input
(function () {
    const foo = {
        prop1: 1,
        prop2: 2,
        calc: function () {
            return this.prop1 + this.prop2;
        }
    };
    
    console.log(foo.calc());
})();

// output
(function () {
    const _0x46529b = {
        '_0x10cec7': 0x1,
        '_0xc1c0ca': 0x2,
        '_0x4b961d': function () {
            return this['_0x10cec7'] + this['_0xc1c0ca'];
        }
    };
    console['log'](_0x46529b['_0x4b961d']());
}());

renamePropertiesMode

Type: string Default: safe

⚠️ safe modunda bile renameProperties seçeneği kodunuzu BOZABİLİR.

renameProperties seçeneğinin modunu belirtir:

  • safe - 2.11.0 sürümünden sonraki varsayılan davranış. Çalışma zamanı hatalarını önlemek için özellikleri daha güvenli bir şekilde yeniden adlandırmayı dener. Bu modda bazı özellikler yeniden adlandırmadan hariç tutulur.
  • unsafe - 2.11.0 sürümünden önceki varsayılan davranış. Özellikleri herhangi bir kısıtlama olmadan güvensiz bir şekilde yeniden adlandırır.

Bir dosya başka bir dosyadaki özellikleri kullanıyorsa, bu dosyalar arasında aynı özellik adlarını korumak için identifierNamesCache seçeneğini kullanın.

reservedNames

Type: string[] Default: []

Geçirilen RegExp desenleriyle eşleşen tanımlayıcıların obfuscation'ını ve üretilmesini devre dışı bırakır.

Örnek:

	{
		reservedNames: [
			'^someVariable',
			'functionParameter_\d'
		]
	}

reservedStrings

Type: string[] Default: []

Geçirilen RegExp desenleriyle eşleşen string değişmezlerinin dönüştürülmesini devre dışı bırakır. Eşleşen stringler obfuscate edilmiş çıktıda görünür kalır.

VM obfuscation kullanılırken, ayrılmış stringler görünür kalmaları için ayrı bir şifrelenmemiş dizide saklanır. Bu, izleme için API uç noktaları veya kütüphane tanımlayıcıları gibi okunabilir kalması gereken stringler için kullanışlıdır.

Örnek:

	{
		reservedStrings: [
			'react-native',
			'\.\/src\/test',
			'some-string_\d'
		]
	}

seed

Type: string|number Default: 0

Bu seçenek, rastgele üreteç için tohum (seed) değerini ayarlar. Bu, tekrarlanabilir sonuçlar oluşturmak için kullanışlıdır.

Tohum 0 ise - rastgele üreteç tohumsuz çalışır.

selfDefending

Type: boolean Default: false

⚠️ Bu seçenekle obfuscation yaptıktan sonra obfuscate edilmiş kodu hiçbir şekilde değiştirmeyin, çünkü kodu küçültmek (uglify) gibi herhangi bir değişiklik self defending'i tetikleyebilir ve kod artık çalışmaz!
⚠️ Bu seçenek compact değerini zorla true olarak ayarlar
⚠️ Bu seçenek vmObfuscation etkinleştirildiğinde sessizce devre dışı bırakılır. Bunun yerine vmSelfDefending seçeneğini kullanın.

Bu seçenek, çıktı kodunu biçimlendirmeye ve değişken yeniden adlandırmaya karşı dayanıklı hale getirir. Biri obfuscate edilmiş kod üzerinde bir JavaScript güzelleştirici (beautifier) kullanmayı denerse, kod artık çalışmaz; bu da onu anlamayı ve değiştirmeyi zorlaştırır.

simplify

Type: boolean Default: true

Sadeleştirme yoluyla ek kod obfuscation'ını etkinleştirir.

⚠️ gelecek sürümlerde boolean değişmezlerinin obfuscation'ı (true => !![]) bu seçeneğin altına taşınacaktır.

Örnek:

// input
if (condition1) {
    const foo = 1;
    const bar = 2;
  
    console.log(foo);
  
    return bar;
} else if (condition2) {
    console.log(1);
    console.log(2);
    console.log(3);
  
    return 4;
} else {
    return 5;
}

// output
if (condition1) {
    const foo = 0x1, bar = 0x2;
    return console['log'](foo), bar;
} else
    return condition2 ? (console['log'](0x1), console['log'](0x2), console['log'](0x3), 0x4) : 0x5;

sourceMap

Type: boolean Default: false

Obfuscate edilmiş kod için source map üretimini etkinleştirir.

Source map'ler, obfuscate edilmiş JavaScript kaynak kodunuzda hata ayıklamanıza yardımcı olabilir. Üretimde hata ayıklamak isterseniz veya buna ihtiyacınız olursa, ayrı source map dosyasını gizli bir konuma yükleyip tarayıcınızı oraya yönlendirebilirsiniz.

sourceMapBaseUrl

Type: string Default: ``

sourceMapMode: 'separate' olduğunda source map içe aktarma url'sinin temel url'sini ayarlar.

CLI örneği:

javascript-obfuscator input.js --output out.js --source-map true --source-map-base-url 'http://localhost:9000'

Sonuç:

//# sourceMappingURL=http://localhost:9000/out.js.map

sourceMapFileName

Type: string Default: ``

sourceMapMode: 'separate' olduğunda çıktı source map için dosya adını ayarlar.

CLI örneği:

javascript-obfuscator input.js --output out.js --source-map true --source-map-base-url 'http://localhost:9000' --source-map-file-name example

Sonuç:

//# sourceMappingURL=http://localhost:9000/example.js.map

sourceMapMode

Type: string Default: separate

Source map üretim modunu belirtir:

  • inline - her .js dosyasının sonuna source map ekler;
  • separate - source map içeren karşılık gelen '.map' dosyasını üretir. Obfuscator'ı CLI aracılığıyla çalıştırdığınızda - obfuscate edilmiş kodu içeren dosyanın sonuna source map dosyasına bağlantı ekler //# sourceMappingUrl=file.js.map.

sourceMapSourcesMode

Type: string Default: sources-content

Source map'in sources ve sourcesContent alanlarını denetlemeye olanak tanır:

  • sources-content - sahte bir sources alanı ekler, orijinal kaynak kodu içeren bir sourcesContent alanı ekler;
  • sources - geçerli bir kaynak açıklaması içeren bir sources alanı ekler, sourcesContent alanını eklemez. NodeJS API kullanırken, sources alanı değeri olarak kullanılacak inputFileName seçeneğinin tanımlanması gerekir.

splitStrings

Type: boolean Default: false

Değişmez stringleri, splitStringsChunkLength seçeneği değeri uzunluğunda parçalara böler.

Örnek:

// input
(function(){
    var test = 'abcdefg';
})();

// output
(function(){
    var _0x5a21 = 'ab' + 'cd' + 'ef' + 'g';
})();

splitStringsChunkLength

Type: number Default: 10

splitStrings seçeneğinin parça uzunluğunu ayarlar.

stringArray

Type: boolean Default: true

String değişmezlerini kaldırıp özel bir diziye yerleştirir. Örneğin, var m = "Hello World"; içindeki "Hello World" stringi var m = _0x12c456[0x1]; gibi bir şeyle değiştirilir

stringArrayCallsTransform

Type: boolean Default: false

⚠️ stringArray seçeneği etkinleştirilmelidir

stringArray çağrılarının dönüştürülmesini etkinleştirir. Bu çağrıların tüm argümanları, stringArrayCallsTransformThreshold değerine bağlı olarak farklı bir nesneye çıkarılabilir. Böylece string array'e yapılan çağrıları otomatik olarak bulmak daha da zorlaşır.

Örnek:

function foo() {
    var k = {
        c: 0x2f2,
        d: '0x396',
        e: '0x397',
        f: '0x39a',
        g: '0x39d',
        h: 0x398,
        l: 0x394,
        m: '0x39b',
        n: '0x39f',
        o: 0x395,
        p: 0x395,
        q: 0x399,
        r: '0x399'
    };
    var c = i(k.d, k.e);
    var d = i(k.f, k.g);
    var e = i(k.h, k.l);
    var f = i(k.m, k.n);
    function i(c, d) {
        return b(c - k.c, d);
    }
    var g = i(k.o, k.p);
    var h = i(k.q, k.r);
}
function j(c, d) {
    var l = { c: 0x14b };
    return b(c - -l.c, d);
}
console[j(-'0xa6', -'0xa6')](foo());
function b(c, d) {
    var e = a();
    b = function (f, g) {
        f = f - 0xa3;
        var h = e[f];
        return h;
    };
    return b(c, d);
}
function a() {
    var m = [
        'string5',
        'string1',
        'log',
        'string3',
        'string6',
        'string2',
        'string4'
    ];
    a = function () {
        return m;
    };
    return a();
}

stringArrayCallsTransformThreshold

Type: number Default: 0.5

⚠️ stringArray ve stringArrayCallsTransformThreshold seçenekleri etkinleştirilmelidir

Bu ayarı, string array'e yapılan çağrıların dönüştürülme olasılığını (0 ile 1 arasında) ayarlamak için kullanabilirsiniz.

stringArrayEncoding

Type: string[] Default: []

⚠️ stringArray seçeneği etkinleştirilmelidir

Bu seçenek betiğinizi yavaşlatabilir.

stringArray öğesinin tüm string değişmezlerini base64 veya rc4 kullanarak kodlar ve çalışma zamanında bunları geri çözmek için kullanılan özel bir kod ekler.

Her stringArray değeri, geçirilen listeden rastgele seçilen kodlamayla kodlanır. Bu, birden çok kodlamanın kullanılmasını mümkün kılar.

Kullanılabilir değerler:

  • 'none' (boolean): stringArray değerini kodlamaz
  • 'base64' (string): stringArray değerini base64 kullanarak kodlar
  • 'rc4' (string): stringArray değerini rc4 kullanarak kodlar. base64'ten yaklaşık %30-50 daha yavaştır, ancak başlangıç değerlerini elde etmek daha zordur.

Örneğin, aşağıdaki seçenek değerleriyle bazı stringArray değerleri kodlanmaz ve bazı değerler base64 ve rc4 kodlamasıyla kodlanır:

stringArrayEncoding: [
    'none',
    'base64',
    'rc4'
]

stringArrayIndexesType

Type: string[] Default: ['hexadecimal-number']

⚠️ stringArray seçeneği etkinleştirilmelidir

String array çağrı indekslerinin türünü denetlemeye olanak tanır.

Her stringArray çağrı indeksi, geçirilen listeden rastgele seçilen türle dönüştürülür. Bu, birden çok türün kullanılmasını mümkün kılar.

Kullanılabilir değerler:

  • 'hexadecimal-number' (default): string array çağrı indekslerini hexadecimal sayılar olarak dönüştürür
  • 'hexadecimal-numeric-string': string array çağrı indekslerini hexadecimal sayısal string olarak dönüştürür

2.9.0 sürümünden önce javascript-obfuscator, tüm string array çağrı indekslerini hexadecimal-numeric-string türüyle dönüştürüyordu. Bu, bazı manuel deobfuscation'ı biraz daha zorlaştırır ancak otomatik deobfuscator'ların bu çağrıları kolayca tespit etmesine olanak tanır.

Yeni hexadecimal-number türü, koddaki string array çağrı desenlerinin otomatik tespitini zorlaştırmayı amaçlar.

Gelecekte daha fazla tür eklenecektir.

stringArrayIndexShift

Type: boolean Default: true

⚠️ stringArray seçeneği etkinleştirilmelidir

Tüm string array çağrıları için ek indeks kaydırması etkinleştirir

stringArrayRotate

Type: boolean Default: true

⚠️ stringArray etkinleştirilmelidir

stringArray dizisini sabit ve rastgele (kod obfuscation'ı sırasında üretilen) sayıda konum kadar kaydırır. Bu, kaldırılan stringlerin sırasını orijinal yerleriyle eşleştirmeyi zorlaştırır.

stringArrayShuffle

Type: boolean Default: true

⚠️ stringArray etkinleştirilmelidir

stringArray dizisi öğelerini rastgele karıştırır.

stringArrayWrappersCount

Type: number Default: 1

⚠️ stringArray seçeneği etkinleştirilmelidir

Her kök veya fonksiyon kapsamı içinde string array için sarmalayıcı sayısını ayarlar. Her kapsam içindeki gerçek sarmalayıcı sayısı, bu kapsamdaki literal düğümlerinin sayısıyla sınırlıdır.

Örnek:

// Input
const foo = 'foo';
const bar = 'bar';
        
function test () {
    const baz = 'baz';
    const bark = 'bark';
    const hawk = 'hawk';
}

const eagle = 'eagle';

// Output, stringArrayWrappersCount: 5
const _0x3f6c = [
    'bark',
    'bar',
    'foo',
    'eagle',
    'hawk',
    'baz'
];
const _0x48f96e = _0x2e13;
const _0x4dfed8 = _0x2e13;
const _0x55e970 = _0x2e13;
function _0x2e13(_0x33c4f5, _0x3f6c62) {
    _0x2e13 = function (_0x2e1388, _0x60b1e) {
        _0x2e1388 = _0x2e1388 - 0xe2;
        let _0x53d475 = _0x3f6c[_0x2e1388];
        return _0x53d475;
    };
    return _0x2e13(_0x33c4f5, _0x3f6c62);
}
const foo = _0x48f96e(0xe4);
const bar = _0x4dfed8(0xe3);
function test() {
    const _0x1c262f = _0x2e13;
    const _0x54d7a4 = _0x2e13;
    const _0x5142fe = _0x2e13;
    const _0x1392b0 = _0x1c262f(0xe7);
    const _0x201a58 = _0x1c262f(0xe2);
    const _0xd3a7fb = _0x1c262f(0xe6);
}
const eagle = _0x48f96e(0xe5);

stringArrayWrappersChainedCalls

Type: boolean Default: true

⚠️ stringArray ve stringArrayWrappersCount seçenekleri etkinleştirilmelidir

string array sarmalayıcıları arasında zincirleme çağrıları etkinleştirir.

Örnek:

// Input
const foo = 'foo';
const bar = 'bar';
        
function test () {
    const baz = 'baz';
    const bark = 'bark';

    function test1() {
        const hawk = 'hawk';
        const eagle = 'eagle';
    } 
}

// Output, stringArrayWrappersCount: 5, stringArrayWrappersChainedCalls: true
const _0x40c2 = [
    'bar',
    'bark',
    'hawk',
    'eagle',
    'foo',
    'baz'
];
const _0x31c087 = _0x3280;
const _0x31759a = _0x3280;
function _0x3280(_0x1f52ee, _0x40c2a2) {
    _0x3280 = function (_0x3280a4, _0xf07b02) {
        _0x3280a4 = _0x3280a4 - 0x1c4;
        let _0x57a182 = _0x40c2[_0x3280a4];
        return _0x57a182;
    };
    return _0x3280(_0x1f52ee, _0x40c2a2);
}
const foo = _0x31c087(0x1c8);
const bar = _0x31c087(0x1c4);
function test() {
    const _0x848719 = _0x31759a;
    const _0x2693bf = _0x31c087;
    const _0x2c08e8 = _0x848719(0x1c9);
    const _0x359365 = _0x2693bf(0x1c5);
    function _0x175e90() {
        const _0x310023 = _0x848719;
        const _0x2302ef = _0x2693bf;
        const _0x237437 = _0x310023(0x1c6);
        const _0x56145c = _0x310023(0x1c7);
    }
}

stringArrayWrappersParametersMaxCount

Type: number Default: 2

⚠️ stringArray seçeneği etkinleştirilmelidir
⚠️ Şu anda bu seçenek yalnızca stringArrayWrappersType function seçeneği değeriyle eklenen sarmalayıcıları etkiler

String array sarmalayıcı parametrelerinin maksimum sayısını denetlemeye olanak tanır. Varsayılan ve minimum değer 2'dir. Önerilen değer 2 ile 5 arasındadır.

stringArrayWrappersType

Type: string Default: variable

⚠️ stringArray ve stringArrayWrappersCount seçenekleri etkinleştirilmelidir

stringArrayWrappersCount seçeneği tarafından eklenen sarmalayıcıların türünü seçmeye olanak tanır.

Kullanılabilir değerler:

  • 'variable': her kapsamın en üstüne değişken sarmalayıcılar ekler. Hızlı performans.
  • 'function': her kapsam içinde rastgele konumlara fonksiyon sarmalayıcılar ekler. variable'dan daha yavaş performans ancak daha katı obfuscation sağlar.

Performans kaybının obfuscate edilmiş bir uygulama üzerinde yüksek etkisi olmadığında, daha yüksek obfuscation için function sarmalayıcıların kullanılması şiddetle önerilir.

'function' seçeneği değerine örnek:

// input
const foo = 'foo';

function test () {
    const bar = 'bar';
    console.log(foo, bar);
}

test();

// output
const a = [
    'log',
    'bar',
    'foo'
];
const foo = d(0x567, 0x568);
function b(c, d) {
    b = function (e, f) {
        e = e - 0x185;
        let g = a[e];
        return g;
    };
    return b(c, d);
}
function test() {
    const c = e(0x51c, 0x51b);
    function e (c, g) {
        return b(c - 0x396, g);
    }
    console[f(0x51b, 0x51d)](foo, c);
    function f (c, g) {
        return b(c - 0x396, g);
    }
}
function d (c, g) {
    return b(g - 0x3e1, c);
}
test();

stringArrayThreshold

Type: number Default: 0.8 Min: 0 Max: 1

⚠️ stringArray seçeneği etkinleştirilmelidir

Bu ayarı, bir string değişmezinin stringArray'e ekleneceği olasılığı (0 ile 1 arasında) ayarlamak için kullanabilirsiniz.

Bu ayar, özellikle büyük kod boyutları için kullanışlıdır çünkü string array'i tekrar tekrar çağırır ve kodunuzu yavaşlatabilir.

stringArrayThreshold: 0, stringArray: false ile aynıdır.

strictMode

Type: boolean | null Default: null

Obfuscator'ın kodu JavaScript strict mode açısından nasıl ele alacağını belirtmeye olanak tanır.

Kullanılabilir değerler:

  • null (varsayılan) - strict mode'u koddan otomatik tespit eder. Kod açık bir 'use strict' yönergesine, ES modülü sözdizimine veya sınıf metotlarına sahipse, strict mode olarak ele alınır. Aksi takdirde sloppy mode varsayılır.
  • true - açık bir 'use strict' yönergesi olmasa bile tüm kod için strict mode işlemesini zorlar. Kodunuz strict mode bağlamında çalışacaksa bunu kullanın (örneğin ES modüllerinde, paketleyicilerde veya modern çerçevelerde).
  • false - yalnızca açık strict mode göstergeleri ('use strict', ES modülleri, sınıf metotları) strict olarak ele alınır. JS spesifikasyonu uyarınca üst kapsam devralması yine de geçerlidir.

target

Type: string Default: browser

Obfuscate edilmiş kod için hedef ortamı ayarlamaya olanak tanır.

Kullanılabilir değerler:

  • browser (varsayılan) — standart web sayfası ortamı. Çıktı kodu node ile aynıdır, ancak bazı tarayıcıya özgü seçeneklerin node hedefiyle kullanılmasına izin verilmez
  • browser-no-evalbrowser ile aynı, ancak çıktı eval() kullanmaz. Hedef sayfada eval/unsafe-eval kullanımını yasaklayan bir İçerik Güvenliği Politikası (CSP) olduğunda kullanın.
  • node — Node.js ortamı. Tarayıcıya özgü seçenekler devre dışı bırakılır (bunlar window/document gerektirir ve Node'da işlevsiz olur veya hata fırlatır). Yalnızca tarayıcıya özgü API'lere dayanan bazı vmSelfDefending savunmaları — headless tarayıcı tespiti, iframe tabanlı temiz-realm kurtarma, denetleyici karşıtı/DOM kontrolleri — bu hedef için üretilmez.
  • service-worker — Service Worker bağlamı. window yok, document yok, farklı bir self global'i.
  • userscript — userscript yöneticisi sandbox'ı (örneğin Tampermonkey). vmSelfDefending savunmaları buna göre ayarlanır.
  • bytenode — obfuscation'dan sonra bytenode yükleyicisiyle (V8 önbelleğe alınmış bayt kodu .jsc) derlenecek Node.js kodu. Obfuscator'ın kendisi bytenode'u çağırmaz; çalışma zamanı bytenode'un derleme adımından sağ çıkacak şekilde yapılandırılmış VM ile obfuscate edilmiş JavaScript üretir ve vmSelfDefending savunmaları buna göre ayarlanır. Nihai .jsc'yi üretmek için bytenode'u obfuscate edilmiş çıktı üzerinde kendiniz çalıştırın.

transformObjectKeys

Type: boolean Default: false

Nesne anahtarlarının dönüştürülmesini etkinleştirir.

Örnek:

// input
(function(){
    var object = {
        foo: 'test1',
        bar: {
            baz: 'test2'
        }
    };
})();

// output
var _0x4735 = [
    'foo',
    'baz',
    'bar',
    'test1',
    'test2'
];
function _0x390c(_0x33d6b6, _0x4735f4) {
    _0x390c = function (_0x390c37, _0x1eed85) {
        _0x390c37 = _0x390c37 - 0x198;
        var _0x2275f8 = _0x4735[_0x390c37];
        return _0x2275f8;
    };
    return _0x390c(_0x33d6b6, _0x4735f4);
}
(function () {
    var _0x17d1b7 = _0x390c;
    var _0xc9b6bb = {};
    _0xc9b6bb[_0x17d1b7(0x199)] = _0x17d1b7(0x19c);
    var _0x3d959a = {};
    _0x3d959a[_0x17d1b7(0x198)] = _0x17d1b7(0x19b);
    _0x3d959a[_0x17d1b7(0x19a)] = _0xc9b6bb;
    var _0x41fd86 = _0x3d959a;
}());

warnings

Type: string | object Default: all

ObfuscationResult.getWarnings() metodu aracılığıyla hangi ölümcül olmayan obfuscation uyarılarının yayınlanacağını denetler.

Kullanılabilir değerler:

  • 'all' (varsayılan) — her uyarı yayınlanır.
  • 'none' — tüm uyarılar bastırılır.
  • uyarı türlerini boole değerlerine eşleyen bir nesne — false ile eşlenen bir tür bastırılır; mevcut olmayan (veya true ile eşlenen) her tür etkin kalır. Örneğin, { "VMGlobalFunctionNamesNotRenamed": false } yalnızca o uyarı dışındaki her uyarıyı korur.

Uyarı türleri:

  • VMGlobalFunctionNamesNotRenamedvmObfuscation altında, üst düzey fonksiyon bildirimlerinin, sınıf bildirimlerinin ve bir fonksiyon/arrow/sınıf ifadesi atanan değişkenlerin adları olduğu gibi korundu (renameGlobals seçeneği devre dışı ve kod bir IIFE içine sarmalanmamış), dolayısıyla gövdeleri bayt kodu olarak gizlenmiş olsa da çıktıda okunabilir kalırlar. Dışa aktarılan adlar raporlanmaz.
  • VMTopLevelInitializerNotVirtualizedvmWrapTopLevelInitializers devre dışı olduğu veya bunları sanallaştıramadığı için üst düzey değişken başlatıcıları VM obfuscation altında düz JavaScript olarak kaldı.
  • DynamicCodeRenameRisk — kod, çalışma zamanında bir stringden fonksiyon oluşturuyor (doğrudan eval, Function yapıcısı veya bir <script>/Worker'a enjekte edilen fn.toString()); bu, obfuscator'ın yeniden adlandırdığı tanımlayıcılara başvurabilir.
  • VMDynamicCodeSkipped — bir fonksiyon, doğrudan eval / dinamik new Function / Function içerdiği için VM bayt kodlamasından atlandı (bkz. vmForceCompileDynamicCode).
  • VMSyncFunctionSkippedInAsyncModevmAsyncExecutor etkinken, comment modunda açıkça işaretlediğiniz bir fonksiyonun senkron olduğu ortaya çıktı ve atlandı (bu modda yalnızca async fonksiyonlar sanallaştırılır).
  • VMAsyncGeneratorSkippedInAsyncModevmAsyncExecutor ve etkin bir async anahtar getirici ile, işaretlenmiş bir async üreteç sanallaştırılamadı (yineleyicisini senkron olarak döndürmesi gerekir).
  • BrowserTargetWithNodeStyleCode — kod, target seçeneği tarayıcı benzeri bir ortama ayarlıyken Node.js'i hedefliyor gibi görünüyor (örneğin require('fs'), __dirname, process.argv).

vmObfuscation

Type: boolean Default: false

VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Etkinleştirildiğinde, JavaScript fonksiyonları gömülü bir sanal makinede çalışan özel bayt koduna derlenir. Orijinal kod mantığı tamamen dönüştürüldüğü için bu, en yüksek düzeyde koruma sağlar.

Örnek: return qty * price gibi okunabilir kodunuz, yalnızca gömülü VM yorumlayıcısının yürütebileceği [0x15,0x03,0x17,...] gibi bir sayı listesine dönüşür. Orijinal mantık artık JavaScript olarak görünmez.

vmTargetFunctions

Type: string[] Default: []

Hangi kök düzeyi fonksiyonların ada göre VM koruması alacağını tam olarak belirtin.

Örnek:

{
    vmObfuscation: true,
    vmTargetFunctions: ['someFunctionName']
}

Sonuç: Yalnızca bu üç fonksiyon VM ile korunur. Geri kalan her şey normal (ancak yine de obfuscate edilmiş) JavaScript olarak kalır. Kodunuzun geri kalanını hafif tutarken hassas lisans kontrollerini veya kimlik doğrulama mantığını korumak için idealdir.

vmExcludeFunctions

Type: string[] Default: []

Asla VM koruması almaması gereken kök düzeyi fonksiyonları belirtin. Diğer ayarlara göre önceliklidir.

Örnek:

{
    vmObfuscation: true,
    vmExcludeFunctions: ['someFunctionName']
}

Ne zaman kullanılır: Performans açısından kritik kök düzeyi fonksiyonlar (animasyon döngüleri, gerçek zamanlı veri işleme), geri kalan her şey korunmaya devam ederken VM ek yükünü önlemek için hariç tutulabilir.

vmTargetFunctionsMode

Type: string Default: root

Fonksiyonların/metotların VM obfuscation için nasıl seçileceğini denetler.

ModAçıklama
rootVarsayılan davranış. VM obfuscation için yalnızca kök düzeyi fonksiyonlar dikkate alınır. Filtrelemek için vmTargetFunctions izin listesini ve vmExcludeFunctions ret listesini kullanır.
commentYalnızca /* javascript-obfuscator:vm */ yorumuyla işaretlenmiş fonksiyonlar/metotlar VM ile obfuscate edilir. Herhangi bir iç içe geçme düzeyindeki fonksiyonlarla/metotlarla çalışır.

Örnek - Comment modu:

// Source code
function regularFunction() {
    return 'not virtualized';
}

/* javascript-obfuscator:vm */
function sensitiveFunction() {
    return 'this will be VM-protected';
}

function outer() {
    /* javascript-obfuscator:vm */
    function nestedSensitive() {
        return 'nested but still VM-protected';
    }
    return nestedSensitive();
}
// Obfuscator options
{
    vmObfuscation: true,
    vmTargetFunctionsMode: 'comment'
}

Ne zaman kullanılır: Hangi fonksiyonların VM koruması alacağı üzerinde cerrahi denetime ihtiyaç duyduğunuzda, özellikle hassas mantık içeren iç içe fonksiyonlar için. Yalnızca kök düzeyi adlandırılmış fonksiyonlarla çalışan vmTargetFunctions'ın aksine, comment modu kodunuzun herhangi bir yerindeki herhangi bir fonksiyonu korumanıza olanak tanır.

vmForceCompileDynamicCode

Type: boolean Default: false

VM obfuscation'ın, doğrudan eval, new Function(...) veya Function(...) çağrısı içeren bir fonksiyonla ne yapacağını denetler.

Varsayılan olarak, böyle bir fonksiyon (ve içinde tanımlanan her fonksiyon) VM bayt kodlamasından atlanır ve result.getWarnings() üzerinde bir VMDynamicCodeSkipped uyarısı raporlanır. Bunun nedeni, çalışma zamanında oluşturulan kaynağın çevreleyen kapsam zincirindeki tanımlayıcılara — obfuscator'ın yeniden adlandırdığı tanımlayıcılara — başvurabilmesidir.

true olarak ayarlandığında, fonksiyon yine de bayt koduna dönüştürülür ve VMDynamicCodeSkipped uyarısı artık yayınlanmaz.

Ayrı DynamicCodeRenameRisk uyarısı bu seçenekten bağımsız olarak çalışmaya devam eder, çünkü tanımladığı yeniden adlandırma riski VM atlamasından bağımsızdır — bu seçeneği açmak, altta yatan deseni daha güvenli hale getirmez.

// Source code
function loadConfig(src) {
    return eval(src);
}
loadConfig('1 + 2');
// Options
{
    vmObfuscation: true,
    vmForceCompileDynamicCode: true
}

Seçenek kapalıyken (varsayılan), loadConfig düz JavaScript olarak bırakılır. Seçenek açıkken, loadConfig diğer herhangi bir fonksiyon gibi VM bayt koduna derlenir. Çağrı noktasını denetlediğinizde ve çalışma zamanında oluşturulan kodun closure ile yeniden adlandırılmış tanımlayıcılara bağlı olmadığını bildiğinizde bunu kullanın.

vmWrapTopLevelInitializers

Type: boolean Default: false

Bazı üst düzey değişken başlatıcılarını, VM ile obfuscate edilebilmeleri için IIFE'lere (Hemen Çağrılan Fonksiyon İfadeleri) sarmalar.

Ne yapar: Bu seçenek olmadan, üst düzey sabitler ve değişkenler çıktıda görünür kalır:

// Input
const MY_STRING = "my-string";

// Output (without vmWrapTopLevelInitializers)
const MY_STRING = "my-string";  // String is visible!

Bu seçenek etkinleştirildiğinde, başlatıcı VM ile obfuscate edilen bir IIFE içine sarmalanır:

// Input
const MY_STRING = "my-string";

// Output (with vmWrapTopLevelInitializers: true)
const MY_STRING = (() => { return /* VM bytecode call */ })();  // String hidden in bytecode

Not: Bu seçenek yalnızca vmTargetFunctionsMode değeri 'root' (varsayılan) olduğunda çalışır.

Uyarılar: Bir üst düzey başlatıcı VM obfuscation altında düz JavaScript olarak kaldığında, etkilenen değişken adlarını listeleyen bir VMTopLevelInitializerNotVirtualized uyarısı raporlanır. Bu şunları kapsar: bu seçeneğin devre dışı olması, bu seçeneğin atlamak zorunda kaldığı başlatıcılar (her biri nedeniyle birlikte — örneğin başlatıcının bir kardeş bildiriciye başvurması veya üst düzey await içermesi) ve senkron sarmalayıcıların hiç sanallaştırılamadığı vmAsyncExecutor modu.

vmDynamicOpcodes

Type: boolean Default: false

VM yorumlayıcısını daha küçük ve her derleme için benzersiz hale getirir.

Ne yapar:

  1. Kullanılmayan talimatları filtreler - Kodunuz sınıf kullanmıyorsa, sınıfla ilgili talimatlar tamamen kaldırılır
  2. Yapıyı rastgeleleştirir - Talimat işleyicilerinin sırası her derlemede karıştırılır

Sonuç olarak - daha küçük çıktı ve her derleme farklı görünür.

vmBytecodeEncoding

Type: boolean Default: false

Her bayt kodu talimatını kodlar. Talimatlar yürütme sırasında birer birer çözülür.

vmBytecodeArrayEncoding

Type: boolean Default: false

Tüm bayt kodu dizisini tek bir blok olarak kodlar. Dizi, yürütme başlamadan önce başlangıçta bir kez çözülür. İki katman koruma için vmBytecodeEncoding ile birlikte kullanın.

vmBytecodeArrayEncodingKey

Type: string Default: ''

Bayt kodu dizisi kodlaması için özel şifreleme anahtarı. Ayarlandığında, varsayılan ortamdan türetilen anahtar yerine bu anahtar kullanılır. Anahtar, çalışma zamanında vmBytecodeArrayEncodingKeyGetter aracılığıyla sağlanmalıdır.

Bu seçenek şifreleme anahtarını dışarıya alır - obfuscate edilmiş kodun kendisine gömülü değildir. Anahtar çalışma zamanında hâlâ erişilebilir olsa da (ve dolayısıyla gerçekten gizli olmasa da), bu ayrım statik analiz araçlarının anahtarı yalnızca kodu inceleyerek bulmasını önler.

Önemli: Anahtar, obfuscate edilmiş kod yüklendiğinde senkron olarak kullanılabilir olmalıdır. Çerezler, localStorage, sessionStorage, global değişkenler veya DOM öğeleri (örneğin sunucu tarafından enjekte edilen meta etiketleri) gibi senkron depolamayı kullanın. fetch() gibi asenkron yöntemler anahtar getirici ifadesinde doğrudan kullanılamaz.

vmBytecodeArrayEncodingKeyGetter

Type: string Default: ''

Çalışma zamanında şifreleme anahtarını döndüren senkron JavaScript ifadesi. Bu ifade, obfuscate edilmiş kod yüklendiğinde değerlendirilir ve vmBytecodeArrayEncodingKey içinde sağlanan anahtarın aynısını döndürmelidir. Anahtarı asenkron olarak (bir Promise) çözmek için vmAsyncExecutor seçeneğini etkinleştirin.

Not: Promise döndüren bir getirici vmAsyncExecutor gerektirir. Bu, derleme zamanında kontrol edilemez; bu nedenle vmAsyncExecutor kapalıyken Promise döndüren bir getirici çalışma zamanında başarısız olur — çözücü, anahtar yerine Promise'i alır.

Obfuscate edilmiş kod yalnızca anahtar getirici, obfuscation sırasında kullanılan anahtarın tam olarak aynısını döndürdüğünde çalışır. Anahtarlar eşleşmezse, şifre çözme başarısız olur ve kod anlamsız çıktı veya hatalar üretir. Anahtar getirici undefined, null veya boş bir string döndürürse, kod bir hata fırlatır: "VM decryption key not available".

Önemli: Anahtarı, obfuscate edilmiş kodla aynı dosyanın/betiğin dışında tutun — onu oraya satır içi eklemek, paketin tamamen statik bir taramasının bile onu kurtarmasına olanak tanır. Bunun yerine ayrı bir kaynakta saklayın: sunucunun ayarladığı çerezler, başka bir betik tarafından doldurulan localStorage, sunucu tarafından enjekte edilen bir HTML meta etiketi, farklı bir betik tarafından ayarlanan bir global veya (vmAsyncExecutor ile) çalışma zamanında arka ucunuzdan alınan bir değer.

Anahtar arka ucunuzdan alındığında (vmAsyncExecutor aracılığıyla), o uç noktaya oturum veya origin tabanlı kontroller ekleyin: gerçek kullanıcılara doğru anahtarı (geçerli oturum, beklenen Origin/Referer) ve şüpheli isteklere anlamsız bir anahtar (örneğin bir localhost/beklenmeyen origin, oturum yok) döndürün. Gerçek kullanıcılar normal çalışır; ortamınızın dışında çalışan bir kopya, hiçbir şeye çözülmeyen bir anahtar alır. Tam mantık sitenize bağlıdır.

Örnekler:

// From cookie
vmBytecodeArrayEncodingKeyGetter: "document.cookie.match(/vmKey=([^;]+)/)?.[1]"

// From localStorage
vmBytecodeArrayEncodingKeyGetter: "localStorage.getItem('vmKey')"

// From global variable
vmBytecodeArrayEncodingKeyGetter: "window.__VM_KEY__"

// From meta tag (server-injected)
vmBytecodeArrayEncodingKeyGetter: "document.querySelector('meta[name=\"vm-key\"]').content"

// From nested object
vmBytecodeArrayEncodingKeyGetter: "window.config.encryption.key"

// From backend, async (requires vmAsyncExecutor)
vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'

Kullanım örneği:

// Build time
JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    vmBytecodeArrayEncodingKeyGetter: 'window.__VM_KEY__'
});

// Runtime - key must be set before obfuscated code runs
window.__VM_KEY__ = 'mySecretKey123';

vmAsyncExecutor

Type: boolean Default: false

vmBytecodeArrayEncodingKeyGetter öğesinin bir Promise döndürmesine (bir asenkron anahtar getirici) izin veren asenkron VM yürütücüsünü etkinleştirir — böylece şifre çözme anahtarı, kod yüklendiğinde senkron olarak kullanılabilir olmak zorunda kalmadan çalışma zamanında (ağ isteği, IndexedDB vb.) alınabilir.

Tamamen asenkron kod tabanları için şiddetle önerilir. Bu modda yalnızca async fonksiyonlar sanallaştırılır — senkron bir fonksiyon, dönüş değeri bir Promise haline getirilip çağıranları bozulmadan asenkron yapılamaz — dolayısıyla baştan sona async olan kod en geniş kapsamı elde eder. Kök senkron olduğunda da (örneğin senkron bir IIFE / UMD sarmalayıcı) yine çalışır: içindeki en dıştaki async fonksiyonlar korunur, senkron kısımlar olduğu gibi bırakılır.

Neler dönüştürülür: Nerede görünürse görünsün (senkron sarmalayıcıların içinde iç içe olanlar dahil) her en dıştaki async fonksiyon. Her zincirdeki en dıştaki async, korunan birimdir — içindeki her şey, senkron ve asenkron, derlemeye dahil edilir. Senkron fonksiyonlar ve düz üreteçler obfuscate edilmeden bırakılır.

function foo() {              // sync — left as-is
    function bar() {}         // sync — left as-is

    async function baz() {    // transformed
        // any code here, including calls to other async or sync functions
    }

    async function bark() {   // transformed
        // any code here, including calls to other async or sync functions
    }
}

Atlamalar ve uyarılar. Asenkron bir anahtar getirici etkinken async üreteçler de obfuscate edilmeden bırakılır (bir async üreteç, yineleyicisini senkron olarak döndürmelidir ve anahtarı bekleyemez). Varsayılan vmTargetFunctionsMode: 'root' modunda atlamalar sessizdir (seçim otomatiktir); comment modunda ise, açıkça işaretlediğiniz bir fonksiyon sanallaştırılamadığında — senkron olduğu ortaya çıktığında veya asenkron bir anahtar getirici altında bir async üreteç olduğunda — ObfuscationResult.getWarnings() aracılığıyla bir uyarı yayınlanır.

Asenkron anahtar getirici ayrıca bir vmBytecodeArrayEncodingKeyGetter ile birlikte vmBytecodeArrayEncoding gerektirir.

Kullanım örneği:

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmAsyncExecutor: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    // the key getter may now return a Promise
    vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});

vmJumpsEncoding

Type: boolean Default: false

Bayt kodundaki atlama hedeflerini kodlar. Atlama ofsetleri çalışma zamanında hesaplanır ve kontrol akışı yapısını (if/else, döngüler vb.) statik analizden gizler.

vmMacroOps

Type: boolean Default: false

Yaygın talimat dizilerini tek "makro" opcode'larda birleştirir. Örneğin, LOAD + ADD + STORE tek bir MACRO_ADD_TO_VAR talimatı haline gelebilir. Bu, desen tanımayı bozar ve performansı artırabilir.

vmDebugProtection

Type: boolean Default: false

VM çalışma zamanına çok katmanlı hata ayıklama karşıtı, analiz karşıtı ve LLM karşıtı savunmalar ekler. browser/browser-no-eval hedefleriyle en iyi şekilde çalışır.

vmSelfDefending

Type: boolean Default: false

VM çalışma zamanına çok katmanlı kurcalama tespiti, hook karşıtı ve tersine mühendislik karşıtı koruma ekler.

⚠️ Bu seçenek vmBytecodeArrayEncoding seçeneğini zorla etkinleştirir.

⚠️ Hassas ortam tespiti. Bu seçenek, obfuscate edilmiş kodu hedef çalışma zamanı ortamına bağlar ve otomasyon araçlarını tespit etmek için gelişmiş tarayıcı parmak izi çıkarma kullanır. Bu seçenekle korunan kod, şu ortamlarda çalıştırıldığında kasıtlı olarak bozulur:

  • Headless tarayıcılar (headless Chrome/Chromium, PhantomJS)
  • Tarayıcı otomasyon araçları (Puppeteer, Playwright, Cypress, Selenium/ChromeDriver, Nightmare)
  • Node.js (target değeri browser olarak ayarlandığında)
  • jsdom veya benzeri sunucu tarafı DOM öykünmeleri
  • Yerel tarayıcı yerleşiklerinin hook'landığı veya değiştirildiği ortamlar

Kod, normal tarayıcılarda (Chrome, Firefox, Safari, Edge) doğru şekilde çalışır; iframe'ler, tarayıcı uzantıları (content script'ler) ve Web Worker'lar içinde yüklendiğinde de dahil. Korunan koda karşı otomatik testler çalıştırmanız gerekiyorsa, test derlemeleri için vmSelfDefending'i devre dışı bırakın — bu seçenek otomatik analizi önlemek için tasarlanmıştır ve herhangi bir otomasyon çerçevesiyle güvenli bir şekilde kullanılamaz.

vmDebugProtection, vmBytecodeArrayEncodingKey ve vmBytecodeArrayEncodingKeyGetter ile birlikte kullanılması şiddetle önerilir.

vmDefenseHook

Type: { name: string, aliases?: object } Default: ''

vmDefenseHook, iki anahtarla bir nesne alır: name (zorunlu) ve aliases (isteğe bağlı).

name, bir VM savunmasının (vmDebugProtection / vmSelfDefending) düşmanca bir sinyal tespit ettiğinde — bir hata ayıklayıcı veya denetleyici, bir headless / otomasyon tarayıcısı, bir yapay zeka kodlama ajanı süreci, izin verilmeyen bir alan adı vb. — bir sinyal nesnesiyle çağırdığı, host sayfanızın tanımladığı bir global fonksiyondur. Olayı arka ucunuza raporlamak için kullanın (örneğin navigator.sendBeacon). Hook, saf bir telemetri alıcısıdır: dönüş değeri göz ardı edilir ve eksik ya da hata fırlatan bir hook, bir savunmayı asla devre dışı bırakamayan sessiz bir işlemsizliktir. Bir savunmanın tespit anında ne yaptığını değiştirmek için vmDefenseReaction seçeneğini kullanın.

aliases, isteğe bağlı olarak o sinyal nesnesinin alanlarını yeniden adlandırır — aşağıdaki Sinyal alanlarını yeniden adlandırma bölümünde ele alınmıştır.

Sinyal nesnesi. Hook, tek bir signal alır:

  • source — tetiklenen belirli dedektör (tabloya bakın).
  • category — altında raporladığı grup: automation (insan olmayan tarayıcılar), debugger (bir hata ayıklayıcı/denetleyici etkin), sandbox (araçsallaştırılmış/sahte host), domain (alan adı kilidi ihlali), tamper (çalışma zamanında yamalanmış yerleşikler) veya integrity (VM'in kendi kodu değiştirildi).
  • score / threshold — dedektörün ne kadar güçlü tetiklendiği ve ulaşması gereken değer; hook yalnızca score >= threshold olduğunda tetiklenir. Çoğu kontrol ya hep ya hiçtir (tek belirleyici bir sinyal); headless, birkaç tarayıcı-şekli sinyalini toplar, dolayısıyla score değeri genellikle threshold değerinden yüksektir.
sourcetespit ettiğicategory
integrityobfuscate edilmiş VM kodunun kendisi değiştirilmişintegrity
nodeNode.js altında çalışan, tarayıcı hedefli koddebugger
debuggerekli veya etkin bir hata ayıklayıcı ya da denetleyici oturumu ya da bir hata ayıklama ortamıdebugger
headlesskodu çalıştırmak için headless bir tarayıcı kullanılıyorautomation
agentkodu çalıştıran bir yapay zeka kodlama ajanıautomation
timingbir kesme noktası veya adım adım ilerleyen bir hata ayıklayıcıyı düşündüren bir yürütme duraklamasıdebugger
sandboxkod bir sandbox'ta veya sahte bir host ortamında çalışıyorsandbox
domainsayfa origin'i vmDomainLock izin listesinde değildomain
nativeHookyerel bir yerleşik fonksiyon değiştirilmiş veya hook'lanmıştamper

Hook'u kaydetme. Onu, obfuscate edilmiş paket yüklenmeden önce düz bir global olarak tanımlayın — VM çalışma zamanı ve savunmaları (korunan) programınızdan önce çalışır, dolayısıyla birçok tespit başlangıç sırasında tetiklenir:

// in your page, before the obfuscated script:
window.__vmDetection = function (signal) { navigator.sendBeacon('/vm-defense', JSON.stringify(signal)); };
// obfuscation option:
vmDefenseHook: { name: '__vmDetection' }

Obfuscate edilmiş kaynağın içinde tanımlanan bir hook, başlangıç zamanındaki tespitleri yakalamak için çok geç kaydedilir ve VM ile derlenirse programınız çalışana kadar erişilemez. Her iki durumda da güvende tutulur (eksik bir hook işlemsizdir ve bir yeniden giriş koruması herhangi bir kontrolsüz durumu önler), ancak tam kapsam için onu önceden kaydedin. Raporlama mantığınızı yine de korumak için kaydedilen hook'u tek satırlık bir tampon olarak tutun ((window.__vmDet = window.__vmDet || []).push(signal)) ve o tamponu obfuscate edilmiş kodunuzdan okuyup gönderin.

Sinyal alanlarını yeniden adlandırma (aliases). Varsayılan source/category değerleri açıklayıcı adlardır, dolayısıyla geri çağırmayı araçsallaştıran (veya çıktıyı okuyan) herkes, korumayı ve hangi dedektörün tetiklendiğini tanıyabilir. aliases, sinyal alanlarını seçtiğiniz opak tokenlara yeniden adlandırır ve bunu sinyal yayılmadan önce VM içinde uygular; böylece bu adlar çıktıda hiç görünmez ve geri çağırmaya ulaşmaz. Uygulamanız kendi eşlemesini bilir ve tokenları arka ucunuza iletir.

Takma adlar alan başınadır ve anahtar ile değer yeniden adlandırmalarını ayrı tutar: her alan bir key alır (geri çağırmanın aldığı özellik adı); string ad-alanları source ve category ayrıca bir values eşlemesi alırken, score/threshold sayıdır ve yalnızca bir key alır. Eşleyebileceğiniz adlar (başka her şey derleme zamanında reddedilir):

  • alan anahtarlarısource, category, score, threshold
  • source değerleriheadless, agent, node, debugger, timing, sandbox, domain, nativeHook, integrity
  • category değerleriautomation, debugger, sandbox, domain, tamper, integrity
vmDefenseHook: {
    name: '__vmDetection',
    aliases: {
        source:    { key: 'a8Qm', values: { headless: 'xP4m9Q' } },
        category:  { key: 'p3Tx', values: { automation: 'bQ7s1M' } },
        score:     { key: 's1' },
        threshold: { key: 't1' }
    }
    // the callback now receives e.g. { a8Qm: 'xP4m9Q', p3Tx: 'bQ7s1M', s1: <score>, t1: <threshold> }
}

Bu, gizlilik değil, parmak izinden kaçınmadır — eşleme yine de tekrarlı testlerle çıkarsanabilir — dolayısıyla tek yararı, sabit ve kendini açıklayan adları açığa çıkarmamaktır. Ayarlanmamış girdiler varsayılan adlarını korur.

Çıplak bir string (vmDefenseHook: '__vmDetection'), { name: '__vmDetection' } için kısayol olarak kabul edilir ancak kullanımdan kaldırılmıştır — nesne biçimini tercih edin.

vmDefenseReaction

Type: object Default: { automation: 'break', debugger: 'decoy', sandbox: 'decoy', domain: 'break', tamper: 'break', integrity: 'break' }

Her tespit kategorisinin nasıl tepki verdiğini yapılandırır. Hiçbir şeyi etkinleştirmez — savunmaların kendisi vmSelfDefending, vmDebugProtection ve vmDomainLock tarafından açılır; bu seçenek yalnızca etkin bir savunmanın nasıl tepki vereceğini seçer. Denetim birimi kategoridir — bir kategorideki her dedektör, o kategorinin tepkisini uygular.

Her kategori, bir tür düşmanca durumu gözleyen dedektörleri gruplandırır. Bir kategori yalnızca dedektörlerini yayan seçenek etkinleştirildiğinde tepki verir:

KategoriEtkinleştirenNe zaman tepki verir
automationvmSelfDefending veya vmDebugProtectionKod, bir kişi yerine yazılım tarafından sürülüyor: headless veya otomatikleştirilmiş bir tarayıcı, bir kazıma / test çerçevesi ya da sayfayı adım adım ilerleten bir yapay zeka kodlama ajanı.
debuggervmDebugProtection veya vmSelfDefendingBiri, bir hata ayıklayıcıyı ya da tarayıcının geliştirici araçları denetleyicisini açmış ve onu anlamak için çalışan kodda adım adım ilerliyor.
sandboxvmDebugProtectionKod gerçek bir tarayıcıda hiç çalışmıyor — çevrimdışı yürütülüp incelenmek üzere öykünülmüş veya betiklenmiş bir JavaScript ortamına taşınmış.
domainvmDomainLockKod, yetki vermediğiniz bir sitede çalışıyor: vmDomainLock izin listenizde olmayan bir host (örneğin paketiniz başka birinin alan adına kopyalanmış).
tampervmSelfDefendingVM'in etrafındaki JavaScript ortamı, onu izlemek veya ele geçirmek için değiştirilmiş; örneğin yerel tarayıcı yerleşikleri araçsallaştırılmış sürümlerle değiştirilmiş.
integrityvmSelfDefendingKorunan paketin kendi kodu, siz onu ürettiğinizden bu yana düzenlenmiş veya yamalanmış.

Her kategori, vmSelfDefending, vmDebugProtection ve vmDomainLock seçeneklerinden birine veya daha fazlasına eşlenir; bu üç seçeneğin dışında bir kategori yoktur ve seçeneği kapalı olan bir kategori için ayarlanan bir tepkinin hiçbir etkisi olmaz.

Anahtarlar bu altı kategori adı veya default'tur (belirtilmemiş kategoriler için bir yedek). Değerler şunlardır:

  • break — hemen kes
  • decoy — zehirlenmiş durumla çalışmaya devam et, sessizce yanlış sonuçlar üret
  • none — yerel olarak hiçbir şey yapma (yalnızca telemetri)

Kategori başına varsayılanlar yukarıda gösterilmiştir; ayarlamadığınız (veya varsayılan değerine ayarladığınız) bir kategori o varsayılanı kullanır. default, doğru-yapı gereği olanlar (integrity, tamper) dahil her kategoriye ulaşır; dolayısıyla { default: 'none' } gerçekten bozmayan, yalnızca telemetri sağlayan bir derlemedir:

vmDefenseReaction: { default: 'none' }              // never break — pair with vmDefenseHook
vmDefenseReaction: { automation: 'none', domain: 'break' }   // tolerate automation FPs, still break on a bad domain

vmStatefulOpcodes

Type: boolean Default: false

Opcode anlamlarını bayt kodundaki konuma bağımlı hale getirir. Her konum, bir tohumdan türetilen farklı bir opcode'dan işleyiciye eşlemeye sahiptir; böylece aynı opcode numarası farklı konumlarda farklı işlemler gerçekleştirir.

vmCallContextOpcodes

Type: boolean Default: false

Korunan bir fonksiyonu nereden çağrıldığına bağımlı hale getirir; böylece koddan çıkarılıp tek başına çalıştırılamaz veya analiz edilemez — yalnızca programdaki gerçek çağrı noktaları aracılığıyla çağrıldığında doğru davranır. Bu seçenek çalışma zamanı performansını etkiler.

Şu anda yalnızca aşağıdaki yapılar desteklenir:

  • fonksiyon bildirimleri (function f() {});
  • bir değişkene atanan fonksiyon ifadeleri ve arrow fonksiyonlar (const f = () => {});
  • örnek özel metotları (this.#m()).

Her durumda fonksiyona her zaman doğrudan bir çağrıyla ulaşılmalıdır (f(), this.#m()). Başka bir değişkende saklanırsa, argüman olarak geçirilirse veya başka bir şekilde değer olarak kullanılırsa, korumasız bırakılır. Async fonksiyonlar desteklenir; üreteçler desteklenmez.

Bu seçenek deneyseldir ve kodunuzu bozabilir, dolayısıyla kullanmadan önce çıktıyı iyice test edin.

vmStackEncoding

Type: boolean Default: false

Yürütme sırasında VM yığınındaki değerleri şifreler. Değerler yığına eklenirken (push) kodlanır ve çıkarılırken (pop) çözülür; böylece bellek incelemesi gerçek değerler yerine şifrelenmiş veri gösterir.

Bu seçenek performansı ağır biçimde etkiler.

vmCompactDispatcher

Type: boolean Default: false

İkili yürütücüler (sync + generator) yerine tek bir VM yürütücüsü kullanır. Obfuscate edilmiş kod boyutunu azaltır ancak yoğun özyineleme içeren kodda ~%20 performans ek yükü ekler.

  • false (varsayılan): ikili yürütücüler — optimal performans, daha büyük çıktı
  • true: tek yürütücü — daha küçük çıktı, biraz daha yavaş

vmStringArrayBytecodeOnly

Type: boolean Default: false

Etkinleştirildiğinde, string array stringleri yalnızca bayt kodu verilerinden çıkarır — koddaki başka hiçbir string dönüştürülmez. Bu, açıkça ayarlanmamış olsa bile stringArray'i zorla etkinleştirir.

Neden kullanılır: Tüm VM çalışma zamanı stringlerini bir string array'e çıkarmak yavaştır. Bu seçenek, string array çıkarımı için yalnızca bayt kodu içeriğini hedefler; bayt kodu sabitlerini korumaya devam ederken performansı artırır.

  • vmBytecodeArrayEncoding: false olduğunda — bayt kodu sabit havuzlarındaki (c dizileri) stringler çıkarılır
  • vmBytecodeArrayEncoding: true olduğunda — üst düzey base64 kodlu bayt kodu stringleri çıkarılır
  • stringArrayThreshold, bu bayt kodu stringlerinin yüzde kaçının çıkarılacağını yine de denetler

vmDomainLock

Type: string[] Default: []

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Obfuscate edilmiş kodu belirli alan adlarıyla ve/veya alt alan adlarıyla sınırlar ve domainLock'a göre bulunması ve sökülmesi çok daha zordur.

Kaynak kod bu seçenekle belirtilen alan adlarında çalıştırılmazsa, tarayıcı vmDomainLockRedirectUrl seçeneğine geçirilen URL'ye yönlendirilir ve yönlendirme bastırılsa bile sonraki korunan çağrılar yanlış sonuçlar döndürür.

Birden çok alan adı ve alt alan adı

Kodunuzu birden fazla alan adına veya alt alan adına kilitlemek mümkündür. Örneğin, kodun yalnızca www.example.com üzerinde çalışacak şekilde kilitlemek için www.example.com ekleyin. Kök alan adında ve tüm alt alan adları dahil (example.com, sub.example.com) çalışmasını sağlamak için .example.com kullanın.

vmDomainLockRedirectUrl

Type: string Default: about:blank

⚠️ Bu seçenek target: 'node', target: 'service-worker' veya target: 'bytenode' ile çalışmaz

Kaynak kod vmDomainLock ile belirtilen alan adlarında çalıştırılmazsa, tarayıcının geçirilen bir URL'ye yönlendirilmesine olanak tanır.

Preset Options

Yüksek obfuscation, düşük performans

Performans, obfuscation olmadan olduğundan çok daha yavaş olacaktır

{
    compact: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 1,
    deadCodeInjection: true,
    deadCodeInjectionThreshold: 1,
    debugProtection: true,
    debugProtectionInterval: 4000,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: true,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: true,
    splitStringsChunkLength: 5,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayEncoding: ['rc4'],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 5,
    stringArrayWrappersChainedCalls: true,    
    stringArrayWrappersParametersMaxCount: 5,
    stringArrayWrappersType: 'function',
    stringArrayThreshold: 1,
    transformObjectKeys: true
}

Orta obfuscation, optimal performans

Performans, obfuscation olmadan olduğundan daha yavaş olacaktır

{
    compact: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 0.75,
    deadCodeInjection: true,
    deadCodeInjectionThreshold: 0.4,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: true,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: true,
    splitStringsChunkLength: 10,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayCallsTransformThreshold: 0.75,
    stringArrayEncoding: ['base64'],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 2,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 4,
    stringArrayWrappersType: 'function',
    stringArrayThreshold: 0.75,
    transformObjectKeys: true
}

Düşük obfuscation, Yüksek performans

Performans nispeten normal bir seviyede olacaktır

{
    compact: true,
    controlFlowFlattening: false,
    deadCodeInjection: false,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: false,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: false,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: false,
    stringArrayEncoding: [],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 1,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 2,
    stringArrayWrappersType: 'variable',
    stringArrayThreshold: 0.75
}

Varsayılan hazır ayar, Yüksek performans

{
    compact: true,
    controlFlowFlattening: false,
    deadCodeInjection: false,
    debugProtection: false,
    debugProtectionInterval: 0,
    disableConsoleOutput: false,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: false,
    renameGlobals: false,
    selfDefending: false,
    simplify: true,
    splitStrings: false,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: false,
    stringArrayCallsTransformThreshold: 0.5,
    stringArrayEncoding: [],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 1,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 2,
    stringArrayWrappersType: 'variable',
    stringArrayThreshold: 0.75
}

VM Ultra High obfuscation (Maksimum Güvenlik)

Bu hazır ayar, dolaylı dağıtım dahil tüm sağlamlaştırma özellikleriyle VM tabanlı bayt kodu obfuscation'ını etkinleştirir. En güçlü korumayı sağlar ancak daha büyük çıktı boyutu ve çok daha yavaş yürütme ile.

{
    optionsPreset: 'vm-ultra-high-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,

    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,

    vmBytecodeEncoding: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: true,
    vmMacroOps: true,
    vmDebugProtection: true,
    vmSelfDefending: true,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: true,
    vmCallContextOpcodes: false,
    vmStackEncoding: true,
    vmCompactDispatcher: true,
    controlFlowFlattening: true,
    controlFlowFlatteningThreshold: 0.5,
    deadCodeInjection: true,
    deadCodeInjectionThreshold: 0.5,
    debugProtection: true,
    debugProtectionInterval: 4000,
    disableConsoleOutput: true,
    identifierNamesGenerator: 'hexadecimal',
    log: false,
    numbersToExpressions: true,
    renameGlobals: false,
    selfDefending: true,
    simplify: true,
    splitStrings: true,
    splitStringsChunkLength: 5,
    strictMode: null,
    stringArray: true,
    stringArrayCallsTransform: true,
    stringArrayEncoding: ['rc4'],
    stringArrayIndexShift: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayWrappersCount: 5,
    stringArrayWrappersChainedCalls: true,
    stringArrayWrappersParametersMaxCount: 5,
    stringArrayWrappersType: 'function',
    stringArrayThreshold: 0.5,
    transformObjectKeys: true
}

VM Anti-LLM (Yapay Zeka Ajanı Koruması)

Bu hazır ayar, yapay zeka ajanlarının ve LLM'lerin VM bayt koduna dönüştürülmüş kodu tersine mühendislikle çözmesini önlemek için özel olarak tasarlanmıştır. vm-default temel alınarak self-defending ve debug protection etkinleştirilmiştir. vm-high-obfuscation'dan daha hafiftir ancak özellikle otomatik analize karşı sağlamlaştırılmıştır.

{
    optionsPreset: 'vm-anti-llm'
}

İçerir:

  • String array ile VM bayt kodu obfuscation (vm-default'tan)
  • vmSelfDefending — hook karşıtı tespit, bütünlük karması, kaynak parmak izi, iframe temiz-realm doğrulaması, ARX şifre anahtarı türetme
  • vmDebugProtection — VM dağıtım döngüsünde hata ayıklama karşıtı kontroller
  • debugProtection: false — eski debug protection yok (VM debug protection üstündür)

VM High obfuscation (En Yüksek Güvenlik)

Bu hazır ayar, çoğu sağlamlaştırma özelliğiyle VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Ultra-high hazır ayarından daha iyi performansla güçlü koruma sağlar.

{
    optionsPreset: 'vm-high-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,
    vmBytecodeEncoding: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: true,
    vmMacroOps: true,
    vmDebugProtection: true,
    vmSelfDefending: true,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: true,
    vmCallContextOpcodes: false,
    vmStackEncoding: true,
    vmCompactDispatcher: false
}

VM Medium obfuscation (Dengeli Güvenlik)

Bu hazır ayar, dengeli bir sağlamlaştırma özellikleri kümesiyle VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Güvenlik ile performans arasında iyi bir uzlaşma.

{
    optionsPreset: 'vm-medium-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,
    vmBytecodeEncoding: true,
    vmBytecodeArrayEncoding: false,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: true,
    vmMacroOps: true,
    vmDebugProtection: true,
    vmSelfDefending: false,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: false,
    vmCallContextOpcodes: false,
    vmStackEncoding: false,
    vmCompactDispatcher: false
}

VM Low obfuscation (Temel Güvenlik, Daha İyi Performans)

Bu hazır ayar, ek sağlamlaştırma özellikleri olmadan temel VM tabanlı bayt kodu obfuscation'ını etkinleştirir. Güvenlik ile çıktı boyutu arasında iyi bir denge.

{
    optionsPreset: 'vm-low-obfuscation'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: false,
    vmBytecodeEncoding: false,
    vmBytecodeArrayEncoding: false,
    vmBytecodeArrayEncodingKey: '',
    vmBytecodeArrayEncodingKeyGetter: '',
    vmAsyncExecutor: false,
    vmJumpsEncoding: false,
    vmMacroOps: false,
    vmDebugProtection: false,
    vmSelfDefending: false,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: false,
    vmCallContextOpcodes: false,
    vmStackEncoding: false,
    vmCompactDispatcher: false
}

VM Default (VM + String Array Koruması)

Bu hazır ayar, temel VM tabanlı bayt kodu obfuscation'ını string array korumasıyla birleştirir. String koruması ile VM obfuscation için iyi bir başlangıç noktası.

{
    optionsPreset: 'vm-default'
}

Veya tek tek yapılandırın:

{
    compact: true,
    simplify: true,
    identifierNamesGenerator: 'mangled-shuffled',
    vmObfuscation: true,
    vmForceCompileDynamicCode: false,
    vmWrapTopLevelInitializers: true,
    vmDynamicOpcodes: true,
    vmBytecodeEncoding: false,
    vmBytecodeArrayEncoding: true,
    vmStringArrayBytecodeOnly: true,
    vmAsyncExecutor: false,
    vmJumpsEncoding: false,
    vmMacroOps: false,
    vmDebugProtection: false,
    vmSelfDefending: false,
    vmDefenseHook: '',
    vmDefenseReaction: {
        automation: 'break',
        debugger: 'decoy',
        sandbox: 'decoy',
        domain: 'break',
        tamper: 'break',
        integrity: 'break'
    },
    vmStatefulOpcodes: false,
    vmCallContextOpcodes: false,
    vmStackEncoding: false,
    vmCompactDispatcher: false,
    stringArray: true,
    stringArrayRotate: true,
    stringArrayShuffle: true,
    stringArrayThreshold: 1,
    stringArrayIndexShift: true,
    stringArrayIndexesType: ['hexadecimal-number'],
    stringArrayCallsTransform: true,
    stringArrayCallsTransformThreshold: 1,
    stringArrayWrappersCount: 3,
    stringArrayWrappersType: 'function',
    stringArrayWrappersParametersMaxCount: 5,
    stringArrayWrappersChainedCalls: true,
    stringArrayEncoding: ['base64'],
    splitStrings: true,
    splitStringsChunkLength: 6
}