wasm 调试说明文档¶
1. 前提准备¶
调试前准备如下:
java环境,配置好jdkjeb:用来反编译wasm,静态分析wasm文件。操作方式和ida类似,文中对其操作方法略过。chrome浏览器:动态调试wasm- 示例网址:猿人学第 20 题
- wasm js api 官方文档
2. 逆向步骤¶
2.1. 抓包分析¶
点击翻页请求包

此请求的简单描述如下:
-
请求方式:GET
-
请求参数:
| 字段 | 说明 | 类型 | 是否必填 | 备注 |
|---|---|---|---|---|
| page | 页码 | int | 是 | |
| sign | 签名,验签参数 | str | 是 | |
| t | 当前时间戳 | int | 是 |
- 返回结果(只介绍主要参数,其余略):
略,正常返回为 json。
2.2. js 调试¶
参数生成处:

可知,为 32 位加密方法,应该是
md5之类的,但是修改了模值或加了盐。

进入
sign方法:

简要注解:
getStringFromWasm0为读值方法,是js读取wasm中的值,具体请查看wasm js api部分;__wbindgen_malloc为申请内存操作,不重要;
我们关注
sign方法,格式如下:

注意:
retptr: 内存指针;pt0: 参数明文信息;len0: 长度,结合 getUint8Memory0 取值。

上图的
js读取wasm值的操作中,其参数在js端可直接输出,若在wasm中则需要断点查看其stack栈信息来调试输出。
进入
sign方法,我们比较关注call调用,call方法中会对参数处理,要关注call的参数及返回值。要jeb的静态分析和js动态调试相结合。

2.3. 结合 jeb 静态分析¶
下载
wasm文件,并用jeb打开,选择native下的wasmbc的反编译配置即可。


快速定位上步骤中的
js定位的sign方法所对应的wasm方法处,注意,可能js中的方法名称和jeb反编译的名称不一致。需要我们优先定位附近可精确定位的方法,再逐步分析定位至所需方法处。名称虽然可能不一致,但jeb反编译和js展示的格式结构是一致的,可辅助分析和定位。此 js 的
_index_bg_wasm__WEBPACK_IMPORTED_MODULE_0__["sign"]方法名sign在jeb中是可搜索到的,可直接定位此方法处。

反编译成伪
c代码,我们知道param1为参数明文,我们就要注意sign方法中对param1修改且返回的方法。如果我们jeb静态分析不确定当前方法是否对其修改,我们最好结合js动态调试。

先看双击
_f246查看其方法,看出其方法并没有对参数修改和重赋值及返回,查看其内部的_f207方法也是如此。

如果不确定的话就再根据栈输出信息来判断,这个方法是否重要,不再演示,输出的明文参数未变。
接下来进入
_f35对应的方法$match_twenty::sign::***中:

同样比较重视
f35的call方法,我们将每个call方法和jeb中反编译的代码一一对应。

jeb中代码对应后的结果如下,添加注释后比较好查看和定位,比较重要的是_f416和_f13方法:

可以静态分析和动态调试
_f416及_f13,其_f416运行后,并在_f13 md5前可获取其加盐后的值。

2.4. 验证结果¶
逆向简析
- 由以上调试可知,接口中的 sign 参数是由
页码|时间戳t的明文参数,拼接上D#***nxm的盐值,最后md5得到。
逆向验证:确认结果是否正确

3. 总结及补充¶
文章不算很详细,只介绍了主流程,需要自己调试下!
需要知道的事:
- jeb 的静态分析和 js 动态调试结合会提升效率,就和 app 逆向中 ida 静态分析和动态分析 so 一样;
- 文章中好多需要仔细调试和分析的并没有去截图和解释(现在图片就够多的了),只提出了比较重要的步骤和方法,其实需要自己去调试下才能够清晰明了;
- 调试 wasm 需要了解其与 js 交互的一些方法,需要看下文中的前提部分给出的官方文档。