JS逆向实战:WASM逆向技巧与实战应用全解析

引言

大家好,还是原来的爬虫练习平台,本文重点讲 wasm 调用分析。

spa14

spa14 地址:https://spa14.scrape.center/

spa14 说明:

电影数据网站,数据通过 Ajax 加载,数据接口参数加密且有时间限制,加密过程通过数值型 WASM 实现,适合 WASM逆向分析。

这次不是前端渲染了,我们看下接口请求了什么数据。

image-20250127133220658

一个正常的请求分页数据的接口,只不过多了一个 sign 字段,是一个校验值,可能是一个哈希值或者加密的数据。

还是老方法,下 XHR 断点,然后翻页看下请求断在哪里。

image-20250127133418315

image-20250127133456574

我们主要关注两个地方,右上角断点的位置是不是对的,是不是在我们想要的链接上断下的,还有就是右下角的调用栈,主要观察比较可疑的函数调用,这里根据经验我推断可能的 sign 计算逻辑在 onFetchData 上。

image-20250127135058978

切换到 onFetchData 上,可以看到 e 变量就是 sign 字段的值,e 是通过 wasm 变量的 encrypt 加密得到的,查看一下入参都有什么。

image-20250127135321653

可以看到,一共两个入参,一个是 offset 字段,一个是时间戳字符串转成 int 型。现在入参有了,wasm 文件我们找一下。

image-20250127135424568找到了 wasm 文件,现在将它下载下来,连同刚才找到的加密函数和入参,我们尝试本地调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time

import pywasm
import requests
import urllib3

pywasm.log.lvl = 1
urllib3.disable_warnings()
runtime = pywasm.core.Runtime()
m = runtime.instance_from_file('Wasm.wasm')


def get_sign(offset, t):
r = runtime.invocate(m, 'encrypt', [offset, t])
print(f'fib(10) = {r[0]}')
return r[0]


def get_content():
for offset in range(0, 110):
sign = get_sign(offset, int(time.time()))
url = f'https://spa14.scrape.center/api/movie/?limit=10&offset={offset}&sign={sign}'
r = requests.get(url, verify=False).json()
print(r)


if __name__ == '__main__':
get_content()

image-20250127150257420

可以正常获取结果,说明本地调用 wasm 是成功的。

最终代码见:https://github.com/libra146/learnscrapy/tree/main/js/spa14

总结

wasm 调用起来还是比较简单的,主要是因为传参是整型的原因,如果想要传入字符串参数,就比较复杂了,下一篇文章我们来讲解如何传入字符串参数。

最后,今天是阴历二十九,算是过除夕了,在这里也祝大家蛇年大吉,新春快乐!来年继续卷哈哈哈

本文章首发于个人博客 LLLibra146’s blog

本文作者:LLLibra146

更多文章请关注公众号 (LLLibra146):LLLibra146

版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!

本文链接
https://blog.d77.xyz/archives/e6021ef1.html