网页逆向-wasm逆向实例

wasm介绍

wasm是什么

WebAssembly(简称Wasm)是一种二进制指令集格式,设计目标不是为了手写代码,而是为诸如C、C++和Rust等低级源语言提供一个高效的编译目标。它能够在所有当代桌面浏览器及很多移动浏览器中以接近本地的速度运行,用于在web客户端和服务端部署编程语言程序。WebAssembly的出现解决了JavaScript的性能问题,尤其在各种图形处理方面。同时,对于网络平台而言,这意味着客户端app可以在网络平台上以接近本地速度的方式运行多种语言编写的代码,这在过去是无法实现的。

浏览器是怎么去调用wasm的

浏览器调用WebAssembly代码需要以下步骤:

加载WebAssembly模块:浏览器通过Ajax或fetch API等方式获取到WebAssembly二进制代码,然后使用WebAssembly的API将其编译成内存中的模块。

实例化WebAssembly模块:浏览器使用WebAssembly模块创建一个新的实例对象,该对象包含了所有在模块中定义的函数和变量。

调用WebAssembly函数:浏览器可以通过实例对象来调用WebAssembly函数,并将参数传递给它们。这些函数可以访问实例对象中的变量和内存。

处理结果:当WebAssembly函数执行完毕后,它会将结果返回给JavaScript代码。浏览器可以使用JavaScript来处理这些结果,例如更新UI或发送网络请求等。需要注意的是,由于WebAssembly是一种低级语言,因此它不能直接与JavaScript交互。为了实现这一点,WebAssembly提供了一些导出函数,可以将C/C++/Rust等语言编写的函数导出为WebAssembly可调用的函数。这样JavaScript就可以通过WebAssembly的API来调用这些导出函数了。

逆向中要怎么去调用wasm函数

不去管wasm,扣上层加载wasm的代码

实战逆向

针对https://www.599.com/live/网站,先hook下cookie的生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(function () {
const originalCookieDescriptor = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') ||
Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie');

Object.defineProperty(document, 'cookie', {
configurable: true,
enumerable: true,

get: function () {
const value = originalCookieDescriptor.get.call(document);
console.log('[cookie GET]', value);
return value;
},

set: function (val) {
console.log('[cookie SET]', val);
console.trace(); // 打印堆栈
originalCookieDescriptor.set.call(document, val);
}
});
})();

然后定位到生成的地方

这里x的值是'ads-tracker-baidu=zOZSv5lzsPgC6pgcU9vbOqBd4wLIexxYoVycbGJUcgp8wqEeELpX0yfs;domain=.599.com;path=/',这个属性值的生成逻辑就是我们要做的

生成是在const x = unboxValue(x_ref);这里,x_ref的值是9221120245631025198n,x_ref的值要看上层堆栈函数,进入上层堆栈函数,发现进到wasm里面去了

再继续往上跟函数,跳过wasm里面

继续往上,要找到加载wasm文件的地方

扣代码的话就把

1
2
const t = new Go;
WebAssembly.instantiateStreaming(fetch("https://video-decoer.oss-accelerate.aliyuncs.com/mpeg-decode/v8a/decode-u8.wasm"), t.importObject).then(e => t.run(e.instance))

和Go那里的js给一起扣下来就行了,然后补环境,之后可以在代码中hook到cookie的生成