猿人学第十五题—wasm的分析处理
1. 链接
https://match.yuanrenxue.cn/match/15
2. 抓包分析
2.1. 请求分析
只有一个m值参数
这里直接选择跟栈:
往上面一看,这就是我们想要的值:
3. 逆向分析
3.1. window.q
这个window.q有点意思,一点进去,发现是这样的!
其实这就是wasm!
3.2. wasm
什么是wasm?
WASM(WebAssembly) 是一种在浏览器中运行的 高性能、低级别的二进制代码格式,它让你可以用如 C/C++、Rust 等语言编写程序,然后编译后在网页上运行,就像 JavaScript 一样。
WASM 是让“非 JavaScript 语言”也能跑在网页上的技术,而且跑得还很快!
那么这种该如何做呢?
一般流程是:找到wasm文件,然后通过python的pywasm模块去加载这个wasm模块,然后调用里面的函数:
下载下来:
然后调用它,可以看到上面的window.q调用的是wasm里面的encode方法:
# 初始化 Runtime 实例
runtime = pywasm.core.Runtime()# 加载并实例化 WebAssembly 模块
m = runtime.instance_from_file('main.wasm')# 调用 WebAssembly 模块中的函数 'encrypt',传入参数 [100, 30]
r = runtime.invocate(m, 'encode', [t1, t2])res = r[0]
# 打印结果
print("结果:", res) # 输出应该是计算的结果
4. 完整代码
import base64
import math
import random
import re
import timeimport httpx
import pywasm
import requestsfrom CoreUtils.ua import get_random_ua
from CoreUtils.Encrypt import md5_encrypt
import execjsdef get_m():t1 = int(time.time() // 2)t2 = t1 - random.randint(1, 50)# print(tt)# 设置日志级别(可选,调试使用)pywasm.log.lvl = 0# 初始化 Runtime 实例runtime = pywasm.core.Runtime()# 加载并实例化 WebAssembly 模块m = runtime.instance_from_file('main.wasm')# 调用 WebAssembly 模块中的函数 'encrypt',传入参数 [100, 30]r = runtime.invocate(m, 'encode', [t1, t2])res = r[0]# 打印结果print("结果:", res) # 输出应该是计算的结果m = f"{res}|{t1}|{t2}"return mdef get_resp(page):ua = get_random_ua() # 假设你有这个函数tt = str(int(time.time()) * 1000)cookies = {'sessionid': '10zwpnj1ljclbht04s41inzgtnpntrzt','Hm_lvt_c99546cf032aaa5a679230de9a95c7db': '1746770541,1746776721,1746846259,1746860209','qpfccr': 'true','no-alert3': 'true','tk': '8683284781106509632','Hm_lvt_9bcbda9cbf86757998a2339a0437208e': '1746770631,1746776739,1746846273,1746860215','Hm_lpvt_9bcbda9cbf86757998a2339a0437208e': '1746865984','Hm_lpvt_c99546cf032aaa5a679230de9a95c7db': '1746866000',}headers = {'accept': 'application/json, text/javascript, */*; q=0.01','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache','pragma': 'no-cache','priority': 'u=0, i','referer': 'https://match.yuanrenxue.cn/match/15','sec-ch-ua': '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36','x-requested-with': 'XMLHttpRequest',# 'cookie': 'sessionid=10zwpnj1ljclbht04s41inzgtnpntrzt; Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1746770541,1746776721,1746846259,1746860209; qpfccr=true; no-alert3=true; tk=8683284781106509632; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1746770631,1746776739,1746846273,1746860215; yuanrenxue_cookie=1746865017|eTaV5AJKegKnKYfGQkZBz0IkEQ1Al6yot92jsrkkRDN5Z1Ffyuym4y2EChtU4GXz5KCxO8pTHSHIQHgbHlpjEUZr05GUF8FdiA80; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1746865984; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1746866000',}m = get_m()params = {'m': m,'page': page,}response = requests.get('https://match.yuanrenxue.cn/api/match/15', params=params, cookies=cookies, headers=headers)print(response.json())return response.json()def parse_data(data):nums = data['data']res = []for i in nums:res.append(i['value'])return resif __name__ == '__main__':res = []session = requests.Session()for i in range(1, 6):data = get_resp(str(i))nums = parse_data(data)res.extend(nums)print(sum(res))