声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在本公众号联系作者立即删除!
正文
首先在这里感谢Zong佬文章,很快的就知道akm3的一些字符串怎么解混淆。文章在这里,我就是在这个基础上又继续分析的。https://1997.pro/archives/1724551505440。还原结果如下图:
通过此图可明显看出来部分字符串已经被还原了,但是C76函数还有很多不能还原的,这就是Zong佬文章中所说"akm的字符串解密过程是动态的"。接下来就说一下话存在的一些混淆。
首先是类似jsfuck,常量替换这种就比较常见了。
之后就是这种纯函数,还是花指令的混淆i了。
解开之后就是这样,左边是解开的。是不是明显很多。
还有逗号表达式,三元表达式的还原。下面这种特殊的三元表达式,其实分析后可以判断出真假,就单独写一个脚本。
typeof SQ()[hR()[24]] !== 'undefined'
typeof gV()[hR()[38]] === "undefined"
重点说下如下这类字符串为什么,用之前的方法无法获取。
gV()[hR()[18]](577, 346)
rj()[hR()[7]](623, true, 17)
下面是一个加密函数的内容
do {
if (!(pL6 - 12)) {
SQ()[PT6[pL6]] = function () {
return DT.apply(this, [45, arguments]);
};
} else {
SQ()[PT6[pL6]] = function () {
var wY6 = PT6[pL6];
return function (mx6, NM6, nM6, kx6) {
var k26 = NE(true, NM6, false, kx6);
SQ()[wY6] = function () {
return k26;
};
return k26;
};
}();
}
++pL6;
} while (pL6 < PT6.length);
如上所看到的,首次进入NE(true, NM6, false, kx6),才可以获取正确k26的值,也就是我们所用的字符串,所以第一次传入的参数很重要,之后不管传入任何值,获得的都是k26的值。但是为什么我们在第一次之后无法获取,其他位置也拿不到,拿到了也是乱码,是因为代码中控制了字符串获取的位置,比如在检测屏幕的时候,才可以取到screen这个字符串。所以我只能通过dump办法去还原,如下图,最终LC76反混淆如下。
欢迎大家关注我的公众号“秋裤的学习笔记”,也可以加我v: DYF_dyf_