【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

admin 2025年6月9日16:54:43评论9 views字数 3170阅读10分34秒阅读模式

不自量力地还手,直至死方休。——《山丘》

[原创]【银行逆向百例】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/
【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

2、注入WechatOpenDevTools-Python打开控制台

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

03

解密函数

3、控制台输出调试语句日志,跟进secretRequestData 

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

4、跟调用堆栈

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

5、搜索decrypt关键字定位到解密函数

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

6、e是密文,t是密钥,n是undefined,不用n也可以,h(e, t, 0)得到明文

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

7、小程序使用globalThis将h解密,t密钥,n导出到全局

globalThis.h = h;

globalThis.t = t;

globalThis.n = n;

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

04

配置JsRpc

8、取消断点,注入JsRpc环境,注意用WeChat小程序版本

https://github.com/jxhczhl/JsRpc/blob/main/resouces/WeChat_Dev.js
【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

9、开启JsRpc,连接通信

var demo = new Hlclient("ws://192.168.14.158:12080/ws?group=zzz");
【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

10、注册解密方法,param参数即传入的密文,调用h(param, t, 0, n)返回明文即可

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

11、测试JsRpc正常,得到明文

http://192.168.14.158:12080/go?group=zzz&action=decrypt&param=1faxxx
【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

05

Yakit 热加载

12、以/api/v1/datasheet/get_configs为例,请求的requestData和响应的responseData是密文

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

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&param={{params(paramStr)}} HTTP/1.1Host: 192.168.14.158:12080User-Agent: Mozilla/5.0Accept: */*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&param={{params(paramStr)}} HTTP/1.1Host: 192.168.14.158:12080User-Agent: Mozilla/5.0Accept: */*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)}
【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

14、测试第一步发送验证码请求,得到明文请求响应

【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

原文始发于微信公众号(挖个洞先):【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月9日16:54:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【银行逆向百例】08小程序逆向之JsRpc+Yakit hijackSaveHTTPFlow热加载实现明文流量显示https://cn-sec.com/archives/4149951.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息