wasm 调试说明文档¶
1. 前提准备¶
调试前准备如下:
java
环境,配置好jdk
jeb
:用来反编译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 交互的一些方法,需要看下文中的前提部分给出的官方文档。