做安卓脚本变现的朋友,最头疼的问题之一就是脚本被破解:辛苦写的代码被扒走、卡密被绕过、逻辑被篡改后到处传播。前一篇我们聊了网络验证卡密,那是“门锁”,而代码混淆就是让锁难撬的加固层——代码就算被拖走了,逆向者也得面对一堆读不懂的“天书”。
这篇文章把混淆的完整配置讲透:怎么安装、每个参数什么意思、什么时机开启最合适。
一、混淆是什么:给代码穿上“迷彩服”
混淆是指在 js 编译期间,对代码进行花指令、流程更改等转换,目的是保护代码。
说人话就是:代码还是那段代码,功能一点不变,但阅读难度被拉满。常见的混淆手段包括:
- 控制流平坦化:把顺序执行的逻辑打乱成状态机跳转,逆向者很难还原执行路径;
- 字符串数组:把代码里的明文字符串集中打散到数组里,运行时再取回,防止直接搜索关键词定位关键代码;
- 死代码注入:插入大量永远不会执行但长得像真代码的干扰项;
- RC4 编码:对字符串数组内容做 RC4 加密,静态分析时看到的全是密文。
二、安装混淆器:Node.js + javascript-obfuscator
混淆工具链只需要两样东西:
- Node.js:javascript-obfuscator 运行在 Node 环境上;
- javascript-obfuscator:npm 全局安装的混淆库。
在 cmd 或 powershell 中执行:
npm install -g javascript-obfuscator
npm install -g class-validator
装完后,用 npm root -g 查看全局安装路径,后面配置会用到。
三、核心配置:obfuscator.json 逐项解析
EC 的 IDEA 开发工具升级到 9.4.0 后,会在工程模块下自动创建一个 obfuscator.json 文件。默认不开启混淆,正确设置 json 配置中的 binPath(即 obfuscatorBinPath)路径后才能工作。
官方默认配置(测试过可运行):
{
"nodeBinPath": "D:\\programe\\nodejs\\node.exe",
"obfuscatorBinPath": "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_modules\\javascript-obfuscator\\bin\\javascript-obfuscator",
"target": "node",
"compact": false,
"log": true,
"optionsPreset": "high-obfuscation",
"deadCodeInjection": false,
"simplify": false,
"seed": 10,
"controlFlowFlattening": true,
"controlFlowFlatteningThreshold": 1,
"unicodeEscapeSequence": false,
"stringArray": true,
"stringArrayRotate": false,
"stringArrayShuffle": false,
"stringArrayThreshold": 1,
"stringArrayWrappersCount": 5,
"stringArrayEncoding": ["rc4"],
"stringArrayCallsTransform": false,
"selfDefending": false,
"splitStrings": false,
"splitStringsChunkLength": 1
}
注意:配置里的
//注释是方便解释用的,使用时记得删掉,不然会报错。
3.1 路径配置(必须)
| 属性 | 作用 |
|---|---|
nodeBinPath |
node.exe 的路径 |
obfuscatorBinPath |
javascript-obfuscator 可执行文件的路径 |
安装 Node.js 后,全局安装路径一般是 C:\Users\<用户名>\AppData\Roaming\npm\node_modules,在 node_modules 里找到 javascript-obfuscator 的全路径复制过来即可。
3.2 混淆强度(重点)
| 属性 | 默认值 | 作用 |
|---|---|---|
optionsPreset |
high-obfuscation |
混淆程度预设 |
controlFlowFlattening |
true |
控制流平坦化,打乱执行顺序 |
controlFlowFlatteningThreshold |
1 |
平坦化比例,1 = 全部代码 |
deadCodeInjection |
false |
死代码注入,可开可关 |
simplify |
false |
代码简化(和混淆相反的方向,保持 false) |
3.3 字符串保护(重点)
| 属性 | 默认值 | 作用 |
|---|---|---|
stringArray |
true |
把字符串提取到数组中 |
stringArrayEncoding |
["rc4"] |
字符串数组编码方式,RC4 加密后静态分析只见密文 |
stringArrayThreshold |
1 |
字符串进数组的比例,1 = 全部 |
stringArrayWrappersCount |
5 |
包装函数数量,越多越难还原 |
stringArrayRotate / stringArrayShuffle |
false |
是否轮转/洗牌数组 |
3.4 其他控制项
| 属性 | 默认值 | 作用 |
|---|---|---|
compact |
false |
是否压缩代码 |
log |
true |
编译期间展示混淆详细信息,便于确认混淆生效 |
seed |
10 |
随机种子,固定种子保证每次混淆结果可复现 |
unicodeEscapeSequence |
false |
是否转义为 unicode |
selfDefending |
false |
自防御:被格式化就失效(需谨慎开启,易误伤) |
splitStrings |
false |
拆分长字符串 |
四、混淆的触发与时机:开发关闭,发布开启
4.1 怎么触发混淆
obfuscator.json中obfuscatorBinPath配置了且文件存在 → 编译时默认进行混淆,包括 EC 编译的 js 模式和 dex 模式;- 删除
obfuscatorBinPath属性值,或直接删除 obfuscator.json → 编译期间不进行混淆。
4.2 什么时机开启
官方建议非常明确:混淆比较耗费电脑资源,平时调试开发的时候关闭,发布、打包的时候开启。
原因很实在:
- 开发期开启混淆,每次编译都慢,且混淆后代码难调试,纯属折磨自己;
- 发布期开启混淆,交付给用户的才是“加固版”,破解成本大幅提升。
五、防破解的正确姿势:混淆只是其中一环
混淆单独用效果有限,官方给的防破解建议是一套组合拳:
- 使用网络验证卡密:核心防线,卡密绑定设备、心跳验证,无卡无法运行;
- 部分关键代码进行混淆:把授权校验、核心算法这类关键代码混淆,不必要全量混淆;
- 开启包名、apk、脚本指纹验证:稍微繁琐,每次打包都需要上传记录,但能防“换壳”和“篡改”;
- 增加关键业务代码的远程变量和远程 js 代码:发现被破解,及时替换远程代码并停止脚本,做到“一键止损”;
- 有条件的作者可以加入一些破坏性代码(如格式化 sdcard、删除联系人),发现破解时通过远程变量远程触发——狠招慎用。
六、总结
代码混淆是脚本商业化绕不开的一课:
- 原理简单:编译期做花指令、流程更改,功能不变、阅读难度拉满;
- 配置核心:nodeBinPath + obfuscatorBinPath 两个路径配好即生效,其余参数按需调整;
- 强度可调:控制流平坦化 + 字符串数组 + RC4 编码是默认高混淆方案,已足够应对大多数逆向;
- 时机讲究:开发期关闭、发布期开启,兼顾效率和安全;
- 组合为王:混淆 + 网络验证 + 指纹校验 + 云端变量,才是完整的防破解体系。
记住一句话:没有绝对破解不了的脚本,但有性价比足够高的保护。混淆的意义不是让脚本永远不被破解,而是让破解成本高到没人愿意为你破。
想要真实跑起来?
本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。