オプションリファレンス
目次
compact
Type: boolean Default: true
コードを 1 行に圧縮して出力します。
config
Type: string Default: ``
難読化ツールのオプションを含む JS/JSON 設定ファイルの名前です。これらの設定は、CLI に直接渡されたオプションによって上書きされます。
controlFlowFlattening
Type: boolean Default: false
⚠️ このオプションはパフォーマンスに大きな影響を与え、実行速度が最大 1.5 倍遅くなります。制御フローの平坦化の影響を受けるノードの割合を設定するには、controlFlowFlatteningThreshold を使用してください。
コードの制御フローの平坦化を有効にします。制御フローの平坦化は、ソースコードの構造を変換してプログラムの理解を妨げる手法です。
例:
// 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 変換が任意のノードに適用される確率です。
この設定は、大量の制御フロー変換がコードの速度を低下させ、コードサイズを増大させる可能性があるため、コードサイズが大きい場合に特に有用です。
controlFlowFlatteningThreshold: 0 は controlFlowFlattening: false と同等です。
deadCodeInjection
Type: boolean Default: false
⚠️ 難読化されたコードのサイズが大幅に増加します(最大 200%)。難読化されたコードのサイズが問題にならない場合にのみ使用してください。デッドコード注入の影響を受けるノードの割合を設定するには、deadCodeInjectionThreshold を使用してください。
⚠️ このオプションは stringArray オプションを強制的に有効にします。
⚠️ このオプションは vmObfuscation が有効な場合、暗黙的に無効化されます。
このオプションを使用すると、ランダムなデッドコードのブロックが難読化されたコードに追加されます。
例:
// 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 の影響を受けるノードの割合を設定できます。
debugProtection
Type: boolean Default: false
⚠️ 開発者ツールを開くと、ブラウザーがフリーズする可能性があります。
⚠️ このオプションは vmObfuscation が有効な場合、暗黙的に無効化されます。代わりに vmDebugProtection を使用してください。
このオプションは、開発者ツールの debugger 機能をほぼ使用不可能にします(WebKit ベースおよび Mozilla Firefox の両方)。
debugProtectionInterval
Type: number Default: 0
⚠️ ブラウザーがフリーズする可能性があります! 自己責任でご使用ください。
⚠️ このオプションは vmObfuscation が有効な場合、暗黙的に無効化されます。代わりに vmDebugProtection を使用してください。
設定すると、ミリ秒単位のインターバルを使用してコンソールタブでデバッグモードを強制し、開発者ツールの他の機能を使いにくくします。debugProtection が有効な場合に機能します。推奨値は 2000~4000 ミリ秒です。
disableConsoleOutput
Type: boolean Default: false
⚠️ このオプションは、すべてのスクリプトで console の呼び出しをグローバルに無効化します
console.log、console.info、console.error、console.warn、console.debug、console.exception、console.trace を空の関数に置き換えることで、それらの使用を無効化します。これにより、デバッガーの使用が困難になります。
domainLock
Type: string[] Default: []
⚠️ このオプションは target: 'node'、target: 'service-worker'、target: 'bytenode' では機能しません
難読化されたソースコードを、特定のドメインやサブドメインでのみ実行できるようにします。これにより、ソースコードを単にコピー&ペーストして別の場所で実行することが非常に困難になります。
ソースコードがこのオプションで指定されたドメイン上で実行されていない場合、ブラウザーは domainLockRedirectUrl オプションに渡された URL にリダイレクトされます。
複数のドメインとサブドメイン
コードを複数のドメインやサブドメインにロックすることも可能です。たとえば、コードが www.example.com でのみ実行されるようにロックするには、www.example.com を追加します。ルートドメインおよびすべてのサブドメイン(example.com、sub.example.com)で機能させるには、.example.com を使用します。
domainLockRedirectUrl
Type: string Default: about:blank
⚠️ このオプションは target: 'node'、target: 'service-worker'、target: 'bytenode' では機能しません
ソースコードが domainLock で指定されたドメイン上で実行されていない場合に、ブラウザーを指定した URL にリダイレクトできるようにします。
exclude
Type: string[] Default: []
難読化から除外するファイルを示すファイル名またはグロブです。
forceTransformStrings
Type: string[] Default: []
渡された RegExp パターンに一致する文字列リテラルの変換を強制的に有効にします。
⚠️ このオプションは、stringArrayThreshold(または将来的に追加される可能性のある他のしきい値)によって変換されるべきでない文字列にのみ影響します
このオプションは reservedStrings オプションよりも優先されますが、conditional comments よりは優先されません。
例:
{
forceTransformStrings: [
'some-important-value',
'some-string_\d'
]
}
identifierNamesCache
Type: Object | null Default: null
このオプションの主な目的は、複数のソース/ファイルの難読化中に同じ識別子名を使用できるようにすることです。
現在、2 種類の識別子がサポートされています:
- グローバル識別子:
- すべてのグローバル識別子がキャッシュに書き込まれます。
- 一致した未宣言のグローバル識別子は、キャッシュの値で置き換えられます。
- プロパティ識別子(
renamePropertiesオプションが有効な場合のみ):- すべてのプロパティ識別子がキャッシュに書き込まれます。
- 一致したすべてのプロパティ識別子は、キャッシュの値で置き換えられます。
Node.js API
null 値を渡すと、キャッシュを完全に無効化します。
空のオブジェクト({})を渡すと、識別子名のキャッシュオブジェクト(TIdentifierNamesCache 型)への書き込みが有効になります。このキャッシュオブジェクトには、ObfuscationResult オブジェクトの getIdentifierNamesCache メソッドの呼び出しを通じてアクセスできます。
結果として得られたキャッシュオブジェクトは、次に identifierNamesGenerator オプションの値として使用でき、以降のソースで一致するすべての識別子名の難読化時にこれらの名前を使用できます。
例:
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 には別のオプション --identifier-names-cache-path があり、識別子名のキャッシュの読み書きに使用される既存の .json ファイルへのパスを定義できます。
空のファイルへのパスが渡された場合、識別子名のキャッシュがそのファイルに書き込まれます。
既存のキャッシュを含むこのファイルは、次に --identifier-names-cache-path オプションの値として再度使用でき、以降のファイルで一致するすべての識別子名の難読化時にこれらの名前を使用できます。
identifierNamesGenerator
Type: string Default: hexadecimal
識別子名のジェネレーターを設定します。
利用可能な値:
dictionary:identifiersDictionaryリストの識別子名hexadecimal:_0xabc123のような識別子名mangled:a、b、cのような短い識別子名mangled-shuffled:mangledと同様ですが、アルファベットがシャッフルされます
identifiersDictionary
Type: string[] Default: []
identifierNamesGenerator: dictionary オプション用の識別子辞書を設定します。辞書の各識別子は、各文字の大文字・小文字を変えた複数のバリエーションで使用されます。したがって、辞書内の識別子の数は、元のソースコードの識別子の数に応じて決める必要があります。
identifiersPrefix
Type: string Default: ''
すべてのグローバル識別子にプレフィックスを設定します。
複数のファイルを難読化する場合にこのオプションを使用してください。このオプションは、これらのファイルのグローバル識別子間の競合を回避するのに役立ちます。プレフィックスはファイルごとに異なるものにする必要があります。
randomIdentifiersPrefix
Type: boolean Default: false
すべてのグローバル識別子に、シードから生成されるランダムなプレフィックス(英数字 6 文字)を付加します。このオプションを使用すると、同じグローバルスコープに読み込まれる、個別に難読化されたバンドル間の衝突を回避できます。バンドルごとに一意の identifiersPrefix を手動で選ぶ必要がなくなります。
- ランダムな値は
seedオプションとソースコードのハッシュから導出されるため、同じシードによる再現可能なビルドでは同じプレフィックスが生成されます。 identifiersPrefixと組み合わせた場合、ランダムな文字はユーザーが指定したプレフィックスの後に付加されます(例:myApp+ ランダムなaBc123→myAppaBc123)。vmObfuscationと組み合わせた場合、ランダムな値がデフォルトのvmプレフィックスを置き換えます。ランダム性によって一意性がすでに保証されているためです。
ignoreImports
Type: boolean Default: false
require によるインポートの難読化を防ぎます。何らかの理由で実行環境が静的な文字列のみでこれらのインポートを要求する場合に役立つことがあります。
inputFileName
Type: string Default: ''
ソースコードを含む入力ファイルの名前を設定できます。この名前はソースマップ生成のために内部的に使用されます。
NodeJS API を使用し、sourceMapSourcesMode オプションが sources 値を持つ場合に必要です。
log
Type: boolean Default: false
情報のコンソールへのログ出力を有効にします。
numbersToExpressions
Type: boolean Default: false
数値を式に変換する機能を有効にします。
例:
// input
const foo = 1234;
// output
const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;
optionsPreset
Type: string Default: default
オプションプリセットを設定できます。
利用可能な値:
vm-default;vm-low-obfuscation;vm-medium-obfuscation;vm-high-obfuscation;vm-ultra-high-obfuscation;default;low-obfuscation;medium-obfuscation;high-obfuscation.
追加のオプションはすべて、選択したオプションプリセットにマージされます。
parseHtml
Type: boolean Default: false
HTML の <script> タグ内の JavaScript の難読化を有効にします。
有効にすると、難読化ツールは次の処理を行います:
- 入力が HTML かどうかを自動検出します(
<!DOCTYPE、<html>、<head>、<body>、<script>タグの有無を確認) data-javascript-obfuscator属性が付いた<script>タグから JavaScript を抽出します- HTML 構造を保持しながら、マークされた各スクリプトを個別に難読化します
- 難読化されたコードを元の位置に注入し直します
重要: data-javascript-obfuscator 属性を持つスクリプトのみが難読化されます。マークされた各スクリプトは個別かつ独立して難読化されます。つまり:
- マークされたスクリプトタグ内のコードは独立している必要があります - 他のマークされたスクリプトタグで定義された変数、関数、クラスを参照してはいけません
- マークされていないスクリプトは、マークされたスクリプトが定義したグローバル(
var宣言や明示的なglobalThisへの代入経由)に引き続きアクセスできます - これにより、どのスクリプトを保護するかを明示的に制御できます
難読化される(data-javascript-obfuscator 属性が必要):
<script data-javascript-obfuscator>- 通常のスクリプト<script type="text/javascript" data-javascript-obfuscator>- 型が明示的に指定されたスクリプト- 追加の属性(
id、class、その他のdata-*など)を持つスクリプト
スキップされる(変更されない):
data-javascript-obfuscator属性を持たないスクリプト<script type="module">- ES モジュール(属性が付いていても)<script src="...">- 外部スクリプト(属性が付いていても)- 空のスクリプトタグ
注意: parseHtml が有効な場合、ソースマップは生成されません。HTML 出力に対して正しくマッピングされないためです。
例:
// 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
⚠️ このオプションはコードを壊す可能性があります。動作を理解している場合にのみ有効にしてください!
グローバル変数名と関数名の宣言を含めた難読化を有効にします。
このオプションが無効で、入力コードがグローバルスコープに関数やクラスを宣言している場合(つまりコードが IIFE でラップされていない場合)、それらの名前は難読化された出力でもそのまま維持されます。他のスクリプトがそれらを名前で参照している可能性があるためです。vmObfuscation の下では、これらの名前を列挙した VMGlobalFunctionNamesNotRenamed 警告が報告されます。関数本体はバイトコードとして隠されますが、読み取り可能なトップレベルの名前がコードの機能を(たとえば LLM に対して)依然として明らかにしてしまうためです。この露出を避けるには、コードを IIFE でラップするか、このオプションを有効にしてください。
renameProperties
Type: boolean Default: false
⚠️ このオプションはコードを壊す可能性があります。動作を理解している場合にのみ有効にしてください!
プロパティ名のリネームを有効にします。すべての組み込み DOM プロパティおよびコア JavaScript クラスのプロパティは無視されます。
このオプションの safe モードと unsafe モードを切り替えるには、renamePropertiesMode オプションを使用してください。
リネームされたプロパティ名の形式を設定するには、identifierNamesGenerator オプションを使用してください。
どのプロパティをリネームするかを制御するには、reservedNames オプションを使用してください。
例:
// 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 モードであっても、renameProperties オプションはコードを壊す可能性があります。
renameProperties オプションのモードを指定します:
safe-2.11.0リリース以降のデフォルトの動作です。実行時エラーを防ぐため、より安全な方法でプロパティのリネームを試みます。このモードでは、一部のプロパティがリネームから除外されます。unsafe-2.11.0リリース以前のデフォルトの動作です。制限なしに安全でない方法でプロパティをリネームします。
あるファイルが別のファイルのプロパティを使用している場合は、identifierNamesCache オプションを使用して、これらのファイル間で同じプロパティ名を維持してください。
reservedNames
Type: string[] Default: []
渡された RegExp パターンに一致する識別子の難読化と生成を無効にします。
例:
{
reservedNames: [
'^someVariable',
'functionParameter_\d'
]
}
reservedStrings
Type: string[] Default: []
渡された RegExp パターンに一致する文字列リテラルの変換を無効にします。一致した文字列は、難読化された出力でも表示されたまま残ります。
VM 難読化を使用する場合、予約された文字列は表示されたままにするため、別の暗号化されていない配列に格納されます。これは、監視用の API エンドポイントやライブラリ識別子など、読み取り可能なまま残す必要がある文字列に役立ちます。
例:
{
reservedStrings: [
'react-native',
'\.\/src\/test',
'some-string_\d'
]
}
seed
Type: string|number Default: 0
このオプションは乱数ジェネレーターのシードを設定します。これは再現可能な結果を生成する際に役立ちます。
シードが 0 の場合、乱数ジェネレーターはシードなしで動作します。
selfDefending
Type: boolean Default: false
⚠️ このオプションで難読化した後は、コードをいかなる方法でも変更しないでください。コードの整形(uglify)などの変更は Self Defending を作動させ、コードが動作しなくなる可能性があります!
⚠️ このオプションは compact の値を強制的に true に設定します
⚠️ このオプションは vmObfuscation が有効な場合、暗黙的に無効化されます。代わりに vmSelfDefending を使用してください。
このオプションは、出力コードを整形や変数のリネームに対して耐性のあるものにします。難読化されたコードに JavaScript の整形ツールを使用しようとすると、コードが動作しなくなり、理解や変更がより困難になります。
simplify
Type: boolean Default: true
簡略化による追加のコード難読化を有効にします。
⚠️ 将来のリリースでは、boolean リテラルの難読化(true => !![])がこのオプションの配下に移されます。
例:
// 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
難読化されたコードのソースマップ生成を有効にします。
ソースマップは、難読化された JavaScript ソースコードのデバッグに役立ちます。本番環境でデバッグしたい場合や必要がある場合は、別のソースマップファイルを秘密の場所にアップロードし、ブラウザーをそこに向けることができます。
sourceMapBaseUrl
Type: string Default: ``
sourceMapMode: 'separate' の場合に、ソースマップのインポート URL のベース URL を設定します。
CLI の例:
javascript-obfuscator input.js --output out.js --source-map true --source-map-base-url 'http://localhost:9000'
結果:
//# sourceMappingURL=http://localhost:9000/out.js.map
sourceMapFileName
Type: string Default: ``
sourceMapMode: 'separate' の場合に、出力するソースマップのファイル名を設定します。
CLI の例:
javascript-obfuscator input.js --output out.js --source-map true --source-map-base-url 'http://localhost:9000' --source-map-file-name example
結果:
//# sourceMappingURL=http://localhost:9000/example.js.map
sourceMapMode
Type: string Default: separate
ソースマップの生成モードを指定します:
inline- 各 .js ファイルの末尾にソースマップを追加します。separate- ソースマップを含む対応する '.map' ファイルを生成します。CLI 経由で難読化ツールを実行する場合、難読化されたコードのファイルの末尾にソースマップファイルへのリンク//# sourceMappingUrl=file.js.mapを追加します。
sourceMapSourcesMode
Type: string Default: sources-content
ソースマップの sources フィールドと sourcesContent フィールドを制御できます:
sources-content- ダミーのsourcesフィールドを追加し、元のソースコードを含むsourcesContentフィールドを追加します。sources- 有効なソース記述を含むsourcesフィールドを追加し、sourcesContentフィールドは追加しません。NodeJS API を使用する場合、sourcesフィールドの値として使用されるinputFileNameオプションを定義する必要があります。
splitStrings
Type: boolean Default: false
リテラル文字列を splitStringsChunkLength オプションの値の長さのチャンクに分割します。
例:
// input
(function(){
var test = 'abcdefg';
})();
// output
(function(){
var _0x5a21 = 'ab' + 'cd' + 'ef' + 'g';
})();
splitStringsChunkLength
Type: number Default: 10
splitStrings オプションのチャンク長を設定します。
stringArray
Type: boolean Default: true
文字列リテラルを削除し、専用の配列に配置します。たとえば、var m = "Hello World"; の文字列 "Hello World" は、var m = _0x12c456[0x1]; のようなものに置き換えられます。
stringArrayCallsTransform
Type: boolean Default: false
⚠️ stringArray オプションが有効になっている必要があります
stringArray への呼び出しの変換を有効にします。これらの呼び出しのすべての引数は、stringArrayCallsTransformThreshold の値に応じて別のオブジェクトに抽出される場合があります。
これにより、文字列配列への呼び出しを自動的に見つけることがさらに困難になります。
例:
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 と stringArrayCallsTransformThreshold オプションが有効になっている必要があります
この設定を使用して、文字列配列への呼び出しが変換される確率(0 から 1)を調整できます。
stringArrayEncoding
Type: string[] Default: []
⚠️ stringArray オプションが有効になっている必要があります
このオプションはスクリプトの速度を低下させる可能性があります。
stringArray のすべての文字列リテラルを base64 または rc4 を使用してエンコードし、実行時にそれをデコードするための特別なコードを挿入します。
各 stringArray の値は、渡されたリストからランダムに選ばれたエンコードでエンコードされます。これにより、複数のエンコードを使用できます。
利用可能な値:
'none'(boolean):stringArrayの値をエンコードしません'base64'(string):base64を使用してstringArrayの値をエンコードします'rc4'(string):rc4を使用してstringArrayの値をエンコードします。base64より約 30~50% 遅くなりますが、初期値を取得するのがより困難になります。
たとえば、次のオプション値では、一部の stringArray の値はエンコードされず、一部の値は base64 および rc4 エンコードでエンコードされます:
stringArrayEncoding: [
'none',
'base64',
'rc4'
]
stringArrayIndexesType
Type: string[] Default: ['hexadecimal-number']
⚠️ stringArray オプションが有効になっている必要があります
文字列配列の呼び出しインデックスの型を制御できます。
各 stringArray の呼び出しインデックスは、渡されたリストからランダムに選ばれた型で変換されます。これにより、複数の型を使用できます。
利用可能な値:
'hexadecimal-number'(default): 文字列配列の呼び出しインデックスを 16 進数として変換します'hexadecimal-numeric-string': 文字列配列の呼び出しインデックスを 16 進数の数値文字列として変換します
2.9.0 リリース以前は、javascript-obfuscator はすべての文字列配列の呼び出しインデックスを hexadecimal-numeric-string 型で変換していました。これにより手作業での難読化解除は多少難しくなりますが、自動難読化解除ツールがこれらの呼び出しを容易に検出できてしまいます。
新しい hexadecimal-number 型は、コード内の文字列配列の呼び出しパターンの自動検出をより困難にすることを目指しています。
将来的にはさらに多くの型が追加される予定です。
stringArrayIndexShift
Type: boolean Default: true
⚠️ stringArray オプションが有効になっている必要があります
すべての文字列配列の呼び出しに対して、追加のインデックスシフトを有効にします。
stringArrayRotate
Type: boolean Default: true
⚠️ stringArray が有効になっている必要があります
stringArray 配列を、固定かつランダムな(コードの難読化時に生成される)位置だけシフトします。これにより、削除された文字列の順序を元の位置と対応付けることが困難になります。
stringArrayShuffle
Type: boolean Default: true
⚠️ stringArray が有効になっている必要があります
stringArray 配列の項目をランダムにシャッフルします。
stringArrayWrappersCount
Type: number Default: 1
⚠️ stringArray オプションが有効になっている必要があります
各ルートまたは関数スコープ内の string array 用ラッパーの数を設定します。
各スコープ内のラッパーの実際の数は、そのスコープ内の literal ノードの数によって制限されます。
例:
// 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 と stringArrayWrappersCount オプションが有効になっている必要があります
string array ラッパー間の連鎖呼び出しを有効にします。
例:
// 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 オプションが有効になっている必要があります
⚠️ 現在このオプションは、stringArrayWrappersType の function オプション値によって追加されたラッパーにのみ影響します
文字列配列ラッパーのパラメーターの最大数を制御できます。
デフォルト値および最小値は 2 です。推奨値は 2~5 です。
stringArrayWrappersType
Type: string Default: variable
⚠️ stringArray と stringArrayWrappersCount オプションが有効になっている必要があります
stringArrayWrappersCount オプションによって追加されるラッパーの型を選択できます。
利用可能な値:
'variable': 各スコープの先頭に変数ラッパーを追加します。高速なパフォーマンスです。'function': 各スコープ内のランダムな位置に関数ラッパーを追加します。variableよりもパフォーマンスは遅くなりますが、より厳格な難読化を提供します。
パフォーマンスの低下が難読化対象アプリケーションに大きな影響を与えない場合は、より高い難読化のために function ラッパーを使用することを強くお勧めします。
'function' オプション値の例:
// 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.75 Min: 0 Max: 1
⚠️ stringArray オプションが有効になっている必要があります
この設定を使用して、文字列リテラルが stringArray に挿入される確率(0 から 1)を調整できます。
この設定は、string array を繰り返し呼び出すことでコードの速度を低下させる可能性があるため、コードサイズが大きい場合に特に有用です。
stringArrayThreshold: 0 は stringArray: false と同等です。
strictMode
Type: boolean | null Default: null
JavaScript の strict モードに関して、難読化ツールがコードをどのように扱うかを指定できます。
利用可能な値:
null(デフォルト) - コードから strict モードを自動検出します。コードに明示的な'use strict'ディレクティブ、ES モジュール構文、またはクラスメソッドが含まれている場合、strict モードとして扱われます。それ以外の場合は sloppy モードとみなされます。true- 明示的な'use strict'ディレクティブがなくても、すべてのコードを strict モードとして扱うことを強制します。コードが strict モードのコンテキスト(ES モジュール、バンドラー、モダンなフレームワークなど)で実行される場合に使用してください。false- 明示的な strict モードの指標('use strict'、ES モジュール、クラスメソッド)のみが strict として扱われます。親スコープの継承は JS の仕様どおり引き続き適用されます。
target
Type: string Default: browser
難読化されたコードのターゲット環境を設定できます。
利用可能な値:
browser(デフォルト) - 標準的な Web ページ環境です。出力コードはnodeと同一ですが、一部のブラウザー固有のオプションはnodeターゲットでは使用できませんbrowser-no-eval-browserと同じですが、出力でeval()を使用しません。ターゲットページの Content Security Policy がeval/unsafe-evalを禁止している場合に使用してくださいnode- Node.js 環境です。ブラウザー固有のオプションは無効化されます(それらはwindow/documentを必要とし、Node では何もしないか例外をスローするためです)。ヘッドレスブラウザーの検知、iframe を用いたクリーンレルムの回復、インスペクター/DOM 対策のチェックなど、ブラウザー専用の API に依存する一部のvmSelfDefendingの防御は、このターゲットでは出力されませんservice-worker- Service Worker のコンテキストです。windowもdocumentもなく、selfグローバルが異なりますuserscript- ユーザースクリプトマネージャーのサンドボックス(Tampermonkey など)です。vmSelfDefendingの防御はそれに応じて調整されますbytenode- 難読化後に bytenode ローダー(V8 のキャッシュされたバイトコード.jsc)でコンパイルされる Node.js コードです。難読化ツール自体はbytenodeを呼び出しません。bytenode のコンパイルステップを通過できるよう構造化されたランタイムを持つ VM 難読化された JavaScript を出力するだけです。vmSelfDefendingの防御はそれに応じて調整されます。最終的な.jscを生成するには、難読化された出力に対してご自身でbytenodeを実行してください
transformObjectKeys
Type: boolean Default: false
オブジェクトのキーの変換を有効にします。
例:
// 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
出力される致命的でない難読化の警告を制御します。
利用可能な値:
'all'(デフォルト) - すべての警告が出力されます。'none'- すべての警告が抑制されます。- 警告の種類をブール値にマッピングするオブジェクト -
falseにマッピングされた種類は抑制されます。存在しない(またはtrueにマッピングされた)すべての種類は有効なままになります。たとえば、{ "VMGlobalFunctionNamesNotRenamed": false }は、その 1 つを除くすべての警告を維持します。
警告の種類:
VMGlobalFunctionNamesNotRenamed-vmObfuscationの下で、トップレベルの関数宣言、クラス宣言、および関数/アロー/クラス式が代入された変数の名前がそのまま維持された場合です(renameGlobalsオプションが無効で、コードが IIFE でラップされていない)。本体はバイトコードとして隠されますが、名前は出力に読み取り可能なまま残ります。エクスポートされた名前は報告されません。VMTopLevelInitializerNotVirtualized-vmWrapTopLevelInitializersが無効であるか、それらを仮想化できなかったため、トップレベルの変数初期化式が VM 難読化の下でプレーンな JavaScript のまま残った場合です。DynamicCodeRenameRisk- コードが実行時に文字列から関数を構築している場合です(直接eval、Functionコンストラクター、または<script>/Worker に注入されるfn.toString())。難読化ツールがリネームした識別子を参照している可能性があります。VMDynamicCodeSkipped- 関数が直接eval/ 動的なnew Function/Functionを含んでいたため、VM バイトコード化からスキップされた場合です(vmForceCompileDynamicCodeを参照)。VMNoFunctionsToVirtualize-vmObfuscationが有効ですが、コードに仮想化できる関数が 1 つもないため(alert(1);のようなトップレベルのみのコードなど)、VM 保護は適用されませんでした。VM 難読化は関数本体のみを保護します。保護したいコードは関数で包んでください。VMSyncFunctionSkippedInAsyncMode-vmAsyncExecutorが有効な状態で、commentモードで明示的にマークした関数が同期関数であることが判明し、スキップされた場合です(そのモードでは非同期関数のみが仮想化されます)。VMAsyncGeneratorSkippedInAsyncMode-vmAsyncExecutorと非同期キーゲッターが有効な状態で、マークされた非同期ジェネレーターを仮想化できなかった場合です(イテレーターを同期的に返す必要があります)。BrowserTargetWithNodeStyleCode-targetオプションがブラウザー系の環境に設定されているにもかかわらず、コードが Node.js を対象としているように見える場合です(require('fs')、__dirname、process.argvなど)。ParseHtmlNoMarkedScripts-parseHtmlが有効になっていますが、入力にdata-javascript-obfuscator属性を持つ<script>タグが存在しないため、何も難読化されず、HTML はそのまま返されました。
vmObfuscation
Type: boolean Default: false
VM ベースのバイトコード難読化を有効にします。有効にすると、JavaScript の関数が、組み込みの仮想マシン上で実行されるカスタムバイトコードにコンパイルされます。元のコードのロジックが完全に変換されるため、これは最高レベルの保護を提供します。
例:
return qty * price のような読み取り可能なコードは、[0x15,0x03,0x17,...] のような数値のリストになり、組み込みの VM インタープリターだけがそれを実行できます。元のロジックは JavaScript として見えなくなります。
vmTargetFunctions
Type: string[] Default: []
どのルートレベルの関数に VM 保護を適用するかを名前で正確に指定します。
例:
{
vmObfuscation: true,
vmTargetFunctions: ['someFunctionName']
}
結果: これら 3 つの関数だけが VM で保護されます。それ以外はすべて通常の(ただし依然として難読化された)JavaScript のままになります。機密性の高いライセンスチェックや認証ロジックを保護しつつ、残りのコードを軽量に保つのに最適です。
vmExcludeFunctions
Type: string[] Default: []
VM 保護を適用しないルートレベルの関数を指定します。他の設定よりも優先されます。
例:
{
vmObfuscation: true,
vmExcludeFunctions: ['someFunctionName']
}
使いどころ: パフォーマンスが重要なルートレベルの関数(アニメーションループ、リアルタイムのデータ処理)は、VM のオーバーヘッドを避けるために除外しつつ、それ以外のすべてを保護できます。
vmTargetFunctionsMode
Type: string Default: root
どの関数/メソッドを VM 難読化の対象にするかを制御します。
例 - コメントモード:
// 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'
}
使いどころ: どの関数に VM 保護を適用するかを厳密に制御する必要がある場合、特に機密性の高いロジックを含むネストされた関数に有用です。ルートレベルの名前付き関数でのみ機能する vmTargetFunctions とは異なり、コメントモードではコード内の任意の場所にある任意の関数を保護できます。
vmForceCompileDynamicCode
Type: boolean Default: false
直接 eval、new Function(...)、または Function(...) の呼び出しを含む関数に対して、VM 難読化が何を行うかを制御します。
デフォルトでは、そのような関数(およびその内部で定義されたすべての関数)は VM バイトコード化からスキップされ、VMDynamicCodeSkipped 警告が報告されます。これは、実行時に構築されるソースが、難読化ツールがリネームした周囲のスコープチェーンの識別子を参照する可能性があるためです。
true に設定すると、その関数はいずれにせよバイトコード化され、VMDynamicCodeSkipped 警告は出力されなくなります。
別の DynamicCodeRenameRisk 警告は、このオプションに関係なく引き続き発生します。それが説明するリネームのリスクは VM のスキップとは無関係であり、このオプションを有効にしても根底にあるパターンが安全になるわけではないためです。
// Source code
function loadConfig(src) {
return eval(src);
}
loadConfig('1 + 2');
// Options
{
vmObfuscation: true,
vmForceCompileDynamicCode: true
}
オプションがオフ(デフォルト)の場合、loadConfig はプレーンな JavaScript のまま残ります。オプションがオンの場合、loadConfig は他の関数と同様に VM バイトコードにコンパイルされます。呼び出し箇所を精査し、実行時に構築されるコードがクロージャでリネームされた識別子に依存しないことがわかっている場合に使用してください。
vmWrapTopLevelInitializers
Type: boolean Default: false
一部のトップレベルの変数初期化式を IIFE(即時実行関数式)でラップし、VM 難読化できるようにします。
動作内容: このオプションがない場合、トップレベルの定数や変数は出力に表示されたまま残ります:
// Input
const MY_STRING = "my-string";
// Output (without vmWrapTopLevelInitializers)
const MY_STRING = "my-string"; // String is visible!
このオプションを有効にすると、初期化式は VM 難読化される IIFE でラップされます:
// Input
const MY_STRING = "my-string";
// Output (with vmWrapTopLevelInitializers: true)
const MY_STRING = (() => { return /* VM bytecode call */ })(); // String hidden in bytecode
注意: このオプションは vmTargetFunctionsMode が 'root'(デフォルト)の場合にのみ機能します。
警告: VM 難読化の下でトップレベルの初期化式がプレーンな JavaScript のまま残るたびに、影響を受ける変数名を列挙した VMTopLevelInitializerNotVirtualized 警告が報告されます。これには次が含まれます: このオプションが無効な場合、このオプションがスキップせざるを得なかった初期化式(それぞれ理由付き。たとえば初期化式が兄弟の宣言子を参照している、またはトップレベルの await を含む)、および同期ラッパーをまったく仮想化できない vmAsyncExecutor モードです。
vmDynamicOpcodes
Type: boolean Default: false
VM インタープリターをより小さく、ビルドごとに一意にします。
動作内容:
- 未使用の命令をフィルタリング - コードがクラスを使用していない場合、クラス関連の命令は完全に削除されます
- 構造をランダム化 - 命令ハンドラーの順序がビルドごとにシャッフルされます
その結果、出力がより小さくなり、各ビルドが異なって見えるようになります。
vmBytecodeEncoding
Type: boolean Default: false
各バイトコード命令をエンコードし(実行中に 1 つずつデコードされます)、バイトコードプールに格納された文字列定数をマスクします。これにより、コンパイル済みのバイトコードに平文の文字列が残りません。
vmBytecodeArrayEncoding
Type: boolean Default: false
バイトコード配列全体を単一のブロックとしてエンコードします。配列は実行が始まる前に起動時に一度デコードされます。2 層の保護のために vmBytecodeEncoding と併用してください。
vmBytecodeArrayEncodingKey
Type: string Default: ''
バイトコード配列のエンコード用のカスタム暗号化キーです。設定すると、環境から導出されるデフォルトのキーの代わりにこのキーが使用されます。キーは実行時に vmBytecodeArrayEncodingKeyGetter を通じて提供される必要があります。
このオプションは暗号化キーを外部化します。キーは難読化されたコード自体に埋め込まれません。キーは実行時には依然としてアクセス可能である(したがって真に秘密ではない)ものの、この分離によって、静的解析ツールがコードだけを調べてキーを見つけることを防げます。
重要: キーは、難読化されたコードが読み込まれる際に同期的に利用可能である必要があります。Cookie、localStorage、sessionStorage、グローバル変数、DOM 要素(サーバーが注入する meta タグなど)といった同期ストレージを使用してください。fetch() のような非同期メソッドは、キーゲッターの式で直接使用することはできません。
vmBytecodeArrayEncodingKeyGetter
Type: string Default: ''
実行時に暗号化キーを返す、同期的な JavaScript の式です。この式は難読化されたコードが読み込まれる際に評価され、vmBytecodeArrayEncodingKey で提供されたのと同じキーを返す必要があります。キーを非同期的に(Promise として)解決するには、vmAsyncExecutor を有効にしてください。
注意: Promise を返すゲッターには vmAsyncExecutor が必要です。これはビルド時に確認できないため、vmAsyncExecutor がオフの状態で Promise ゲッターを使用すると実行時に失敗します。デコーダーがキーの代わりに Promise を受け取るためです。
難読化されたコードは、キーゲッターが難読化時に使用したものとまったく同じキーを返す場合にのみ動作します。 キーが一致しない場合、あるいはゲッターが undefined、null、空文字列を返す場合、復号は誤ったキーストリームを生成し、コードは実行時に無意味な出力または通常の実行時エラーで失敗します。キーに固有の専用エラーメッセージは意図的に用意されていないため、失敗したキーは他のあらゆる実行時障害と区別できません。
重要: キーは、難読化されたコードと同じファイル/スクリプトの外に置いてください。そこにインライン化すると、バンドルを純粋に静的にスキャンするだけでキーを復元できてしまいます。代わりに別のソースに格納してください: サーバーが設定する Cookie、別のスクリプトが投入する localStorage、サーバーが注入する HTML meta タグ、別のスクリプトが設定するグローバル変数、または(vmAsyncExecutor を使って)実行時にバックエンドから取得する方法です。
キーをバックエンドから(vmAsyncExecutor 経由で)取得する場合は、そのエンドポイントにセッションベースまたはオリジンベースのチェックを追加してください: 実際のユーザー(有効なセッション、想定される Origin/Referer)には正しいキーを返し、不審なリクエスト(localhost/想定外のオリジン、セッションなしなど)にはゴミのキーを返します。実際のユーザーは通常どおり実行され、環境外で動作するコピーは何も復号できないキーを受け取ります。厳密なロジックはサイトによって異なります。
例:
// 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())'
使用例:
// 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
非同期 VM エグゼキューターを有効にします。これにより、vmBytecodeArrayEncodingKeyGetter が Promise(非同期キーゲッター)を返せるようになります。その結果、復号キーをコード読み込み時に同期的に利用可能にする必要がなく、実行時に(ネットワークリクエスト、IndexedDB などから)取得できるようになります。
完全に非同期のコードベースには強く推奨されます。 このモードでは async 関数のみが仮想化されます。同期関数は、戻り値を Promise に変えて呼び出し側を壊さない限り非同期にできないためです。したがって、全体が async であるコードが最も高い保護範囲を得られます。ルートが同期の場合(同期 IIFE / UMD ラッパーなど)でも機能します: 内部の最も外側の async 関数が保護され、同期部分はそのまま残ります。
変換される対象: どこに現れるかを問わず(同期ラッパー内にネストされている場合も含めて)、最も外側の async 関数すべてです。各チェーンで最も外側の非同期関数が保護の単位となり、その内部にあるすべて(同期・非同期)がコンパイルされます。同期関数とプレーンなジェネレーターは難読化されずに残ります。
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
}
}
スキップと警告。 非同期キーゲッターが有効な場合、非同期ジェネレーターも難読化されずに残ります(非同期ジェネレーターはイテレーターを同期的に返す必要があり、キーを待つことができないためです)。デフォルトの vmTargetFunctionsMode: 'root' ではスキップは通知されません(選択は自動です)。comment モードでは、明示的にマークした関数を仮想化できないたびに(同期関数であることが判明した、または非同期キーゲッターの下での非同期ジェネレーターであった)、警告が出力されます。
非同期キーゲッターにはさらに、vmBytecodeArrayEncodingKeyGetter を伴う vmBytecodeArrayEncoding が必要です。
使用例:
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
バイトコード内のジャンプ先をエンコードします。ジャンプのオフセットは実行時に計算されるため、制御フロー構造(if/else、ループなど)を静的解析から隠します。
vmMacroOps
Type: boolean Default: false
よくある命令列を単一の「マクロ」オペコードにまとめます。たとえば LOAD_ARG + PUSH_CONST + SUB は MACRO_SUB_ARG_CONST になり、インタープリターのディスパッチを削減できます。これはデフォルトのスタック VM と vmRegisterBased: true の両方で機能します。どちらのモードでも vmMacroOps: true を明示的に有効にしてください。
vmDebugProtection
Type: boolean | object Default: false
VM ランタイムに多層的なアンチデバッグ・アンチ解析・アンチ LLM 防御を追加します。browser/browser-no-eval ターゲットで最も効果を発揮します。
有効にするには true、無効にするには false を渡します。特定の防御を無効にしつつ有効化するにはオブジェクトを渡します:
{
vmDebugProtection: {
// most defenses are always on; but CDP/devtools detection is disabled
inspectorDetection: false
}
}
⚠️ このオブジェクトは有効にする防御を選ぶメニューではありません。 Debug Protection が有効な場合、その防御の大半は常に有効で、無効にできません。以下のサブオプションは、一部の利用者が意図的に緩和する必要があるかもしれないごく少数の防御(たとえば誤検知が正当なワークフローを壊す場合)だけを公開します。それ以外のすべての防御は関係なく有効のままです。
💡 オブジェクト形式は API から利用できます
⚠️ 自動化フレームワーク。 inspectorDetection が有効な場合(デフォルト)、保護されたページを CDP ベースのツール(Puppeteer、Playwright、Selenium/ChromeDriver)で操作すると、接続されたインスペクターとして検知されます。保護されたコードに対して自動テストを実行する場合は、それらのビルドを vmDebugProtection: { inspectorDetection: false } で作成してください。
vmSelfDefending
Type: boolean Default: false
VM ランタイムに、多層的な改ざん検知、フック対策、リバースエンジニアリング対策の保護を追加します。
⚠️ このオプションは vmBytecodeArrayEncoding を強制的に有効にします。
⚠️ 機密な環境の検知。 このオプションは難読化されたコードを対象の実行環境に結び付け、高度なブラウザーフィンガープリンティングを用いて自動化ツールを検知します。このオプションで保護されたコードは、次の環境で実行されると意図的に動作しなくなります:
- ヘッドレスブラウザー(ヘッドレスの Chrome / Chromium、PhantomJS)
- ブラウザー自動化ツール(Puppeteer、Playwright、Cypress、Selenium/ChromeDriver、Nightmare)
- Node.js(
targetがbrowserに設定されている場合) - jsdom や同様のサーバー側 DOM エミュレーション
- ネイティブのブラウザー組み込みがフックまたは置き換えられている環境
このコードは、通常のブラウザー(Chrome、Firefox、Safari、Edge)では、iframe 内、ブラウザー拡張機能(コンテンツスクリプト)、Web Worker で読み込まれた場合を含めて、正しく動作します。保護されたコードに対して自動テストを実行する必要がある場合は、テストビルドでは vmSelfDefending を無効にしてください。このオプションは自動解析を防ぐために設計されており、いかなる自動化フレームワークとも安全に併用することはできません。
最大限の保護のために、vmDebugProtection、vmBytecodeArrayEncodingKey、vmBytecodeArrayEncodingKeyGetter と併用することを強くお勧めします。
vmDefenseHook
Type: { name: string, aliases?: object } | null Default: null
vmDefenseHook は null(無効)か、2 つのキーを持つオブジェクトです。name(必須)と aliases(省略可)。
name は、ホストページが定義するグローバル関数であり、VM の防御(vmDebugProtection / vmSelfDefending)が敵対的なシグナル(デバッガーやインスペクター、ヘッドレス/自動化ブラウザー、AI コーディングエージェントのプロセス、許可されていないドメインなど)を検知したときに、シグナルオブジェクトを引数として呼び出します。これを使って、イベントをバックエンドに報告できます(navigator.sendBeacon など)。このフックは純粋なテレメトリのシンクです: その戻り値は無視され、フックが存在しない場合やスローした場合も何もしない静かな no-op となり、防御を無効化することは決してありません。検知時に防御が何をするかを変更するには、vmDefenseReaction を使用してください。
aliases は、そのシグナルオブジェクトのフィールドを任意で改名します。後述のシグナルフィールドの改名で説明します。
シグナルオブジェクト。 フックは単一の signal を受け取ります:
source- 発火した具体的な検知機能です(表を参照)。category- それが報告するグループです:automation(人間ではないブラウザー)、debugger(デバッガー/インスペクターがアクティブ)、sandbox(計装された/偽のホスト)、domain(Domain Lock 違反)、tamper(実行時に組み込みがパッチされた)、integrity(VM 自身のコードが改変された)。score/threshold- 検知機能がどれだけ強く発火したか、および到達しなければならない値です。フックはscore >= thresholdになって初めて発火します。ほとんどのチェックはオール・オア・ナッシング(単一の決定的なシグナル)ですが、headlessは複数のブラウザー形状のシグナルを合算するため、そのscoreは通常thresholdより高くなります。
フックの登録。 難読化されたバンドルが読み込まれる前に、プレーンなグローバルとして定義してください。VM ランタイムとその防御は(保護された)あなたのプログラムよりも前に実行され、多くの検知が起動時に発火するためです:
// in your page, before the obfuscated script:
window.__vmDetection = function (signal) { navigator.sendBeacon('/vm-defense', JSON.stringify(signal)); };
// obfuscation option:
vmDefenseHook: { name: '__vmDetection' }
難読化されたソースの内部で定義されたフックは、起動時の検知を捕捉するには登録が遅すぎ、VM でコンパイルされた場合はあなたのプログラムが実行されるまで到達できません。いずれにせよ安全は保たれます(フックが存在しなければ no-op となり、再入ガードが暴走を防ぎます)が、完全なカバレッジのためには事前に登録してください。それでも報告ロジックを保護するには、登録するフックを 1 行のバッファ((window.__vmDet = window.__vmDet || []).push(signal))に留め、そのバッファを難読化されたコードから読み取って送信してください。
シグナルフィールドの改名(aliases)。 デフォルトの source/category の値は説明的な名前なので、コールバックを計装する(または出力を読む)者は誰でも、保護の存在とどの検知機能が発火したかを認識できてしまいます。aliases はシグナルフィールドを任意の不透明なトークンに改名します。これはシグナルが発行される前に VM 内部で適用されるため、それらの名前が出力に現れることも、コールバックに届くこともありません。あなたのアプリは自身のマッピングを把握しており、そのトークンをバックエンドに転送します。
エイリアスはフィールドごとに指定し、キーの改名と値の改名を分けて扱います: 各フィールドは key(コールバックが受け取るプロパティ名)を取ります。文字列の名前フィールドである source と category は values マップも取りますが、score/threshold は数値であり key のみを取ります。マッピングできる名前(それ以外はビルド時に拒否されます):
- フィールドキー -
source、category、score、threshold sourceの値 -headless、agent、agentBrowser、node、debugger、timing、sandbox、domain、nativeHook、integritycategoryの値 -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> }
}
これは秘匿ではなくフィンガープリントの回避です。マッピングは繰り返しテストすることで依然として推測できます。したがって、その唯一の利点は、安定した自明な名前を露出しないことにあります。設定されていないエントリはデフォルトの名前を保持します。
vmDefenseReaction
Type: object Default: { automation: 'break', debugger: 'decoy', sandbox: 'decoy', domain: 'break', tamper: 'break', integrity: 'break' }
各検知カテゴリーがどのように反応するかを設定します。これは何かを有効化するものではありません - 防御そのものは vmSelfDefending、vmDebugProtection、vmDomainLock によって有効化されます。このオプションは、有効化された防御がどのように反応するかを選択するだけです。カテゴリーが制御の単位であり、カテゴリー内のすべての検知機能がそのカテゴリーの反応を実行します。
各カテゴリーは、ある種類の敵対的な状態を監視する検知機能をグループ化します。カテゴリーは、その検知機能を発行するオプションが有効な場合にのみ反応します:
各カテゴリーは vmSelfDefending、vmDebugProtection、vmDomainLock の 1 つ以上に対応します。これら 3 つのオプションの外にカテゴリーは存在せず、オプションがオフのカテゴリーに設定された反応は単に効果を持ちません。
キーはこれら 6 つのカテゴリー名、または default(指定されなかったカテゴリーのフォールバック)です。値は次のとおりです:
break- 即座に中断しますdecoy- 汚染された状態で実行を続け、静かに誤った結果を生成しますnone- ローカルでは何もしません(テレメトリのみ)
カテゴリーごとのデフォルトは上に示したとおりです。設定しない(またはデフォルト値に設定した)カテゴリーは、そのデフォルトを使用します。default は、正しさが構造上保証されているカテゴリー(integrity、tamper)を含むすべてのカテゴリーに及ぶため、{ default: 'none' } は本当に何も中断しない、テレメトリのみのビルドになります:
vmDefenseReaction: { default: 'none' } // never break — pair with vmDefenseHook
vmDefenseReaction: { automation: 'none', domain: 'break' } // tolerate automation FPs, still break on a bad domain
browserEnvironment
Type: object Default: {}
本番ビルドが動作する環境に関する事実を宣言し、保護されたコードがそれらに自身を結び付けたり、反応したり、許容したりできるようにします。browser / browser-no-eval / service-worker ターゲットでのみ利用可能で、node、userscript、bytenode では拒否されます。各フィールドは、以下に示す特定の保護と組み合わせた場合に有効になります。
フィールド:
transport- 本番環境がバンドルを配信するスキーム('http'または'https')。'https'を指定すると、ビルドは自身の整合性を HTTPS で配信されることに結び付けます。そのため、解析者が持ち出して素の HTTP で配信したコピー(ローカルでのリバースエンジニアリングでよくある構成)は正しく動作しません。'http'またはフィールド未設定の場合、結び付けは追加されません。vmSelfDefendingと併用した場合に有効です。
browserEnvironment: { transport: 'https' }
hosting- 本番バンドルの配信元('remote'または'local')。'remote'を指定すると、ビルドは自身の整合性をリモートホストから配信されることに結び付けます。そのため、解析者が持ち出して自身のローカル環境で実行したコピーは実行環境の不一致として扱われ、自動化対策の防御が反応します(vmDebugProtectionとvmDefenseReactionを参照)。'local'またはフィールド未設定の場合、結び付けは追加されません。vmDebugProtectionと併用した場合に、browser/browser-no-evalでのみ有効です。
browserEnvironment: { transport: 'https', hosting: 'remote' }
hookedBuiltins- 本番ビルドが動作するランタイムが、ネイティブの組み込み関数を正当な理由で JavaScript のラッパーに置き換えている(アプリ自身の改ざん対策、ホストページ、同じ realm を共有する他のブラウザー拡張機能など)ことを宣言するにはtrueに設定します。通常、vmSelfDefendingは置き換えられたネイティブ組み込み関数を改ざんとみなしてビルドの実行を停止しますが、これを設定するとそのような環境を許容し、コードは動作します。falseまたは未設定のフィールドは厳格な動作を維持します。vmSelfDefendingと組み合わせた場合に有効になります。
browserEnvironment: { hookedBuiltins: true }
このオプションはネイティブ性チェックのみを緩和します。クリーンレルム検証と必須の組み込み関数の動作は引き続き強制されます。
⚠️ hookedBuiltins は改ざん検知を意図的に緩めます。設定すると、コードを調べるために同じ組み込み関数をラップする解析者も止められなくなります。VM の仮想化、デバッグ対策、整合性保護には影響しません。本番ランタイムが組み込み関数をフックすることが分かっていて、その弱い保証が許容できる場合にのみ有効にしてください。
⚠️ transport と hosting フィールドは、保護されたビルドを宣言した環境に結び付けます。同じビルドを一致しない環境で読み込むと - 最終的な環境に到達する前の一時的な状態であっても - 意図的に正しく動作しません。本番ビルドを読み込むすべてのコンテキストが一致する場合にのみフィールドを宣言し、ローカル開発・テスト・CI に使うビルドにはこれらの宣言を含めないでください。
vmStatefulOpcodes
Type: boolean Default: false
オペコードの意味をバイトコード内の位置に依存させます。各位置はシードから導出される異なるオペコードとハンドラーのマッピングを持つため、同じオペコード番号でも位置が異なれば異なる操作を実行します。
vmCallContextOpcodes
Type: boolean Default: false
保護された関数を、それがどこから呼び出されるかに依存させます。これにより、コードから切り出して単独で実行したり解析したりできなくなり、プログラム内の実際の呼び出し箇所を通じて呼び出された場合にのみ正しく動作します。このオプションは実行時のパフォーマンスに影響します。
現在サポートされているのは次の構文のみです:
- 関数宣言(
function f() {}); - 変数に代入された関数式およびアロー関数(
const f = () => {}); - インスタンスのプライベートメソッド(
this.#m())。
いずれの場合も、関数は常に直接呼び出し(f()、this.#m())を通じて到達する必要があります。別の変数に格納されたり、引数として渡されたり、その他の方法で値として使用されたりすると、保護されません。非同期関数はサポートされますが、ジェネレーターはサポートされません。
このオプションは実験的であり、コードを壊す可能性があるため、使用する前に出力を十分にテストしてください。
vmStackEncoding
Type: boolean Default: false
実行中に VM スタック上の値を暗号化します。値はプッシュ時にエンコードされ、ポップ時にデコードされるため、メモリを調査しても実際の値ではなく暗号化されたデータが表示されます。
このオプションはパフォーマンスに大きく影響します。
vmCompactDispatcher
Type: boolean Default: false
デュアルエグゼキューター(同期 + ジェネレーター)の代わりに単一の VM エグゼキューターを使用します。難読化されたコードのサイズを削減しますが、再帰の多いコードでは約 20% のパフォーマンスのオーバーヘッドが加わります。
false(デフォルト): デュアルエグゼキューター - 最適なパフォーマンス、より大きな出力true: 単一エグゼキューター - より小さな出力、わずかに遅い
vmRegisterBased
Type: boolean Default: false
VM をデフォルトのスタックベースのバイトコードからレジスタベースの実行モデルに切り替えます。これにより、場合によっては VM の実行時性能が約 15〜20% 向上しますが、難読化後のコードサイズはわずかに増加します。
構造の異なるバイトコードと実行エンジンを生成するため、デフォルトのスタックベースのものよりも VM に固有のフィンガープリントを与えます。VM の形を変え、汎用的な解析から認識されにくくしたい場合に使用してください。
内部的にはネイティブなレジスタベースのコンパイラーではありません。バイトコードを生成するのは従来どおりスタックベースのコンパイラーで、その後に別の変換ステージがレジスタベースの形式へ書き換えます。
このオプションは実験的です。vmRegisterBased を有効にした状態でコードが正しく動作することをテストしてください。
vmStringArrayBytecodeOnly
Type: boolean Default: false
有効にすると、文字列配列はバイトコードデータからのみ文字列を抽出し、コード内の他の文字列は変換されません。これは、明示的に設定されていなくても stringArray を強制的に有効にします。
使いどころ: すべての VM ランタイム文字列を文字列配列に抽出するのは低速です。このオプションは文字列配列への抽出をバイトコードの内容のみに限定し、バイトコード定数を保護しつつパフォーマンスを向上させます。
vmBytecodeArrayEncoding: falseの場合 - バイトコードの定数プール(c配列)内の文字列が抽出されますvmBytecodeArrayEncoding: trueの場合 - トップレベルの base64 エンコードされたバイトコード文字列が抽出されますstringArrayThresholdは、それらのバイトコード文字列のうちどの割合を抽出するかを引き続き制御します
vmDomainLock
Type: string[] Default: []
⚠️ このオプションは target: 'node'、target: 'service-worker'、target: 'bytenode' では機能しません
難読化されたコードを特定のドメインやサブドメインに限定します。domainLock よりも発見して取り除くことがはるかに困難です。
ソースコードがこのオプションで指定されたドメイン上で実行されていない場合、ブラウザーは vmDomainLockRedirectUrl に渡された URL にリダイレクトされ、リダイレクトが抑制された場合でも、以降の保護された呼び出しは不正な結果を返します。
複数のドメインとサブドメイン
コードを複数のドメインやサブドメインにロックすることも可能です。たとえば、コードが www.example.com でのみ実行されるようにロックするには、www.example.com を追加します。ルートドメインおよびすべてのサブドメイン(example.com、sub.example.com)で機能させるには、.example.com を使用します。
vmDomainLockRedirectUrl
Type: string Default: about:blank
⚠️ このオプションは target: 'node'、target: 'service-worker'、target: 'bytenode' では機能しません
ソースコードが vmDomainLock で指定されたドメイン上で実行されていない場合に、ブラウザーを指定した URL にリダイレクトできるようにします。
プリセットオプション
高難読化・低パフォーマンス
パフォーマンスは難読化なしの場合よりも大幅に低下します。
{
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
}
中難読化・最適なパフォーマンス
パフォーマンスは難読化なしの場合よりも低下します。
{
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
}
低難読化・高パフォーマンス
パフォーマンスは比較的通常のレベルに保たれます。
{
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
}
デフォルトプリセット・高パフォーマンス
{
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 超高難読化(最大限のセキュリティ)
このプリセットは、間接ディスパッチを含むすべての堅牢化機能を備えた VM ベースのバイトコード難読化を有効にします。最も強力な保護を提供しますが、出力サイズが大きくなり、実行速度が大幅に遅くなります。
{
optionsPreset: 'vm-ultra-high-obfuscation'
}
または個別に設定します:
{
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: null,
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 高難読化(最高のセキュリティ)
このプリセットは、ほとんどの堅牢化機能を備えた VM ベースのバイトコード難読化を有効にします。超高プリセットよりも優れたパフォーマンスで強力な保護を提供します。
{
optionsPreset: 'vm-high-obfuscation'
}
または個別に設定します:
{
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: null,
vmDefenseReaction: {
automation: 'break',
debugger: 'decoy',
sandbox: 'decoy',
domain: 'break',
tamper: 'break',
integrity: 'break'
},
vmStatefulOpcodes: true,
vmCallContextOpcodes: false,
vmStackEncoding: true,
vmCompactDispatcher: false
}
VM 中難読化(バランスの取れたセキュリティ)
このプリセットは、バランスの取れた堅牢化機能のセットを備えた VM ベースのバイトコード難読化を有効にします。セキュリティとパフォーマンスの適切な折り合いです。
{
optionsPreset: 'vm-medium-obfuscation'
}
または個別に設定します:
{
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: null,
vmDefenseReaction: {
automation: 'break',
debugger: 'decoy',
sandbox: 'decoy',
domain: 'break',
tamper: 'break',
integrity: 'break'
},
browserEnvironment: {},
vmStatefulOpcodes: false,
vmCallContextOpcodes: false,
vmStackEncoding: false,
vmCompactDispatcher: false
}
VM 低難読化(基本的なセキュリティ、より良いパフォーマンス)
このプリセットは、追加の堅牢化機能なしで基本的な VM ベースのバイトコード難読化を有効にします。セキュリティと出力サイズの適切なバランスです。
{
optionsPreset: 'vm-low-obfuscation'
}
または個別に設定します:
{
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: null,
vmDefenseReaction: {
automation: 'break',
debugger: 'decoy',
sandbox: 'decoy',
domain: 'break',
tamper: 'break',
integrity: 'break'
},
browserEnvironment: {},
vmStatefulOpcodes: false,
vmCallContextOpcodes: false,
vmStackEncoding: false,
vmCompactDispatcher: false
}
VM デフォルト(VM + 文字列配列保護)
このプリセットは、基本的な VM ベースのバイトコード難読化と文字列配列保護を組み合わせます。文字列保護を伴う VM 難読化の良い出発点です。
{
optionsPreset: 'vm-default'
}
または個別に設定します:
{
compact: true,
simplify: true,
identifierNamesGenerator: 'mangled-shuffled',
vmObfuscation: true,
vmForceCompileDynamicCode: false,
vmWrapTopLevelInitializers: true,
vmDynamicOpcodes: true,
vmBytecodeEncoding: true,
vmBytecodeArrayEncoding: true,
vmStringArrayBytecodeOnly: true,
vmAsyncExecutor: false,
vmJumpsEncoding: true,
vmMacroOps: true,
vmDebugProtection: {
inspectorDetection: true
},
vmSelfDefending: true,
vmDefenseHook: null,
vmDefenseReaction: {
automation: 'break',
debugger: 'decoy',
sandbox: 'decoy',
domain: 'break',
tamper: 'break',
integrity: 'break'
},
browserEnvironment: {},
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
}
