昨天2群里的大佬丢过来一个网站,发现其核心代码被混淆的面目全非,顿感头痛,经过一番捣鼓,终于有点头绪,逆向过程分析如下,全凭运行,仅供参考。
一.网站地址
http://39.101.191.131:8000/
二.抓包分析
打开谷歌浏览器,并按下F12,地址栏输入如下上面的 url,抓包如下:
一个html 和 一个返回数据的接口,看起来非常的简单。
要分析的参数也非常的简单,就一个 cilame 。但当你点击上面的接口,切换到 Initiator 面板时,傻眼了,全部是 eval:
全部是eval,我们在看看第一个html返回的信息:
就一个 script 标签。发现无法格式化代码,将标签内的代码全部复制下来保存到文本里,手动分析,将代码稍微整理后如下:
三.代码分析
在代码中,发现有很多的 s 函数调用,其 实参 为 字面量,对AST熟悉的我,首先想到的是看能不到 得到 s 函数调用后的结果,控制台输入试试:
这样一输入发现了惊喜,那我们将其全部打印出来看看:
for(var i=0; i<400; i++)
{
s(i) && console.log(i,s(i));
}
控制台运行上面的代码后,发现了蛛丝马迹:
s(245) 和 s(246) 都是 '&cilame=',这很像请求的接口,查找文件中的代码,定位到了这里:
发现后面的那些
s(246)+s(s(27))(s(s(223))(s(s(95)))),s(58)
字符替换后并没有得到什么可用的信息,是我姿势不对?
那可不可能是 s 函数有问题,我们先hook住代码,在运行时的环境跑下上面的循环试试:
点击上面的 VM,进去后打上断点,再次刷新,程序停在这里:
再次运行上面的循环代码,把s调用打印出来:
依然还是 s(246),在看后面对应的字符串:
多次尝试,看到了熟悉的字符串,这不就是加密结果吗?化简后,其实就是调用了 s('M') 函数,实参是page页数:
四.结果验证
那怎么把 s('M') 函数弄出来呢?代码被混淆的乱七八糟了,这我就不会了,但是为了证明加密的入口就是这个,我决定采用 rpc 的方式来获取结果。
初次尝试,拿不到结果,返回报错:
怎么费劲都拿不到,啥情况,不是这里吗?问过站长本人后,确认是鼠标或者touch事件检测。既然检测鼠标,那我在手机模式下试试:
发现还是拿不到,按道理来说,手机没有鼠标,也就无从检测,那只能是touch事件了,可惜我不会用代码模拟。
那就手动在页面的空白处touch(鼠标点击)下试试,竟然成了:
这就证明了 加密函数确实是 s('M') ,代码分析告一段落。
求助: 如果哪位大神知道 touch事件怎么模拟,欢迎留言。
如果你有更好的分析办法,欢迎交流。
后续看能不能把混淆代码给还原了,估计又得掉不少头发,因为这个 s 函数是变化的,字符串回填可能会有一些错误信息。
AD:
欢迎加入我的个人星球,编写了很多有用的插件,只需要稍微有一点js基础即可,对爬虫工程师和前端工程师均有一定的帮助。
更多推荐
js逆向|某网站超级混淆代码的逆向分析笔记
发布评论