混淆思路主要采用了两种方式,第一种是用数组下标代替步骤流程,第二种是利用数组下标代替字符串
- 在第二行的e数组控制整块代码for switch case
- 第三行的c数组控制整块代码的字符串,用n(1)、n(2)代替
- 对着第二行的e用"Find Usages",发现在各个for switch case里都引用了进行迭代,控制着循环流程
- 其中在循环过程中,通过i或者t数组将需要调用的函数存进去,不断的pop、push来增加无用的干扰代码,最后用Function.prototype.call调用关键步骤
这里有顺序要求,因为当自执行的函数的实参也是一个自执行的函数的时候,一旦解开,两个函数之间存在的同一命名的变量定义域就会增大,重合混淆在一起
- 先将逗号表达式解开成以分号结尾的完整表达式
- 在解开自执行的函数之前,先对变量改个独一无二的命名
- 还原自执行的函数的实参
- 还原没有实参的自执行函数
- 还原定义的字面量
- 合并定义在object对象外面的key、value
- 全局函数计算值替换
- 三目运算符拆分为if语句
- a[length]转换为a.length
- 函数调用出自动替换计算值(关键,解决混淆2的重点一步)
- 最后才是去控制流
- 再删除一些无用代码
- 删除未被调用的变量
- 删除未被使用的变量
- 删除未被使用的函数参数
- 删除多余的空行和空语句