常见的 JavaScript 混淆及应对

Each day brings a new beginning.——《双峰》

每天都是一个新的开始。

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