首先推荐一个hook工具,用于显示cookie变化:https://github.com/CC11001100/js-cookie-monitor-debugger-hook
解题思路:
本题主要是cookie内两个参数m和RM4hZBv0dDon443M,载荷内m和f的参数跟栈点一点就能找到这里不赘述了。
通过推荐的插件,可以看到m值的变化。
一共生成了五次,第五次生成的与cookie内的m参数相同。
hook代码到m生成位置查看:
// ==UserScript==
// @name getM
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://*/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
Object.defineProperty(document, 'cookie', {
set: function(val) {
debugger ;return val;
},
});
}
)();
看到m生成五次,那么最后一次正是cookie中的m参数。
现在再确认RM4hZBv0dDon443M参数生成过程。
可见和这个参数有关,但是ctrl+f没有搜到,可以用油猴hook继续找。
// ==UserScript==
// @name hook $ss
// @namespace http://tampermonkey.net/
// @version 2024-07-03
// @description try to take over the world!
// @author You
// @match https://*/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=yuanrenxue.cn
// @grant none
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
Object.defineProperty(window, '_$ss', {
set: function (val){
debugger;
},
});
})();
hook到这里,
UH数组只用用鼠标圈一圈就会有值,那么把这段代码补一补可以看出是一个加密。
开扣!
发现和这个_0x4e96b4[‘_$pr’]有关
我们直接ctrl+f搜索_0x4e96b4[‘_$pr’]
把断点都打一下,再运行发现该数组被push了五次,现在只用还原五次push的过程这道题就解决了。
现在回头看思路还是比较清晰的,但是写的时候不知道结果会觉得很复杂。
这里介绍几个需要注意的点和方法。
注意的点:
- .'_$tT’值发生改变了,并不是初始化的值,所以补环境注意方法调用的位置。
尽量还原逻辑,可能会在某个分支改为另一个值。 - 扣多了代码导致改变了CryptoJS库内的WordArray,最后调用CryptoJS函数出错,所以要注意尽量不要改变全局环境。
- _0x4e96b4是window的值,所以可以用window的名义hook代码。
方法: - 可以固定时间戳的值,来对部分代码log出结果比对浏览器的结果查看各个部分是否一致。
代码部分:
JS部分太长了,详情请看:
详情代码
import requests
import execjs
import requests
def p(page):
with open('y5.js', 'r', encoding='utf-8') as f:
s = f.read()
res = execjs.compile(s).call('get_config')
url = f"https://match.yuanrenxue.cn/api/match/5?page={page}&m={res['m']}&f={res['f']}"
# print(url)
payload = {}
headers = {
'Cookie': f'sessionid=your_sessionid; m={res["r_m"]}; RM4hZBv0dDon443M={res["r_r"]};',
}
# print(headers)
response = requests.request("GET", url, headers=headers, data=payload)
return response
arr = []
for i in range(1, 6):
res = p(i).json()
print(res['data'])
arr.append([i['value'] for i in res['data']])
res_a = []
for i in arr:
for j in i:
res_a.append(j)
res_a.sort(reverse=True)
print(res_a)
sum = 0
for i in range(0,5):
print(res_a[i])
sum += res_a[i]
print(sum)