常见的 JavaScript 混淆及应对
AAEncode
示例
AAEncode 是一种将 JavaScript 转化为常用颜文字网络表情组合的混淆方式,如下图:
方案一
打开控制台,将代码粘贴其中,执行让其报错(如果没报错请放弃这个方案😂),根据报错信息进入 VM 中,就能看到源码(不过,我遇到的用这个方法从来没有成功过😭)
方案二
打开控制台,点击源代码,找到代码块,点击新增代码块,将 JS 代码粘贴进去,在代码最顶部添加一个 debugger,执行代码进行调试,一步步调试,直到达到想要的效果
方案三
打开控制台,将代码粘贴其中,去掉最后一个 (‘_’) 表情,直接执行得到结果或者在后面添加 toString 让其转化为字符串
JJEncode
示例
JJEncode 是一种将 JavaScript 转化为仅由符号组合的混淆方式,如下图:
方案一
打开控制台,将代码粘贴其中,执行让其报错,根据报错信息进入 VM 中,就能看到源码(这个方法同样从来没有成功过😭)
方案二
打开控制台,点击源代码,找到代码块,点击新增代码块,将 JS 代码粘贴进去,在代码最顶部添加一个 debugger,执行代码进行调试,一步步调试,直到达到想要的效果
方案三
打开控制台,将代码粘贴其中,去掉最后一个 () ,直接执行得到结果或者在后面添加 toString 让其转化为字符串
JSFuck
示例
JSFuck 是一种由 [、 ]、(、)、!、+ 六种字符组合而成的混淆方式,如下图:(仅截取部分)
方案一
打开控制台,将代码粘贴其中执行,如果可以执行可能会得到解混淆后的代码,如猿人学内部练习题JSFuck那道;否则出现错误则该方案没戏了
方案二
打开控制台,点击源代码,找到代码块,点击新增代码块,将 JS 代码粘贴进去,在代码最顶部添加一个 debugger,执行代码进行调试,一步步调试,直到达到想要的效果
方案三
打开控制台,将代码粘贴其中,去掉最后一个 () 及其中的代码,直接执行得到结果或者在后面添加 toString 让其转化为字符串
eval
eval 混淆的话,简单的一眼就能看出来,复杂的话多看几眼也看不出来
简单的
直接用 eval 包裹函数字符串或者是经过 base64 编码的函数字符串,可以直接抠出来用或者解码之后使用。在某些混淆方案中,还会生成 debugger 字符串,再由 eval 执行。
复杂的
以 function(p, a, c, k, e, d) 或者是 Function(p, a, c, k, e, d)开头,如下图:
解决方案很简单,只需要将 eval 替换为 console.log 或者 alert 执行即可
Obfuscator
Obfuscator 一般简称 ob,是通过一系列转换,例如变量、函数、参数重命名,字符串删除,标识符混淆,死代码注入,防调试注入等,将被转换为不可读的内容达到保护代码的目的,同时运行方式与以前完全相同,可以说混淆程度相当严重了。
混淆特征
- 大数组
- 数组移位(自执行函数,进行移位操作,有明显的 push、shift 关键字,建议不格式化)
- 解密函数(可能有定时器,建议不格式化)
- 逻辑代码 (控制流平坦化、 无限debugger自执行函数、死代码注入)
官网案例
混淆前
混淆后
解决流程
- 熟悉通用混淆代码
- 找到代码入口、扣取代码主体
- 完善缺失逻辑、补环境等
相关网站:
在线开发加密解密验证工具-ME2在线工具
SOJSON在线-JS解密 | JS加密 | JS 美化 | JS格式化 | JS混淆
加密解密 - 加密解密工具
JSFuck-官网
JavaScript Obfuscator Tool