海绵 平常学python python
今天咱们继续上次的接着分析,上次说了咱们把eval动态运行的拿出来放到主页面方便调试,可是咱们看到他这一段都是混淆过的ajax
递归方式+混淆+简单扁平化
首先市面上有混淆工具能够达到这个效果,我本身也基于ast写了一个混淆工具,扯远了,咱们来看下他这个都是数组方式读取字符串,在源码搜索的时候
咱们发现了他初始化的位置,
由于他是动态解析的这个数组,咱们只须要拿到他数组的成员放进去就好了,
其实我看到这里是很疑惑的,这个字符串居然没有加密码,赤裸裸啊。
而后咱们把字符串数组手动赋值以后咱们拷贝这一段js到我写的混淆还原工具来看看
没压力,瞬间还原,工具自动计算做用域替换的。而后咱们粘贴到notepad看看
这么看的话基本上他的全部东西都出来了,万事俱备,就差调试, 咱们把这还原出来的js 替换上去,怎么替换呢,就是把昨天分析的ret = eval (伪代码把这个直接拷贝上去就好了,这样也方便调试。刷新以后debugger咱们忘了处理,直接跳过算了,而后咱们看到了这个
而后本着测试的精神,我又刷新了七八遍,发现一个问题
这个页面我是和js一块儿保存的并无从服务器拉取最新的然是依旧能够正常使用,由于他有两处,咱们尝试下这个
这段若是固定了js直接报错,不固定正常加密,这就头大了,由于这是一段加密后的字符串咱们无论他是什么反正一会都要解密咱们先无论。api
到了如今咱们能够固定的调试他的第一层解密出来的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一个函数而后传进去三个参数,仍是这三个参数
生成一个参数一调用参数二方法,传入参数三咱们看下这三个参数
咱们能够直接这样
打印出位置咱们双击进去
断点进去以后咱们看
这个函数没有什么蹊跷,继续走下去ide
this._$oM = arguments[1] = _$ok(arguments[1])[0];
隐藏的很深啊
咱们跟进去这个函数
而后咱们单步发现他走到这里就有结果了咱们看下它穿的参数
姑且认为参数2有用,咱们看下参数2那里出来的
参数2咱们看下他的参数函数
var _$s2 = _$HW(_$59(_$qt("/tmrpToken.token")));
咱们看看工具
_$qt
编码剩下的无论他是什么 函数,到时候直接扣就好了,咱们只分析
到如今咱们看到了$HW,$59,_$6p这三个是加密用的,至于内部逻辑,先无论,先测试下能不能加密测试
把他单独拿出来,而后写一个加密函数this
function url_encry(_$di){ var _$s2 = hm._$HW(hm._$59(encodeURIComponent("/tmrpToken.token"))); return hm._$6p(769, 0, _$s2, _$di); }
如今看来咱们思路没有错,分析逻辑和加密逻辑是没问题的,好了
篇幅有限,分析解密留着下次讲解,慢慢吸取此次的