在数据采集的学习过程当中,发现了一个有意思的网站,所以记录一下,仅供学习交流,用于其他用途与作者无关。
目标:私募基金当中的列表页数据
一、抓包环节
省略
接口:https://sppwapi.simuwang.com/sun/ranking/fundRankV3

一个xhr的请求类型。
二、逆向分析

这里可以看到的是数据是被加密了,一般如果返回这样的样式的可以搜索一下Json.parse看看是否能够搜索到解密的地方(混淆了搜索不到)
1、观察请求体、请求参数
请求体:

这里翻页然后再pycharm当中重新请求,但是没有携带cookie,发现是可以请求成功也有返回结果的,实践步骤略(可以自己实现)
请求参数:

这里看到的请求参数发生变化的事page和USER_ID这两个参数,page是对应的页面的页码,USER_ID则是登录该网站之后的,是不会发生变化的。
2、跟栈找到加密位置
添加xhr断点


这里是fetch所以要选择单步调试,随后就是更具栈来找到解密位置

这里可以看到条件控制流走"json",跟进去

可以发现数据有了,是加密之后的数据,现在就是要看数据在哪里解密的。

这里可以看到是把数据传递到了g函数当中控制台输出一下看看是否解密了

这里发现没有解密,那就继续往下看

这里看一下c.options.onResponse是什么操作,因为刚才的控制流可以看到,我们需要的数据现在是在c这个变量当中的

3、确认解密参数

进来了看下参数

这里明显的看到了有个decrypt关键字,盲猜看看是不是在这个里面做了解密,但是还是需要看看在当前的函数当中是怎么走的。
跟着函数执行可以发现,其实就是两步
e._data.data = JSON.parse(e._data)
e._data.data = decrypt(e._data.data)
随后跟进decrypt当中看看

在入口和结束的地方打断看看,中间的可以随便打一两个,毕竟第一遍是看看是否印着了猜想

直接按照断点运行就会发现,在最后的过程当中数据被解密了
所以肯定解密的地方就是在这个函数之内了

最后放过断点,重新翻页再来到该函数里,随后就是对该函数的分析了,这里就不贴图了,简单的说一下
let script = document[__Ox11208b[9]](__Ox11208b[8]);
script[__Ox11208b[10]] = data[__Ox11208b[11]],
document[__Ox11208b[13]][__Ox11208b[12]](script);
这三行代码对解密没有什么用,应该是网页添加一些元素,所以可以删除,然后后面发现在判断条件的时候都是走的
else if (data && data[__Ox11208b[0]]) {
这一行。
扣下来会发现这些按照本地的调用的话是不太全,所以要补全,需要导入crypto-js,将MD5,AES,UTF8这些替换成本地crypto-js的写法
替换完成的代码如下:
const CryptoJS = require("crypto-js")
function get_result(data){
ar __Ox11208b = ["encode", "aes", "wxSign", "data", "atob", "parse", "slice", "decrypt", "script", "createElement", "text", "key", "appendChild", "body", "window.", "id", "", "join", "reverse", "split", "length", "charCodeAt", "fromCharCode", "undefined", "log", "删除", "版本号,js会定", "期弹窗,", "还请支持我们的工作", "jsjia", "mi.com"];
if (data && data[__Ox11208b[0]] === __Ox11208b[1]) {
const e = CryptoJS.MD5(


2833

被折叠的 条评论
为什么被折叠?



