compact
去除代码中的换行符,将代码压缩成一行。
simplify
通过简化代码增强混淆效果。
// 原始代码
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;
}
// 精简后
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;
unicodeEscapeSequence
用于将字符串中的字符转换为Unicode转义形式(如 "a"
→ "\u0061"
),使代码中的字符串失去可读性的同时保持功能不变,无性能损耗,但会增加加密后的代码长度。
// 原始代码
const str = "hello";
// 启用后
const str = "\u0068\u0065\u006c\u006c\u006f"; // "hello"
numbersToExpressions
将代码中的数字字面量(如 42)转换为等效的复杂表达式(如 (40 + 2) 或 (6 * 7)),增加逆向分析时理解数值含义的难度。
// 输入
const foo = 1234;
// 转换后
const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;
selfDefending
该参数会为混淆后的代码注入自校验逻辑,当检测到代码被格式化、调试或非法修改时,自动触发异常或死循环,使代码无法正常运行,从而阻止逆向工程分析。
⚠开启此选项后,不要对加密后的代码做改动,任何对加密后代码的改动都会触发防御机制,使代码无法正常运行!
disableConsoleOutput
通过把 console.log
, console.info
, console.error
, console.warn
, console.debug
, console.exception
以及 console.trace
函数重写为空值,实现禁用控制台调试输出,加大解密调试难度。
controlFlowFlattening
该参数通过将代码中的逻辑分支(如 if/else
、switch
)拆解为扁平化的状态机结构,打乱原有执行流程的线性可读性,使逆向分析者难以直接理解程序的实际逻辑路径。
可能轻微增加运行时开销(取决于代码复杂度)。
// 原始逻辑
if (a) { func1(); } else { func2(); }
// 扁平化后(伪代码)
switch (_0xstate) {
case 0: if (a) _0xstate = 1; else _0xstate = 2; break;
case 1: func1(); break;
case 2: func2(); break;
}
controlFlowFlatteningThreshold
设定触发控制流平坦化的最小概率阈值(范围:0
到 1
),例如:设置为 0.75
时 75% 的代码块会被平坦化。
注:阈值设置为 0 时,相当于关闭控制流平坦化。
deadCodeInjection
启用后会在代码中随机插入无效但语法正确的逻辑片段(如永不执行的条件分支、无意义的运算),干扰逆向分析者对核心代码的定位,同时不改变程序原有功能。因为死代码实际不会被执行,因此无运行时性能损耗。
// 原始代码
function add(a, b) { return a + b; }
// 注入死代码后
function add(a, b) {
if (false) { console.log("干扰内容"); }
return a + b;
}
debugProtection
启用后会注入反调试代码,当检测到开发者工具(如 Chrome DevTools
)被打开时,强制触发无限循环、崩溃或阻塞脚本执行,从而阻止通过调试工具动态分析代码逻辑。
debugProtectionInterval
用于设定反调试检测的轮询频率(单位:毫秒),控制防F12调试保护功能检查开发者工具是否打开的间隔时间。
间隔越短,防护越灵敏,但可能增加性能开销;反之则降低检测强度。
domainLock
用于将混淆后的代码绑定到指定域名,当检测到运行环境与预设域名不匹配时,代码会自动失效或触发异常,防止代码被非法盗用或跨域执行。
核心特性:
example.com
)下正常运行,否则抛出错误。 注意:需谨慎设置,避免因域名变更导致自身业务异常。该选项在 node 环境中无效。
要使其在包括任何子域(example.com
,sub.example.com
)在内的根域上工作,请使用 .example.com
。
domainLockRedirectUrl
该参数用于配合域名锁定,当代码在非法域名下运行时,可以强制跳转到指定URL(如错误页面或授权页)。
identifierNamesGenerator
用于控制混淆后代码中变量名、函数名等标识符的生成规则,通过替换原始名称(如 userToken
)为无意义的随机字符串(如 _0x1a2b
),大幅降低代码可读性。
可选值及效果:
十六进制标识符
(默认):生成十六进制短标识符(如 _0xabc123
)。短标识符
:生成极短的无意义字符(如 a
、b
),最小化代码体积。短标识符(打乱顺序)
:同短标识符,只是顺序会被打乱。标识符字典
:使用标识符字典里设置的标识符。// 原始代码
function getUserData() { ... }
// 混淆后(十六进制标识符 模式)
function _0x12d4f() { ... }
identifiersDictionary
设置哦标识符加密的预设词库。仅标识符加密方式选择“标识符字典”时有效。
identifiersPrefix
用于为混淆后的变量名、函数名等标识符统一添加自定义前缀,使混淆后的代码风格更统一,同时在需要加密多份 js 时,可以为每个 js 指定不同的前缀,避免生成的标识符冲突。
例如设为 toolwa_
时,所有标识符会变为 toolwa_a
、toolwa_b
等形式。
reservedNames
加入白名单后,白名单内的标识符和属性名不会进行混淆,支持正则表达式,如:
^someVariable
functionParameter_\d
target
设置加密后的代码在哪里运行,根据运行环境,加密方式会有针对性的改动。
seed
此选项为随机生成器设置种子。用于生成可重复的加密结果。设置为 0 则使用随机的随机种子。
ignoreImports
防止混淆 Imports。在某些情况下,当运行时环境出于某种原因只需要使用静态字符串进行这些导入时,可以开启该选项。
renameGlobals
设置是否混淆代码中的全局变量和函数名。默认跳过浏览器内置 API(如 document、fetch)以避免运行时错误。
transformObjectKeys
用于深度混淆对象的键名(如将 { key: value }
转换为 { _0x1a2b: value }
),适用于 JSON 数据、配置对象或类实例属性,防止通过键名直接推断数据结构含义。
// 原始代码
const config = { apiUrl: "https://toolwa.com", auth: { token: "xyz" } };
// 混淆后
const config = { _0x12ab: "https://toolwa.com", _0x34cd: { _0x56ef: "xyz" } };
注意:
obj[key]
),需通过 reservedNames
保留这些键,否则可能导致功能异常。 renameProperties
⚠️启用该选项可能导致代码无法正常运行!一般不建议启用。
重命名属性名称。但所有内置 DOM 属性和核心 JavaScript 类中的属性会被忽略。
// 原始代码
(function () {
const foo = {
prop1: 1,
prop2: 2,
calc: function () {
return this.prop1 + this.prop2;
}
};
console.log(foo.calc());
})();
// 混淆后
(function () {
const _0x46529b = {
'_0x10cec7': 0x1,
'_0xc1c0ca': 0x2,
'_0x4b961d': function () {
return this['_0x10cec7'] + this['_0xc1c0ca'];
}
};
console['log'](_0x46529b['_0x4b961d']());
}());
renamePropertiesMode
splitStrings
用于将代码中的长字符串拆分为多个片段,再通过拼接方式(如数组索引或运算)动态还原,干扰字符串的静态分析,同时避免直接暴露完整敏感信息(如密钥、URL)。
// 原始代码
const apiUrl = "https://api.toolwa.com/v1";
// 混淆后
const _0x12ab = ["ht", "tps:/", "/api.", "toolwa", ".com/", "v1"];
const apiUrl = _0x12ab.join("");
splitStringsChunkLength
设置字符串被分割后,每一部分的长度,长度越小,字符串被分割得越碎,但会增加代码体积。
stringArray
去除代码中固定的字符串文本,并将其统一放在一个数组中。例如 var m = "Hello World";
中的 "Hello World",将会被替换为一个函数调用,在运行时再获取到值。例如:var m = _0xb0c3('0x1');
stringArrayThreshold
调整将字符串文字插入到字符串数组中的概率(从0到1)。
设置为 0 时等同于关闭字符串转数组。
stringArrayEncoding
该选项会降低脚本运行速度。
支持使用 base64 或 rc4 对字符串数组中的所有字符串字面进行编码,并插入一个特殊代码,用于在运行时解码。
每个字符串数组值都将使用从传递的列表中随机挑选的编码进行编码。这样就可以使用多种编码。
无
:不对字符串数组进行编码Base64
:使用 Base64 编码字符串数组值RC4
:使用 RC4 对字符串数组值进行编码。速度比 Base64 慢 30-50%,但难以获得初始值。建议在使用 RC4 编码时禁用 unicodeEscapeSequence 选项,以防止混淆代码体积过大。 例如,同时勾选 无、Base64、RC4 时,部分字符串数组将不会被编码,而部分将使用 Base64 和 RC4 编码。stringArrayIndexesType
stringArrayCallsTransform
将字符串数组加密的取值函数转换为更复杂的形式,可干扰自动化反混淆工具的字符串提取逻辑,延长逆向工程时间。
stringArrayCallsTransformThreshold
调整 字符串调用转换 功能的阈值。
stringArrayIndexShift
// 混淆后(假设偏移量=0x42)
const str = _0x1234(0x0 + 0x42); // 实际访问 _0x1234[0x42] = 'Hello'
stringArrayRotate
启用后,混淆器会对字符串数组(stringArray)中的元素顺序进行随机轮转(即整体位移),使得原始索引与字符串的对应关系被破坏,进一步增加静态分析的难度,对运行时性能无影响。
// 原始数组
['A', 'B', 'C', 'D'] → 轮转后可能变为 ['C', 'D', 'A', 'B']
stringArrayShuffle
启用后,混淆器会对字符串数组(stringArray)中的元素顺序进行完全随机打乱(类似洗牌),彻底破坏原始索引与字符串的对应关系,大幅增加逆向分析的难度。
// 原始数组
['API_KEY', 'SECRET', 'PASSWORD'] → 可能被乱序为 ['PASSWORD', 'API_KEY', 'SECRET']
stringArrayWrappersChainedCalls
启用后,混淆器会将字符串数组(stringArray
)的访问逻辑拆分为多级链式函数调用,通过嵌套的包装函数层层解密,使得直接追踪真实字符串的引用路径变得极其困难。
如 array[0]
可能被转换为 _0xfunc1(_0xfunc2(_0xfunc3(0x0)))
,形成调用链,干扰调试器的单步跟踪,增加静态还原成本。
注意:过度使用可能导致代码膨胀,建议在关键敏感字符串处启用。
stringArrayWrappersCount
用于控制字符串数组(stringArray
)的动态解密函数的生成数量。数值越大,混淆器会生成越多的冗余包装函数来分散对真实字符串访问逻辑的追踪,从而增强对抗逆向分析的能力。
示例(假设 stringArrayWrappersCount: 2
):
// 原始访问
array[0] → 可能被转换为 _0xwrapper2(_0xwrapper1(0x0))
注意:过度增加此值可能导致代码冗余,建议根据安全需求平衡(一般不超过 3
)。
stringArrayWrappersType
用于定义字符串数组包装函数的生成方式。该选项对运行时性能无影响,可根据混淆需求选择。
示例:
// '函数形式
function _0x1234(x) { return array[x]; }
// 变量形式
const _0x1234 = function(x) { return array[x]; };
stringArrayWrappersParametersMaxCount
控制字符串数组包装函数的参数数量上限。通过不同参数数量的包装函数(如 _0xfunc(a)
、_0xfunc(a,b)
等),进一步干扰逆向分析中对函数调用模式的规律性识别。
示例:
// 可能生成的包装函数形式
_0xfunc1(0x0); // 无额外参数
_0xfunc2(0x0, true); // 带额外干扰参数
forceTransformStrings
设置需要强制转换成数组形式的字符串,可以将关键性的字符串加入强制转换,避免因为转换阈值的原因漏掉关键部分。
支持正则表达式。
reservedStrings
加入到白名单中的字符串不会被转换成数组形式。
支持正则表达式。
本工具对原始 JavaScript 代码的规范性要求极高。建议采用闭包的写法,同时该加分号的地方加分号,该加大括号的地方加大括号。
如果确保代码写得没问题,加密后仍有报错,请检查安全域名及变量混淆相关配置是否正确。
这个工具只能用来混淆代码,使得代码变得不可读以及难以被还原。简而言之是只能防住大部分的小白,真正的大神还是能对代码进行逆向破解的。
因为 JavaScript 需要在浏览器前端读取运行,因此也不可能有 100% 无法被破解的 JavaScript 加密。(如果有,也是骗人的……
因为加密后的代码中插入了很多额外的代码,用来起到保护作用。
千万别这么做。多个加密工具配合使用只会起反作用,同时还可能破坏代码的原始结构,导致代码无法正常运行。
绝对不会!本工具全程在本地进行加密。如果仍觉得不放心,可以在工具载入完成后,断掉网再进行加密。
找不回了。代码一旦加密,神仙也无法恢复出原始代码。因此请保存好原始代码。
可以。