aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9Cb3hPZmZpY2UvQk8vWWVhci9pbmRleC5odG1s
打开链接,刷新页面,可以看到如下的请求
返回值得结果是一长串得密文
这个密文得解密逻辑就是本文分析得主要内容
点开请求包得 Initiator 选项卡
点击下面得位置
进去可以看到代码所在的位置是一段 ajax 请求逻辑
这里请求得链接就是我们正在分析的请求
因为我们需要具体分析的逻辑是返回值解密的代码,所以我们需要关注的是 sucess 括起来的这一段
这里代表得是请求成功之后回调的处理方法,所以请求返回值解密大概率就在这里
打上断点,然后刷新页面,正好断在这里,这里有一段 JSON.parse 代码
从上图这里追进去之后,可以看到一个 OB混淆的代码
显然密文就是在这个文件里面进行解密的(此地无银三百两【狗头】)
接下来要做的是分析这段混淆代码,但是说实话看这么一段混淆有点脑瓜疼
寻思着先找找入口,就像缠在一起的线,找到线头才是解开它的开始
把 js 拖到最后,发现我可能想的有点复杂了
代码的最后这里直接实例化好了 weInstance 对象,也就是说这一大段的 js 代码的入口,就是webInstace.shell(e)
,我们可以照着调用就完事了
所以这里直接复制到 snippets 里
点击运行
运行没有问题,我们把密文带入进去试试,像下面这样
运行结果如下
这样就解出来了
但是到这里还不是最终的结果,毕竟这里用的还是浏览器自己的环境,我们在 node 环境下运行还不知道有没有什么幺蛾子
所以本地新建一个 js 文件把上面 snippets 的代码都复制进去,然后运行
然后果不其然就报错了
这里提示 navigator is not defined
按照缺啥补啥,写上 var navigator = {}
再运行就没有结果了
哦吼,这个时候我们回退回刚刚报错的地方,可以看到这里的代码是这样的
if (!navigator || !navigator[_0x2246('0x26d', '0I#o')])
return '';
continue;
像刚刚补齐var navigator = {}
,后面取得 navigator 中得值也是取不到得
所以打上断点看看这里取得是 navigator 得那个属性
选中 _0x2246('0x26d', '0I#o')
然后看看他得值是啥
取得是 ua,所以我们这个时候要把 ua 补上
var navigator = {
'userAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
补全之后,再次运行
得出解密好得结果了
然后就是 Python 模拟请求,然后调用 js 解密就可以了
不过代码都在手上了,我们简单看看 js 的解密使用了什么算法
打上断点,可以看到有一个控制流
后续的 switch case 会按照这个字符串排序进行
之后向下知道switch case 部分可以看到一段解密的代码,手动还原一下,结果如下
这里是再 case 为 0 的时候才进行解密,前面的几个步骤都是对正文进行处理,来获取 key
这里用的是 ECB 加密所以没有 IV,所以只要简单分析一下的 key 的运算就可以完成还原了
而 key 的运算逻辑在 case 8 的位置
比较简单就是调用了 substr 对返回的密文进行切割得到 key
之后又对正文也做了处理,在 case 2 的部分
之后就是在 case 0 的部分解密
按照这个思路,就可以用 Python 完成全流程的请求了
End.
以上就是全部的内容了,咱们下次再会~