逆向爬虫27 sojson反调加密
目标:
- 掌握sojson的加密的特点和原理。
- 使用静态文件替换sojson反调。
一. sojson加密特点和原理
sojson是一种常用的js反调和加密手段, 在学习如何处理它之前, 我们需要先了解它的特点和原理。
sojson是一种可以使代码自我保护的反调加密手段, 它可以为js代码添加加密混淆
, 压缩成一行
, 防止格式化
, 死代码注入
等属性。下面一一解释下这四种反调手段。
**加密混淆:**将代码中的所有标识符 (变量名, 函数名) 替换成没有意义的以下划线开始的十六进制数字,如 _0x43a11d, _0x24372d 等。
**压缩成一行:**顾名思义, 将原本多行的代码都写到一行。
**防止格式化:**如果调试者希望借助 IDE 对代码进行格式化, 代码将无法正常运行, 陷入卡死状态。
**死代码注入:**如果调试这对代码进行了格式化, 陷入的卡死状态就是注入的死代码导致的。
以上就是sojson加密的特点, 如果您是第一次接触sojson, 我相信您一定对 防止格式化
特点比较好奇, 为何代码格式化后, 就会陷入卡死状态, 请看下面这个例子
function a() {
console.log('hello world');
}
if (a.toString().indexOf('\n')) { // 代码中存在换行
console.log('你格式化我了。')
while (true) {
console.log('等着卡死吧!!!')
}
} else { // 代码中不存在换行
console.log('有本事就格式我。')
}
a.toString() 可以将 a 函数转化成字符串, 然后调用 indexOf(‘\n’) 检查字符串中是否有换行, 如果存在换行, 代码就会执行到 while (true) 死循环中。
sojson就是利用这个原理, 来防止代码格式化的, 就像上面这个例子, sojson也只会选择部分代码进行换行检测, 只不过它的检测是 正则表达式
, 因此解决sojson的一种方法就是找到检测的部分, 并将它们压缩成一行, 即可。
此外, 代码中的 if else
都有可能是在判断是否格式化, 并将代码引入死代码逻辑, 因此我们也可以在 if else
的地方打下断点, 动态修改 if 后面 布尔表达式
的真假直, 以达到动态调试的目的, 动态调试一般用来针对特别变态的网站。
综上所述,我们只需要特别关注sojson代码中的 toString()函数
, 正则表达式(RegExp)
, if后的布尔表达式
等关键词。
二. 获取sojson代码
在过sojson之前, 我们得先有一份sojson代码, 怎么获取sojson代码呢?可以通过下面网站, 来对正常的js代码进行加密混淆。
JS加密,JS混淆,JS混淆加密,JS不可逆加密,JS加密压缩
后面练习的代码由以下代码加密生成的
(function(w, d) {
w.info = "这是一个一系列js操作。";
d.warning = "如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容";
d.intro = "本工具由 www.jsjiami.com 提供接口。";
})(window, document);
加密配置选项如图所示
生成的代码如图所示
三. 静态文件替换过sojson
把加密后的代码复制进 IDE 中, 不要犹豫, 直接用你 IDE 的自动格式化功能, 将代码格式化了再说, 否则根本不可能把这样的代码读明白的。当然你也可以在代码最前面加上 debugger 语句, 并扔进浏览器执行, 利用浏览器的格式化攻来来美化代码, 如果不加 debugger 语句, 浏览器会直接进入到sojson的死代码逻辑中。
效果如下图
再将浏览器格式化好后的代码, 复制进 IDE 中进行修改。后面就是在 IDE 中修改代码, 复制进浏览器中运行, 观察修改后的运行效果,不断地重复这两个步骤。
下面我只记录的 sojson “解题” 思路和步骤, 关于具体如何阅读这满屏混淆的代码, 还需读者自行练习。
思路:
- 找到代码中所有的正则表达式, 在正则表达式后面加上 debugger; 语句。
- 放到浏览器中调试运行, 代码会在你加上的 debugger; 语句处暂停。
- 观察正则表达式所测试的代码块, 一般可以看到 toString() 函数, 被 toString() 的函数就是sojson检测的代码块。
- 将正则表达式检测的代码块都压缩到一行。
代码中一共有9个正则表达式, 在它们下面分别加上 debugger; 语句, 如果有2个正则表达式连在一起, 只需要在第二个下面添加就行, 最终一共添加了6个 debugger; 复制进浏览器, 开始调试。
下图是运行到的第一个正则表达式的位置
您可以根据上图中的 1~8 记号来阅读代码, 它完全符合第一节中所展示代码的所有特点, 因此我们只需要将代码 32~34 行 removeCookie 函数压缩成一行即可。当然您可以对比一下, 压缩和不压缩两种请跨下, 代码的运行轨迹。
下图是将 removeCookie 函数压缩致一行后, 运行到的第二个正则表达式
下图是第三个正则的位置
根据上图中的分析, 只需要将 120~122行 newState 函数压缩致一行即可。
下图是第四处正则的位置
解密反混淆后, 如下图
被检测的函数如下
这个检测过掉之后, 这个sojson的反调就过掉了。浏览器不再因为代码被格式化就陷入死代码的无限循环中, 也就是说我们可以愉快地调试它了。
心得感悟:
这个检测过掉之后, 这个sojson的反调就过掉了。浏览器不再因为代码被格式化就陷入死代码的无限循环中, 也就是说我们可以愉快地调试它了。
心得感悟:
听大佬们说, sojson是最基础的反调加密手段, 但即使这样我也花了近两天才把它弄明白, 刚开始看混淆代码的时候, 会头晕脑胀, 但听前辈们说一定要先习惯看混淆代码, 再去学习AST自动反混淆工具, 只有自己具备反混淆能力时, 才能更好地去使用那些遍历的工具, 这也是为什么我写这篇笔记的原因。