您现在的位置是:网站首页>文章详情文章详情
AST反混淆实战|某里滑块三重switch压缩思路分享
悦来客栈的老板2021-11-19【 原创文章 】 浏览(2639) 评论(0) 喜欢(19)
简介本文思路源自 渔滒 的某里AST反混淆代码,本人仅在此做个归纳总结,并感谢 渔滒 的思路。因法律风险,不提供源码,只有思路,所以请不要问我要源码。
本文思路源自 渔滒 的某里AST反混淆代码,本人仅在此做个归纳总结,并感谢 渔滒 的思路。因法律风险,不提供源码,只有思路,所以请不要问我要源码。
最新版的某里已经到了140前缀(几个月前),并大量的充斥着三目表达式,逗号表达式,如果要还原,从代码难看程度就已经把人吓退了。
其实不然,仔细分析,稍微有点AST的基础,就能将三目表达式还原成 if 语句,if 语句特别的有规律,又可以还原成 switch 语句。由于过于简单,不是此文的重点,再此不表。
第一步:
三目表达式 => if 语句 => switch 语句
经过上面的还原后,会得到一个 三重的 switch 嵌套代码(如下图),特别的长,多达36000行,看起来还是很迷糊。那怎么搞?
我们要还原代码,如果能将三重的switch 变成一重的switch代码,那不就清晰多了?
是否可行呢?
答案是可行的,我们来看最后的那一重switch,其cases最大长度为 28(读者可自行验证):
从 0 - 28,是经过 or = 31 & ir 这段代码计算出来的,而31 的二进制为
11111
二进制前X位全部是1,又考虑到 28 小于 31 ,因此我们可以大胆的猜测,ir的值就是对应的 0 - 28 ,因为 对于小于 31 的数来说, 31 & X == X ,这个条件是成立的。
通过这段代码:
var cr = 31 & rr
, br = rr >> 5
, kr = 31 & br
, ir = br >> 5
, or = 31 & ir;
我们取最后一个 值 28,来倒推 rr 的值:
1: or = 28 ---> ir = 28
2 : ir = 28 ---> br = 28 << 5 = 896
3 : br = 896 ---> rr = br << 5 = 28672
当 rr == 28672时,可以得到 or 的值是 28:
所以,类似这样的代码:
for (var rr = 7587; void 0 !== rr; ) {
var cr = 31 & rr
, br = rr >> 5
, kr = 31 & br
, ir = br >> 5
, or = 31 & ir;
switch (cr) {
case 0:
!function() {
switch (kr) {
......
case 28:
_ += "e",
rr = 5925
break;
......
case 1:
......
}
}
可以直接写成 :
switch(rr):
{
......
case 28672:
_ += "e",
rr = 5925
break;
......
}
其实,也就是由第三重switch中case里的值去逆推 rr 的值,从而就将三重压缩到了一重,同理两重switch也可以压缩成一重代码。
此方法已经经过证实可行,思路是正确可行的。
渔滒 YYDS,再次感谢。
从上面也可以看出,善于分析确实是非常重要的一项技能。
AD:
欢迎加入我的个人星球,编写了很多有用的插件,只需要稍微有一点js基础即可,对爬虫工程师和前端工程师均有一定的帮助。
相关文章
本栏推荐
标签云
猜你喜欢
站点信息
- 建站时间:2019-5-24
- 网站程序:like in love
- 主题模板:《今夕何夕》
- 文章统计:104条
- 文章评论:***条
- 微信公众号:扫描二维码,关注我们