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
renamePropertiesseç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:identifiersDictionarylistesinden tanımlayıcı adlarıhexadecimal:_0xabc123gibi tanımlayıcı adlarımangled:a,b,cgibi kısa tanımlayıcı adlarımangled-shuffled:mangledile 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,
seedseçeneğinden ve kaynak kodu karmasından türetilir; böylece aynı tohumla yapılan yeniden üretilebilir derlemeler aynı öneki üretir. identifiersPrefixile birleştirildiğinde, rastgele karakterler kullanıcının sağladığı önekin sonuna eklenir (örneğinmyApp+ rastgeleaBc123→myAppaBc123).vmObfuscationile birleştirildiğinde, rastgele değer varsayılanvmö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 (
varbildirimleri veya açıkglobalThisatamaları 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ğerdata-*, 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.0sü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.0sü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 birsourcesalanı ekler, orijinal kaynak kodu içeren birsourcesContentalanı ekler;sources- geçerli bir kaynak açıklaması içeren birsourcesalanı ekler,sourcesContentalanını eklemez. NodeJS API kullanırken,sourcesalanı değeri olarak kullanılacakinputFileNameseç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):stringArraydeğerini kodlamaz'base64'(string):stringArraydeğerinibase64kullanarak kodlar'rc4'(string):stringArraydeğerinirc4kullanarak 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ı kodunodeile aynıdır, ancak bazı tarayıcıya özgü seçeneklerinnodehedefiyle kullanılmasına izin verilmezbrowser-no-eval—browserile aynı, ancak çıktıeval()kullanmaz. Hedef sayfadaeval/unsafe-evalkullanı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 (bunlarwindow/documentgerektirir ve Node'da işlevsiz olur veya hata fırlatır). Yalnızca tarayıcıya özgü API'lere dayanan bazıvmSelfDefendingsavunmaları — 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ı.windowyok,documentyok, farklı birselfglobal'i.userscript— userscript yöneticisi sandbox'ı (örneğin Tampermonkey).vmSelfDefendingsavunmaları 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 kendisibytenode'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 vevmSelfDefendingsavunmaları buna göre ayarlanır. Nihai.jsc'yi üretmek içinbytenode'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 —
falseile eşlenen bir tür bastırılır; mevcut olmayan (veyatrueile 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:
VMGlobalFunctionNamesNotRenamed—vmObfuscationaltı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 (renameGlobalsseç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.VMTopLevelInitializerNotVirtualized—vmWrapTopLevelInitializersdevre 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ğrudaneval,Functionyapıcısı veya bir<script>/Worker'a enjekte edilenfn.toString()); bu, obfuscator'ın yeniden adlandırdığı tanımlayıcılara başvurabilir.VMDynamicCodeSkipped— bir fonksiyon, doğrudaneval/ dinamiknew Function/Functioniçerdiği için VM bayt kodlamasından atlandı (bkz.vmForceCompileDynamicCode).VMSyncFunctionSkippedInAsyncMode—vmAsyncExecutoretkinken,commentmodunda 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).VMAsyncGeneratorSkippedInAsyncMode—vmAsyncExecutorve etkin bir async anahtar getirici ile, işaretlenmiş bir async üreteç sanallaştırılamadı (yineleyicisini senkron olarak döndürmesi gerekir).BrowserTargetWithNodeStyleCode— kod,targetseçeneği tarayıcı benzeri bir ortama ayarlıyken Node.js'i hedefliyor gibi görünüyor (örneğinrequire('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.
Ö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:
- Kullanılmayan talimatları filtreler - Kodunuz sınıf kullanmıyorsa, sınıfla ilgili talimatlar tamamen kaldırılır
- 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 (
targetdeğeribrowserolarak 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) veyaintegrity(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ızcascore >= thresholdolduğunda tetiklenir. Çoğu kontrol ya hep ya hiçtir (tek belirleyici bir sinyal);headless, birkaç tarayıcı-şekli sinyalini toplar, dolayısıylascoredeğeri genelliklethresholddeğerinden yüksektir.
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 sourcedeğerleri —headless,agent,node,debugger,timing,sandbox,domain,nativeHook,integritycategorydeğerleri —automation,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:
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 kesdecoy— zehirlenmiş durumla çalışmaya devam et, sessizce yanlış sonuçlar üretnone— 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: falseolduğunda — bayt kodu sabit havuzlarındaki (cdizileri) stringler çıkarılırvmBytecodeArrayEncoding: trueolduğunda — üst düzey base64 kodlu bayt kodu stringleri çıkarılırstringArrayThreshold, 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üretmevmDebugProtection— VM dağıtım döngüsünde hata ayıklama karşıtı kontrollerdebugProtection: 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
renamePropertiesseç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:identifiersDictionarylistesinden tanımlayıcı adlarıhexadecimal:_0xabc123gibi tanımlayıcı adlarımangled:a,b,cgibi kısa tanımlayıcı adlarımangled-shuffled:mangledile 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,
seedseçeneğinden ve kaynak kodu karmasından türetilir; böylece aynı tohumla yapılan yeniden üretilebilir derlemeler aynı öneki üretir. identifiersPrefixile birleştirildiğinde, rastgele karakterler kullanıcının sağladığı önekin sonuna eklenir (örneğinmyApp+ rastgeleaBc123→myAppaBc123).vmObfuscationile birleştirildiğinde, rastgele değer varsayılanvmö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 (
varbildirimleri veya açıkglobalThisatamaları 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ğerdata-*, 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.0sü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.0sü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 birsourcesalanı ekler, orijinal kaynak kodu içeren birsourcesContentalanı ekler;sources- geçerli bir kaynak açıklaması içeren birsourcesalanı ekler,sourcesContentalanını eklemez. NodeJS API kullanırken,sourcesalanı değeri olarak kullanılacakinputFileNameseç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):stringArraydeğerini kodlamaz'base64'(string):stringArraydeğerinibase64kullanarak kodlar'rc4'(string):stringArraydeğerinirc4kullanarak 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ı kodunodeile aynıdır, ancak bazı tarayıcıya özgü seçeneklerinnodehedefiyle kullanılmasına izin verilmezbrowser-no-eval—browserile aynı, ancak çıktıeval()kullanmaz. Hedef sayfadaeval/unsafe-evalkullanı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 (bunlarwindow/documentgerektirir ve Node'da işlevsiz olur veya hata fırlatır). Yalnızca tarayıcıya özgü API'lere dayanan bazıvmSelfDefendingsavunmaları — 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ı.windowyok,documentyok, farklı birselfglobal'i.userscript— userscript yöneticisi sandbox'ı (örneğin Tampermonkey).vmSelfDefendingsavunmaları 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 kendisibytenode'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 vevmSelfDefendingsavunmaları buna göre ayarlanır. Nihai.jsc'yi üretmek içinbytenode'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 —
falseile eşlenen bir tür bastırılır; mevcut olmayan (veyatrueile 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:
VMGlobalFunctionNamesNotRenamed—vmObfuscationaltı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 (renameGlobalsseç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.VMTopLevelInitializerNotVirtualized—vmWrapTopLevelInitializersdevre 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ğrudaneval,Functionyapıcısı veya bir<script>/Worker'a enjekte edilenfn.toString()); bu, obfuscator'ın yeniden adlandırdığı tanımlayıcılara başvurabilir.VMDynamicCodeSkipped— bir fonksiyon, doğrudaneval/ dinamiknew Function/Functioniçerdiği için VM bayt kodlamasından atlandı (bkz.vmForceCompileDynamicCode).VMSyncFunctionSkippedInAsyncMode—vmAsyncExecutoretkinken,commentmodunda 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).VMAsyncGeneratorSkippedInAsyncMode—vmAsyncExecutorve etkin bir async anahtar getirici ile, işaretlenmiş bir async üreteç sanallaştırılamadı (yineleyicisini senkron olarak döndürmesi gerekir).BrowserTargetWithNodeStyleCode— kod,targetseçeneği tarayıcı benzeri bir ortama ayarlıyken Node.js'i hedefliyor gibi görünüyor (örneğinrequire('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.
Ö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:
- Kullanılmayan talimatları filtreler - Kodunuz sınıf kullanmıyorsa, sınıfla ilgili talimatlar tamamen kaldırılır
- 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 (
targetdeğeribrowserolarak 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) veyaintegrity(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ızcascore >= thresholdolduğunda tetiklenir. Çoğu kontrol ya hep ya hiçtir (tek belirleyici bir sinyal);headless, birkaç tarayıcı-şekli sinyalini toplar, dolayısıylascoredeğeri genelliklethresholddeğerinden yüksektir.
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 sourcedeğerleri —headless,agent,node,debugger,timing,sandbox,domain,nativeHook,integritycategorydeğerleri —automation,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:
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 kesdecoy— zehirlenmiş durumla çalışmaya devam et, sessizce yanlış sonuçlar üretnone— 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: falseolduğunda — bayt kodu sabit havuzlarındaki (cdizileri) stringler çıkarılırvmBytecodeArrayEncoding: trueolduğunda — üst düzey base64 kodlu bayt kodu stringleri çıkarılırstringArrayThreshold, 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üretmevmDebugProtection— VM dağıtım döngüsünde hata ayıklama karşıtı kontrollerdebugProtection: 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
}
