前言:记录学习
- 实验目的
- 确定分析参数,通过抓包得知,加密参数为page,t,v。page不用分析,t有点像时间戳,v需要重点关注,跟进去看看。
最多跟到这,接下来就又是艰苦的混淆代码了
跟进去,能看到使用CryptoJS AES加密,写个hook看看
old=_[1][0]['CryptoJS']['AES']['encrypt']
_[1][0]['CryptoJS']['AES']['encrypt']=function(a,b,c){
console.log(a,b,c)
debugger
return old(a,b,c)
}
找到了,能看到明文为'4|321m282,322m282,322m283,322d283,322u283',密钥和iv向量为67212c9f67212c9f,目前还是有点懵逼,下一步看看日志。
在apply处下一个条件断点,看看它的函数调用日志
能看到这个地方出现了密钥,按照toString(16)方法试一下,
能看到key就是时间戳转为16进制67212ef9后重复两次,
接下来进行验证,js标准库CryptoJS是否与网站的相同
// 定义模式和填充方式
const mode = CryptoJS.mode.CBC; // 可以选择 CryptoJS.mode.ECB 或其他模式
const padding = CryptoJS.pad.Pkcs7; // 可以选择 CryptoJS.pad.NoPadding 或其他填充方式
// AES 加密
function encryptText(text, key, iv, mode, padding) {
const keyWordArray = CryptoJS.enc.Utf8.parse(key);
const ivWordArray = CryptoJS.enc.Utf8.parse(iv);
const encrypted = CryptoJS.AES.encrypt(text, keyWordArray, {
iv: ivWordArray,
mode: mode,
padding: padding
});
return encrypted.toString();
}
function encrypt(text){
const ming_r='|326m312,324m312,322m312,322d312,322u312'
const ming=text+ming_r
const key=parseInt(new Date().getTime() /1000);
var key_hex=key.toString(16)
//var key_hex='6720a4c7'
key_hex=key_hex+key_hex
console.log(key_hex)
return {
page:text,
t:key,
v:encryptText(ming, key_hex, key_hex, mode, padding)
}
}
k=encrypt('2')
验证当使用key和iv,明文与浏览器相同时,结果也一样,将明文除page外参数写死。
三。编写python代码,进行结果获取
import requests
import json
import execjs
import requests
def get_res(page):
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
}
cookies = {
"sessionid": "sxsq4a5lmg7xk2quhc7xo5gunzv5dnn3",
}
url = "https://match.yuanrenxue.cn/match/18data"
with open("encrypt.js", "r", encoding="utf-8")as f:
code = f.read()
params= execjs.compile(code).call('encrypt', str(page))
print(params)
response = requests.get(url, headers=headers, cookies=cookies, params=params)
print(response.text)
return response.text
def get_data(get_res,check,check_fun=None):
def sub(datalist):
"""
求和
"""
result=0
for data in datalist:
result+=data
return result
def avg(datalist):
"""
求平均值
"""
return sub(datalist)/len(datalist)
def get_data(datalist):
result=[]
for data in datalist:
result.append(data['value'])
print(result)
return result
result=[]
for i in range(1, 6):
res= get_res(i)
data= json.loads(res)['data']
result.extend(get_data(data))
print(result)
if check_fun:
answer= eval(check_fun)(result)
else:
answer=eval(check)(result)
print(answer)
if __name__ == "__main__":
get_data(get_res, 'sum')
得出结果,浏览器验证答案正确,分析结束。