2025-04-11
逆向地址:aHR0cDovL3poZW5nY2UuMmIuY24v
打开开发者工具出现debugger,直接注入脚本过掉无限debugger
let aaa = Function.prototype.constructor;
Function.prototype.constructor = function (params) {
if(params === ‘debugger’){
console.log(params);
return null;
}
return aaa(params);
}
请求接口:http://zhengce.2b.cn/info_api/policyType/showPolicyType
然后发现这个POST请求的请求体是一段乱码一样的东西,然后再看一下它的content-type:
application/octet-stream表示的就是字节流数据.
然后从启动器进去,下一个断点,点击其他的请求接口,断点断住之后,看到那个r就是请求的数据,已经是ArrayBuffer了,也就是那个字节流数据.
然后我们看右边的栈,往前面跟栈,发现其是一个异步栈,且发现Promise后面的栈中,这个字节流数据都已经生成了.那么我们就到promise那个栈中下断点,然后重新点击其他的请求接口.
到promise那个栈下断点
这时候我们发现这个e.data变量的值就是
{
“policyType”: 6,
“province”: “”,
“city”: “”,
“downtown”: “”,
“garden”: “”,
“centralId”: “”,
“sort”: 0,
“homePageFlag”: 1,
“pageNum”: 1,
“pageSize”: 7
}
这个其实就是没有加密前的请求体的数据.
然后又通过r = Promise.resolve(e)返回一个新的promise,r = r.then(i.shift(), i.shift());当promise变为已完成的状态后会调用i这个数组中的函数,那么我们就直接进去数组i中的所有的函数,在其上面打断点,然后直接跳过断点,断点直接断在了函数里面,发现函数的参数e就是包含了请求体数据的参数
然后我们一直一步一步地往下跟栈,这个函数中把e赋值给了n,所以n和r和e里边都保存了请求体的数据,然后发现到了
r[i(0, 1557, “PlOv”, 0, 1281)] = o[c(835, “Kzp9”, 1060, 1387, 1012) + “e”](r[c(1961, “V)qg”, 2196, 1674, 1683)])i(0, 1200, “PlOv”, 0, 936) + "h"i(0, 1014, “ZftU”, 0, 1250)
这一行代码的时候,这一行代码执行完毕后,n变成了字节流数据,因此可以发现就是这一行代码对请求体的数据进行了加密. 然后把其他的所有断点去掉,只保留这一个断点,然后我们再重新请求接口.
稍微还原一下发现:其实这一行代码就是:
r[“data”] = o"encode"‘finish’‘slice’
只需要把o[“encode”]这个函数扣下来即可.
然后从函数进去,o[“encode”]其实就是PolicyInfoByTypeIdParam$encode函数,首先把这个函数给扣下来,然后发现需要找到w=Writer.create()是什么
然后我们进去到Writer后发现,其是在一个模块名为38的webpack模块当中,那么这时候,我们找到其webpack模块的加载器,发现是一个自执行的函数,就直接把这个webpack扣下来.
传进去的protobuf_min参数没啥用的,直接删除即可.执行代码报错:
ReferenceError: commonjsGlobal is not defined
那么直接赋值:commonjsGlobal = global;
再执行,发现已经不报错了.
然后这时候我们需要把加载器中的(16)这个代码删除,并用全局变量jzq将加载器导出.然后再执行38模块的代码,jzq(38); 注意:需要将
i2.util.global.protobuf = i2,
module && module.exports && (module.exports = i2)
这两行代码注释掉
然后
let ww = jzq(38);
w = new ww();
这里得到的w就是对应的PolicyInfoByTypeIdParam$encode函数中的w
正确得到请求体的字节流数据如下:
随后直接用python调用即可.成功请求得到的数据如下
需要注意的就是,js中返回的字节数据,在python中首先将其变成列表,也就是
[10, 1, 52, 18, 0, 26, 0, 34, 0, 42, 0, 50, 0, 56, 0, 64, 1, 72, 7, 80, 1]
然后再调用bytes(data)将其转换为为字节流