python爬虫 - js逆向之猿人学第十五题wasm
前言
不多说啊,继续猿人学的
分析
打开网站,然后接口也是很轻易的就拿到了
点开某个接口看请求参数:
这个m这次有点不一样啊,怎么找生成逻辑?还是搜竖线,那估计又会卡住,还是看调用栈吧,稳当一点:
关键点
唉,不点不知道,一点就知道逻辑了:
相信都搞到这个地步的老哥们,除了wasm可能看起来有点懵,后面的js代码基本门儿清对吧,那这个wasm又是个啥东西,查下资料
https://www.zhihu.com/question/304577684/answer/544879503
WebAssembly 就是运行在 Web 平台上的 Assembly。
Assembly 是指汇编代码,是直接操作 CPU 的指令代码,比如 x86 指令集上的汇编代码有指令集、寄存器、栈等等设计,CPU 根据汇编代码的指导进行运算。汇编代码相当于 CPU 执行的机器码能够转换成的人类适合读的一种语言。
一个典型的编译执行链路是 Cpp、Rust 等编译型语言编译成汇编指令,再转换成二进制机器码由 CPU 读取。
其他例如 Java、Python 等语言是使用运行在 x86 一类的通用硬件指令集的虚拟机,再执行自己的“汇编语言”(例如 Java Bytecode)。
Web 平台在浏览器上是类似于 Java、Python 的虚拟机环境,浏览器提供虚拟机环境执行一些 JavaScript 或者其他脚本语言。
WebAssembly 可以看做是 Web 平台的 x86 硬件通用指令集,作为一层中间语言,上层对接 Java、Python、Rust、Cpp,让这些语言都能编译成统一的格式,用于 Web 平台运行。
在目前情况下,WebAssembly 在使用中可以取代部分 JavaScript 代码执行更高效的 CPU 计算程序。
反正你就理解成,另一个种语言就完了,然后可以替代js做点事,回到代码这里,看这段:
这种写法,确实看着有点像ajax的写法,大概的意思就是需要一个wasm的二进制文件,然后就可以调用wasm的一些方法,最后输出我们想输出的字段
那行,这个不用多研究,那我们python里怎么实现这种写法呢?
然后刚才筛选接口的时候确实有个wasm的请求:
找了一圈啊,找到个第三方库,pywasm
官方介绍:https://pypi.org/project/pywasm/
那怎么用呢?反正就是需要一个wasm的二进制文件,然后就可以调用wasm的一些方法,最后输出我们想输出的字段,刚好对应上上面那段逻辑,OK,直接来吧,不墨迹了
先把接口的那个wasm的文件下载下来,然后调用下那段js看能用不
import math
import random
import time
import pywasm
def main():
t = int(time.time())
t1 = int(t / 2)
t2 = int(t / 2 - math.floor(random.random() * 50 + 1))
vm = pywasm.load("./main.wasm")
result = vm.exec("encode", [t1, t2])
print(result)
print(str(result) + '|' + str(t1) + '|' + str(t2))
return result
main()
执行:
至少看着像那么回事,也不知道具体怎么样,看后面的代码实现吧
python代码实现
import math
import random
import time
import pywasm
import requests
headers = {
'accept': 'application/json, text/javascript, */*; q=0.01',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'pragma': 'no-cache',
'user-agent': 'yuanrenxue.project',
'x-requested-with': 'XMLHttpRequest',
'cookie': 'sessionid=换成你的'
}
def get_m():
t = int(time.time())
t1 = int(t / 2)
t2 = int(t / 2 - math.floor(random.random() * 50 + 1))
vm = pywasm.load("./main.wasm")
result = vm.exec("encode", [t1, t2])
print(str(result) + '|' + str(t1) + '|' + str(t2))
return str(result) + '|' + str(t1) + '|' + str(t2)
def fetch(page):
m = get_m()
m = m.replace('|','%7C')
url = f'https://match.yuanrenxue.com/api/match/15?m={m}&page={page}'
req = requests.get(url,headers=headers)
res = req.json()
data = res.get('data')
data = [temp.get('value') for temp in data]
print('temp', data)
return data
def get_answer():
sum_number = 0
for i in range(1,6):
cont = fetch(i)
sum_number += sum(cont)
print('答案:', sum_number)
get_answer()
执行:
提交答案:
完美
结语
这个主要就是看你搞没搞过wasm了,don't say so much