JS逆向:猿人学爬虫比赛第五题详细题解(上)

实战地址

http://match.yuanrenxue.com/match/5

抓包分析

地址栏输入 地址,按下F12并回车,发现数据接口在这里:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第1张图片

按照常规,康康加密参数及cookie字段:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第2张图片

加密参数是 m 和 f, 看起来像 时间戳。

cookie中包含了 m 和 RM4hZBv0dDon443M 字段,多次翻页后发现 RM4hZBv0dDon443M 字段名不会改变,因此我们从这个字段名入手。

控制台 有一段 嘲讽 在不断的打印,右边有个VM,如图:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第3张图片

这么好的东西,我们怎么能轻易放过。我问过题主,为啥加一段日志在这里,他说一是为了嘲讽,二是告诉大家入口点。

在VM处点进去并格式化代码后,仿佛发现了新大陆:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第4张图片

在这里搜索RM4hZBv0dDon443M 试试,发现了仅有的一处,在这里:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第5张图片

后面的 "; path=/" 告诉我,这里是设置cookie,打个断点验证下:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第6张图片

(注意,需要先清除掉cookie和缓存,再刷新。)

可以看到,程序断在了这里,控制台分别输入:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第7张图片

果然是 设置cookie的语句,不过现在的值还是undefined,多执行几次,就能看到值了:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第8张图片

取消断点,让程序彻底跑起来,比对cookie值,发现是一样的:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第9张图片

加密地方知道了,现在就看 _$8K['_$ss'] 这个值是哪里生成的了,搜索'_$ss' 发现搜索不到,因为 _$8K 是window这个对象,所以这个时候可以用 油猴脚本来Hook,不过我对还原这段被混淆了的代码更感兴趣,既然学过AST,不用,那学来干嘛呢?

混淆代码还原

还原点一,大数组的还原,变量_$ev:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第10张图片

变量_$UH:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第11张图片

这两个变量其实是同一个,那更方便了:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第12张图片

控制台输入 _$UH 发现有 854个元素,使用copy函数有个抗,因为元素包含了window对象,直接复制会有问题。这里我使用了slice方法,分段copy。还原后部分代码如下:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第13张图片

还原点二,VariableDeclarator初始值替换:

替换前:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第14张图片

替换后:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第15张图片

还原点三,BinaryExpression计算值替换:

替换前:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第16张图片

替换后:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第17张图片

当然,上图中的 

'_$' + "cs7"[0x1] + "cs7"[0x1]

这也是可以进行替换的,替换的结果就是:

JS逆向:猿人学爬虫比赛第五题详细题解(上)_第18张图片

也就是一直要在的加密值生成的地方。

还原的差不多了,可以看到  _$8K['_$ss'] 这个值 是AES加密后的结果。

静态分析找加密位置,已告一段落。逆向的方法,将在下篇进行介绍,敬请期待。

你可能感兴趣的:(js,java,jvm,python,软件测试)