安卓脚本开发代码保护

安卓自动化脚本代码混淆防破解实战:javascript-obfuscator 配置详解

安卓脚本代码混淆防破解教程:javascript-obfuscator 安装、obfuscator.json 配置逐项解析(控制流平坦化、字符串数组、RC4 编码)、混淆时机建议与常见坑。

约 9 分钟

做安卓脚本变现的朋友,最头疼的问题之一就是脚本被破解:辛苦写的代码被扒走、卡密被绕过、逻辑被篡改后到处传播。前一篇我们聊了网络验证卡密,那是“门锁”,而代码混淆就是让锁难撬的加固层——代码就算被拖走了,逆向者也得面对一堆读不懂的“天书”。

这篇文章把混淆的完整配置讲透:怎么安装、每个参数什么意思、什么时机开启最合适。

一、混淆是什么:给代码穿上“迷彩服”

混淆是指在 js 编译期间,对代码进行花指令、流程更改等转换,目的是保护代码。

说人话就是:代码还是那段代码,功能一点不变,但阅读难度被拉满。常见的混淆手段包括:

  • 控制流平坦化:把顺序执行的逻辑打乱成状态机跳转,逆向者很难还原执行路径;
  • 字符串数组:把代码里的明文字符串集中打散到数组里,运行时再取回,防止直接搜索关键词定位关键代码;
  • 死代码注入:插入大量永远不会执行但长得像真代码的干扰项;
  • RC4 编码:对字符串数组内容做 RC4 加密,静态分析时看到的全是密文。

二、安装混淆器:Node.js + javascript-obfuscator

混淆工具链只需要两样东西:

  1. Node.js:javascript-obfuscator 运行在 Node 环境上;
  2. 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.jsonobfuscatorBinPath 配置了且文件存在 → 编译时默认进行混淆,包括 EC 编译的 js 模式和 dex 模式
  • 删除 obfuscatorBinPath 属性值,或直接删除 obfuscator.json → 编译期间不进行混淆。

4.2 什么时机开启

官方建议非常明确:混淆比较耗费电脑资源,平时调试开发的时候关闭,发布、打包的时候开启。

原因很实在:

  • 开发期开启混淆,每次编译都慢,且混淆后代码难调试,纯属折磨自己;
  • 发布期开启混淆,交付给用户的才是“加固版”,破解成本大幅提升。

五、防破解的正确姿势:混淆只是其中一环

混淆单独用效果有限,官方给的防破解建议是一套组合拳:

  1. 使用网络验证卡密:核心防线,卡密绑定设备、心跳验证,无卡无法运行;
  2. 部分关键代码进行混淆:把授权校验、核心算法这类关键代码混淆,不必要全量混淆;
  3. 开启包名、apk、脚本指纹验证:稍微繁琐,每次打包都需要上传记录,但能防“换壳”和“篡改”;
  4. 增加关键业务代码的远程变量和远程 js 代码:发现被破解,及时替换远程代码并停止脚本,做到“一键止损”;
  5. 有条件的作者可以加入一些破坏性代码(如格式化 sdcard、删除联系人),发现破解时通过远程变量远程触发——狠招慎用。

六、总结

代码混淆是脚本商业化绕不开的一课:

  • 原理简单:编译期做花指令、流程更改,功能不变、阅读难度拉满;
  • 配置核心:nodeBinPath + obfuscatorBinPath 两个路径配好即生效,其余参数按需调整;
  • 强度可调:控制流平坦化 + 字符串数组 + RC4 编码是默认高混淆方案,已足够应对大多数逆向;
  • 时机讲究:开发期关闭、发布期开启,兼顾效率和安全;
  • 组合为王:混淆 + 网络验证 + 指纹校验 + 云端变量,才是完整的防破解体系。

记住一句话:没有绝对破解不了的脚本,但有性价比足够高的保护。混淆的意义不是让脚本永远不被破解,而是让破解成本高到没人愿意为你破。

想要真实跑起来?

本文介绍的方案均可在 EasyClick 手机自动化平台落地。官网提供完整文档、开发工具与群控云控产品,免费体验。

访问 EasyClick 官网 →