python爬⾍之破解javascript-obfuscator的混淆加密
javascript全局数组接上⼀篇有关前端加密达到反爬的⽂章,是不是觉得⽤了javascript-obfuscator 就很安全了,那还真不⼀定啊,还是那句,反爬与反反爬⼀直在⽃争,没有谁能绝对的压制另⼀⽅,只有使⽤者技术的⾼低。以下就是⼀个⼤神的针对javascript-obfuscator库的破解。
本篇⽂章转载于 :
死代码与花指令
在开始之前,我们先了解⼀下这种「在代码中插⼊⼤量⽆⽤代码以混淆视听」的混淆⽅式吧。这种混淆⽅式有两种叫法,或者说是两种做法,它们分别是「死代码」和「花指令」。
> 死代码
死代码⼀开始是被⽤来描述⼀些⼈写代码时写出的没有⽤到的代码的,为了编译后的⽂件尽可能地⼩,编译器通常会对死代码进⾏移除处理。
⽽在不知道什么时候开始,死代码被安全⼯作者们⽤来作为⼀种混淆机制,以将代码量变得极为庞⼤,使进⾏逆向⼯程的⼈难以到主要逻辑。
但死代码有个很明显的特征:它虽然看着代码量很⼤,但实际却完全不会在程序的正常代码中被调⽤。
如果你有兴趣的话,可以对⼀些包含了死代码的代码进⾏聚类分析,你会发现死代码和正常代码之间泾渭分明,正常代码都是互相关联着的,⽽死代码却是孤零零的⼀块或者多块,并且正常代码还完全不会与死代码产⽣关联。
> 花指令
花指令是以前被⼤量运⽤在⽊马、病毒的免杀上的⼀种反反汇编⼿段,花指令中的“指令”通常指的是汇编中的 jmp、call 之类的调⽤、跳转指令,⽽攻击者们会将这些指令巧妙地插⼊到恶意代码的执⾏逻辑中,使得静态分析⼯具在分析到这个位置时⽆法正常反汇编。
花指令曾经的⽬的主要有两个,⼀个是使杀毒软件⽆法⾃动分析出恶意代码,达到瞒天过海的效果;⼀个是给安全⼯作者在分析恶意软件时设下层层阻拦,使安全⼯作者需要花费更多的时间才能理清代码逻辑,达到拖延时间的效果。
同样是不知道什么时候开始,花指令也被安全⼯作者们⽤来作为⼀种混淆机制。在这种应⽤场景下,花指令和死代码其实很类似,它们都是⽤了⼤量⽆⽤代码来混淆视听,但花指令和死代码最⼤的区别
就是,花指令的⽆⽤代码是会被混在正常代码中进⾏执⾏的。相⽐于死代码⽽⾔,花指令会造成⼀些性能损失,但同时也会让进⾏逆向⼯程的⼈更加难以分析。
但花指令也不是⽆懈可击的,为了不影响程序正常的执⾏,花指令不能⼲扰到程序的原有逻辑,举个例⼦:
a = 1
b = 2
# 花指令开始,对变量进⾏了⼀通操作
a += 1
a += b
# 花指令结束,⼜把变量的值给变回去了
a -= ba -= 1
c(a, b)
所以其实只要你能看出这⼀通操作没有任何意义,花指令也⾃然就没法影响到你了。
> ⼩结
不管是死代码还是花指令,其实都只需要我们仔细观察就能将其剔除,它们并不是什么很难搞的东西,见得多了之后你甚⾄都不需要细看就能快速排除掉⼀些明显不是正常代码的部分,毕竟常见的混淆器中⽤到的代码其实重合度是很⾼的,同样的套路见多了之后⾃然很容易分辨。
更何况,代码混淆是需要考虑性能损耗的,对⽅不可能为了防你逆向⼯程⽽⽆⽌尽地对代码进⾏混淆,要不然⼈家正常业务也没办法进⾏了。
实战
基础知识了解完了,我们来进⼊实战环节。
⾸先,我们打开,这是 Obfuscator 的⽹页版本,可以快速在⽹页上进⾏混淆参数的配置,并且⼀键⽣成并导出混淆后的代码。
顺带⼀提,Obfuscator 是⼀款⾮常优秀的 JavaScript 代码混淆⼯具,但代码结构都是固定的,如果想要更好的混淆效果,可将混淆后的代码进⾏修改,从⽽让别⼈更难分析和调试。
现在,我们⽤它给出的样例代码来进⾏混淆。样例代码如下:
// Paste your JavaScript code here
function hi() {
console.log("Hello World!");
}
hi();
注意,我们需要勾选以下选项:
这三个选项的效果分别是:
•Compact code将代码中的换⾏符全部去掉,使得代码看起来毫⽆结构性。也就是所谓的代码压缩。•
Self Defending在代码中插⼊⾃检代码,⽤来⼲扰逆向⼯程的⼈对代码进⾏格式化、变量重命名操作,如果代码被格式化了就会⽆法正常运⾏。•Dead Code Injection在代码中插⼊死代码,也就是本⽂的重点。
配置好参数后点击 Obfuscate 按钮,即可⽣成按配置混淆后的代码,我⽣成的代码是这样的(长图警告):
可以看到,原本短短的⼏⾏代码,在经过混淆后变成了这么多。⽽且这个代码还是经过压缩的,完全看不出层级。当然,这个代码是可以正常运⾏的,我们⽤NodeJS跑⼀遍看看:
看起来混淆并没有影响到正常的代码逻辑,我们再把这⼀坨代码给格式化⼀下看看:
果不其然,格式化后的代码直接就没法运⾏了。在平时我们遇到这种情况时要记住,原代码可以正常运⾏但格式化之后不⾏,那么这个报错肯定是跟格式化代码有关系的,⾄于它报错的内容具体是啥意思其实并不重要。
那么怎么办呢?我们来静态分析⼀下它的代码就知道了。
先来看看第⼀段代码:
定义了⼀个数组并初始化,显然不可能造成什么问题。接着看看第⼆段代码(长图警告):

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。