关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 常见的字符串
在还原控制流之后,接下来的动作就是还原字符串了,在混淆代码中,可以看到类似这样的代码:
var f = "\u01de\u01dc\u01d1\u01d1";
var m = "";
var b = 0;
while (b < f.length) {
var j = 445 ^ f.charCodeAt(b);
m += String.fromCharCode(j);
b++;
}
它可以置换成:
var m = 'call';
以及这样的代码:
U = "\u0307\u0366\u0314\u0334\u0355\u0368\u0309\u037b\u031c\u0369\u0304\u0361\u030f\u037b\u0308\u0333\u0341\u0324\u0350\u0325\u0357\u0339\u0319\u036d\u0305\u036c\u031f\u0344\u0325\u037e\u034f\u0312\u034f\u036e\u0353\u036e\u030f\u0354\u0364\u0339";
se = "";
$ = 0;
ke = 0;
while (ke < U.length) {
if (!ke) {
$ = 881;
}
Ee = U.charCodeAt(ke);
De = Ee ^ $;
$ = Ee;
se += String.fromCharCode(De);
ke++;
}
它可以置换成:
se = 'var a=arguments;return this[a[1]]!==a[0]';
还有这样的代码:
ae = "c";
ae += "han";
ae += "nel";
ae += "Inter";
ae += "pretation";
它可以置换成:
ae = 'channelInterpretation';
以上的还原,根据特征的不同,需要编写不同的还原插件。这样的替换,大大减少了代码量。让分析变得更容易。
上面的字符串是很容易被发现并还原的。还有一类字符串需要研究代码才能发现并将其还原。
2. 隐藏的字符串
再将整个混淆代码还原后,其实可以发现他的函数 函数 i,是个递归函数,其实也是一个个函数组成,如:
通过不同的实参,来执行不同的语句,其实是可以看成一个个的函数。
这个时候,可以发现有个 "函数" 比较特殊,有很多的函数调用:
可以看到,实参都一样,并且,还有一个特殊的地方,就是它的前一个语句还后一个语句,基本都是一样的:
s.push(2285859110262, 1, 2);
i(29, 2, -1);
Ke = s.pop();
基本都是这种类型,在混淆代码中还比较多,先是变量 s push一些数值进去,经过 i 函数的处理后,再 pop给其他的变量。
来看看 i(29,2,-1)到底是干嘛的:
这不就和上面的比较类似嘛,最后 s 有个 push的动作,函数结束后,又 pop了,因此可以断定,它就是保存了结果(字符串),然后再pop给其他的变量使用。
3. 代码改写
将代码抠出来并改写:
先是定义了一个变量 s,
然后将 if (29 == o) 里面的代码抠出来,并改成成函数
根据代码中的提示,给 s push几个数值,然后调用 i_29函数,然后再将 s 给 pop出来。
得到 pop出来的值 :toString.
有个这个函数,就可以将 类似上面的代码全部进行还原了。如下面的代码:
s.push(19, 2319055194983, 2, 1);
i(29, 2, -1);
fo = s.pop();
可以置换成:
fo = "toString";
完美!
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。
欢迎加入知识星球,学习更多AST和爬虫技巧。