zl程序教程

您现在的位置是:首页 >  Python

当前栏目

Python 爬虫进阶必备 | 某恩数据网排行加密数据解密逻辑分析

2023-02-18 15:41:16 时间

今日网站

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 完成全流程的请求了

Python 实现全流程

End.

以上就是全部的内容了,咱们下次再会~