今天我们继续上次的接着分析,上次说了我们把eval动态运行的拿出来放到主页面方便调试,但是我们看到他这一段都是混淆过的
递归方式+混淆+简单扁平化
首先市面上有混淆工具可以达到这个效果,我自己也基于ast写了一个混淆工具,扯远了,我们来看下他这个都是数组方式读取字符串,在源码搜索的时候
我们发现了他初始化的位置,
因为他是动态解析的这个数组,我们只需要拿到他数组的成员放进去就行了,
其实我看到这里是很疑惑的,这个字符串竟然没有加密码,赤裸裸啊。
然后我们把字符串数组手动赋值之后我们拷贝这一段js到我写的混淆还原工具来看看
没压力,瞬间还原,工具自动计算作用域替换的。然后我们粘贴到notepad看看
这么看的话基本上他的所有东西都出来了,万事俱备,就差调试, 我们把这还原出来的js 替换上去,怎么替换呢,就是把昨天分析的ret = eval (伪代码把这个直接拷贝上去就行了,这样也方便调试。刷新之后debugger我们忘了处理,直接跳过算了,然后我们看到了这个
然后本着测试的精神,我又刷新了七八遍,发现一个问题
这个页面我是和js一起保存的并没有从服务器拉取最新的然是依旧可以正常使用,因为他有两处,我们尝试下这个
这段如果固定了js直接报错,不固定正常加密,这就头大了,因为这是一段加密后的字符串我们不管他是什么反正一会都要解密我们先不管。
到了现在我们可以固定的调试他的第一层解密出来的js,因为大家都知道他的url是hook过的,也就是业务和反爬是分开的,所以我们不需要刷新页面来让他走到断点,我们可以这样
我们在控制台模拟他的其中一个接口然后回车
已经成功请求了,我们看他提交部分
到这里说明是任意的url,因为他是hook了ajax的api而他又是可以任意url不限制的,我们可以使用xhr断点
点击这个加号我们设置好他请求包含指定字符串的url就会断下来
$.get("/tmrpToken.token")
然后控制台回车
断在了真正提交url的地方,我们看到他是this.send
我们看到他的this就是XMLHttpRequest 对象,看到他的url已经完全计算好了
顺着堆栈看,我们先看send,点进去我们把断点下到这里,因为他的变量之类的是根据作用域算的,复杂的话从头来算比较好,上层变量有可能会重叠
,下好断点我们在重新提交一次
第二次提交我们可以看到非常干净,我们按f10单步走
走到这一行我们发现url出现了
非常清楚他在231这个对象,我们往上看
他在这个函数执行完就有了我们进去这个函数下断点看看
我们f10单步发现他直接最后了,再进去这个函数继续_$7e
传入三个参数
继续单步
又一个_$p5,继续
还是三个参数一样,然后有个Function,我们抠出来看下
new一个函数然后传进去三个参数,还是这三个参数
生成一个参数一调用参数二方法,传入参数三我们看下这三个参数
我们可以直接这样
打印出位置我们双击进去
断点进去之后我们看
这个函数没有什么蹊跷,继续走下去
this._$oM = arguments[1] = _$ok(arguments[1])[0];
隐藏的很深啊
我们跟进去这个函数
然后我们单步发现他走到这里就有结果了我们看下它穿的参数
姑且认为参数2有用,我们看下参数2那里出来的
参数2我们看下他的参数
var _$s2 = _$HW(_$59(_$qt("/tmrpToken.token")));
我们看看
_$qt
编码剩下的不管他是什么 函数,到时候直接扣就行了,我们只分析
到现在我们看到了_$HW,_$59,_$6p这三个是加密用的,至于内部逻辑,先不管,先测试下能不能加密
把他单独拿出来,然后写一个加密函数
function url_encry(_$di){
var _$s2 = hm._$HW(hm._$59(encodeURIComponent("/tmrpToken.token")));
return hm._$6p(769, 0, _$s2, _$di);
}
现在看来我们思路没有错,分析逻辑和加密逻辑是没问题的,好了
篇幅有限,分析解密留着下次讲解,慢慢吸收这次的