关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 目标地址
https://match2023.yuanrenxue.cn/topic/3
其加密参数token的核心代码被混淆了,地址:
https://download.python-spider.com/match2023/corejs/match3.js
2. 还原分析
1.打开文件后,看到的是一个for混淆,里面有很多的 if - else 语句:
所以,又是一个控制流平坦化的混淆。在去控制流之前,先要做一些常规的还原操作。
给 if - else 加上 {} ,统一格式,可以使用星球里的这个插件:
https://t.zsxq.com/11c86qE3u
2.改写 if - else语句,使之变成 switch语句,思路在 AST反混淆实战|某数4代VM混淆代码还原详解 讲过,不再此赘述,代码可以参考这里
https://t.zsxq.com/0e7Eecr47
修改后,还原后的部分代码如下:
3.接下来就是把指向下一个执行的case的值改成直接赋值 = ,而不是 +=,即将:
case 57:
o += 69;
break;
还原成:
case 57:
o = 126;
break;
这样的目的是可以使用星球里的九大节点合并算法继续处理。效果图:
4.同样,为了适配 星球里的九大节点合并算法,需要将下面的代码进行修改,即:
case 23:
if (105 == j) {
o = 98;
} else {
o = 130;
}
break;
修改为:
case 23:
o = 105 == j ? 98 : 130;
break;
5.接下来就是使用星球里的 节点合并算法将其还原了,运行后,还剩 13 个case:
6.既然只剩这么点case,就不写代码了,直接手动合并节点,看到这个case:
case 173:
return;
break;
它只包含一个return语句,比较简单,因此,在一些指向 173 的case进行改写,比如:
case 169:
n.t.pop();
o = 173;
break;
改写成:
case 169:
n.t.pop();
return;
break;
需要注意的是,像这种:
case 139:
var p, v, g, m, d, y, w, F, b, C, j, x, E, R, S, k, q, z, A, B, D, G, H, I, J, K, L, M, N, O, P, Q, T, U, V, W, X, Y, Z, $, _, ee, ie, le, se, fe, ne, te, re, ae, ue, oe, ce, he, pe, ve, ge, me, de, ye, we, Fe, be, Ce, je, xe, Ee, Re, Se;
o = this.constructor != i ? 122 : 173;
break;
改写起来比较麻烦,还不如不动。同理上面的 case 169同样可以进行改写。
改写完毕后,再使用 节点合并算法将其还原,最后还剩 2个case:
这里的case 180 ,它指向了它本身,因此是一个 while(true)的循环节点,在此不再合并。
接下来的工作就是还原vmp了,由于本人能力有限,vmp的还原还在学习中,后续给出还原思路。
3. 还原源码
地址:
https://t.zsxq.com/126Wf6CHu
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。
欢迎加入知识星球,学习更多AST和爬虫技巧。