暗号:aHR0cHM6Ly9tYXNoYW5ncGEuY29tL3Byb2JsZW0tZGV0YWlsLzExLw==
题目:
先分析数据接口,可以看到m和ts是加密的,但是这里的ts的值应该是一个时间戳,所以主要要逆向的值是m:
然后在发起程序的最上面的堆栈下一个断点,断点断住后调整堆栈,并且观察作用域,查找加密值的生成位置:
就在第二个堆栈就找到了这两个参数的生成位置:
断点后先一步一步还原e的生成代码,还原的流程如下:
最终得到了e的值为:
parseInt(Math['round'](new Date()['getTime']()/0x3e8)['toString']())
再看f的生成代码:
其实就是由callEncryptFunction对c和e的值进行加密,e的值已经解决了,输出c查看,c的值为4,这个应该是页码:
所以接下来只需要找到callEncryptFunction的代码,所以进入这个函数:
可以看到其实最后返回的是g的值,所以又进入到window['exports']['encrypt']函数:
可以看到这是一段wasm代码:
这里可以直接将代码交给豆包,合理运用ai打工,让豆包生成加密代码:
然后就直接出答案了,将代码复制到本地,其实生成逻辑非常简单:
然后编写python代码就能获取到数据了:
附上python代码(cookie和headers已经删除):
import requests import execjs page = 3 cjs = execjs.compile(open("1.js", "r", encoding="utf-8").read()).call("result", page) headers = {} cookies = {} url = "https://mashangpa.com/api/problem-detail/11/data/" params = { "page": str(page), "m": cjs['m'], "_ts": cjs['e'] } response = requests.get(url, headers=headers, cookies=cookies, params=params).json() print(response)