“不自量力地还手,直至死方休。——《山丘》”
[原创]【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示
https://bbs.kanxue.com/thread-287164.htm
01
—
环境版本
环境:
电脑,Windows 10 专业版 23H2
软件:
Yakit,v1.4.1-0606
微信,Windows 3.9.10.19
WeChatOpenDevTools-Python,0.3.2
02
—
操作步骤
1、Yakit抓包请求响应加密
https://www.yaklang.com/
2、注入WechatOpenDevTools-Python打开控制台
03
—
解密函数
3、控制台输出调试语句日志,跟进secretRequestData
4、跟调用堆栈
5、搜索decrypt关键字定位到解密函数
6、e是密文,t是密钥,n是undefined,不用n也可以,h(e, t, 0)得到明文
7、小程序使用globalThis将h解密,t密钥,n导出到全局
globalThis.h = h;
globalThis.t = t;
globalThis.n = n;
04
—
配置JsRpc
8、取消断点,注入JsRpc环境,注意用WeChat小程序版本
https://github.com/jxhczhl/JsRpc/blob/main/resouces/WeChat_Dev.js
9、开启JsRpc,连接通信
var demo = new Hlclient("ws://192.168.14.158:12080/ws?group=zzz");
10、注册解密方法,param参数即传入的密文,调用h(param, t, 0, n)返回明文即可
11、测试JsRpc正常,得到明文
http://192.168.14.158:12080/go?group=zzz&action=decrypt¶m=1faxxx
05
—
Yakit 热加载
12、以/api/v1/datasheet/get_configs为例,请求的requestData和响应的responseData是密文
13、目前需求是查看明文数据包不做修改,所以使用hijackSaveHTTPFlow在发送请求之后,数据包存入数据库之前调用JsRpc获取明文替换requestData和responseData,这样所有数据包就显示为明文且不影响请求
hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) {
req = str.Unquote(flow.Request)~
rsp = str.Unquote(flow.Response)~
// ================================
// 解密 requestData
// ================================
if str.Contains(req, ""requestData":"") {
parts := str.Split(req, ""requestData":"")
if len(parts) >= 2 {
encPart := parts[1]
encValue := str.Split(encPart, """)[0]
// 发送解密请求
rsp2, req2 = poc.HTTP(`GET /go?group=zzz&action=decrypt¶m={{params(paramStr)}} HTTP/1.1
Host: 192.168.14.158:12080
User-Agent: Mozilla/5.0
Accept: */*
Connection: close
`, poc.params({
"paramStr": encValue,
}))~
rspIns2 = poc.ParseBytesToHTTPResponse(rsp2)~
body2 = io.ReadAll(rspIns2.Body)~
// 提取明文
parts2 := str.Split(body2, ""data":"")
if len(parts2) >= 2 {
dataPart2 := parts2[1]
dataEnd := str.Split(dataPart2, "","group"")[0]
plainData := str.ReplaceAll(dataEnd, "\", "")
req = str.ReplaceAll(req, encValue, plainData)
}
}
}
// ================================
// 解密 responseData
// ================================
if str.Contains(rsp, ""responseData":"") {
parts := str.Split(rsp, ""responseData":"")
if len(parts) >= 2 {
encPart := parts[1]
encValue := str.Split(encPart, """)[0]
// 发送解密请求
rsp2, req2 = poc.HTTP(`GET /go?group=zzz&action=decrypt¶m={{params(paramStr)}} HTTP/1.1
Host: 192.168.14.158:12080
User-Agent: Mozilla/5.0
Accept: */*
Connection: close
`, poc.params({
"paramStr": encValue,
}))~
rspIns2 = poc.ParseBytesToHTTPResponse(rsp2)~
body2 = io.ReadAll(rspIns2.Body)~
// 提取明文
parts2 := str.Split(body2, ""data":"")
if len(parts2) >= 2 {
dataPart2 := parts2[1]
dataEnd := str.Split(dataPart2, "","group"")[0]
plainData := str.ReplaceAll(dataEnd, "\", "")
rsp = str.ReplaceAll(rsp, encValue, plainData)
}
}
}
// 写回并保存入库
flow.Request = str.Quote(req)
flow.Response = str.Quote(rsp)
flow.AddTag("decrypted")
modify(flow)
}
14、测试第一步发送验证码请求,得到明文请求响应
原文始发于微信公众号(挖个洞先):【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论