前言
大半夜的师傅 catw0rld 师傅找到我问怎么调试小程序,之前只调试过一些网页版的混淆代码,于是就和师傅一起研究就有了今天的文章
使用安卓模拟器挂微信找小程序包脱出来解包的操作太繁琐了,这里推荐两种方法 使用现有工具(https://github.com/TinyNiko/mac_wxapkg_decrypt) 采用github提到的第一种解密方法 安装frida 安装frida-tools 检测是否安装成功 先删除原有小程序包文件夹,后续使用mac pc端微信打开小程序此处会重新生成包的文件夹,方便辨认 复制绝对路径,修改_agent.js中两处路径
也是已经有师傅写好解密小程序包的工具了(https://github.com/BlackTrace/pc_wxapkg_decrypt) 找到微信小程序包所在根路径 此处我是虚拟机微信修改了文件路径的,应该是可以在设置处查看微信文件路径 师傅反编译完拿到的是这么一个压缩包,可以看到完整的微信小程序的结构都在 到现在为止还是非常简单的,然后看到console还有报错提示,把报错的修复了就好了。 这段跟我们需要调试的代码没有直接关系,直接注释掉即可 再来看下面的报错,VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL is not defined 可以看到是在 es6-promise.js? [sm]:196 的报错,显示变量没有定义
本次要解决的是_sign的问题 第一个按钮(F8):断点间调试 第二个按钮(F10):单步调试 第三个按钮(F11):进入函数 第四个按钮(shift+F11):离开函数 第五个按钮(ctrl+F8):取消全部断点
断点到了对应的位置就可以在console里面输入方法信息进行查看,鼠标移动到对应变量上可以看到对应的值 从这段代码调试可以看出是把appid等什么的信息,变量名加值排序再拼接,最后加上一些其他的参数md5后结果 这时候就可以根据具体的函数写脚本进行调试,这里推荐直接使用js,复制粘贴代码下来可以直接自动化跑。 比如在这种的复杂js场景下,使用Golang直接调用js代码解析
后记反编译
MAC PC端微信
首先需要安装frida
更新pip
python3 -m pip install --upgrade pip
pip3 install frida
pip3 install frida-tools然后就可以跟着步骤开始解密小程序包了 小程序包根路径
/Users/你的用户/Library/Group Containers/xxx.com.tencent.xinWeChat/Library/Caches/xinWeChat
此时再使用pc端打开需要反编译的小程序即可看见此目录下生成了小程序包文件夹 一路跟进去找到包的绝对路径
/Users/用户/Library/Group Containers/xxxxxxx.com.tencent.xinWeChat/Library/Caches/xinWeChat/打开小程序生成的文件夹/WeApp/LocalCache/release/xxxxx/4.wxapkg
然后开始解密,挂着小程序看下进程中所对应的pid
任意一个都可以,运行后会在_agent.js自定义文件处生成解密后的小程序包 接下来就是正常解包操作
Windows PC端微信
C:WeChat FilesApplet
把wx字符串开头的文件夹删除,方便后续定位需要反编译的小程序包路径 然后打开小程序 Applet文件夹下即生成小程序文件夹
跟进文件夹获取加密小程序包(APP.wxapkg),复制绝对路径,使用工具解密即可 wxid即之前小程序文件夹名称 解密成功后会在工具同级目录下生成dec.wxapkg
最后正常使用unpacker解包
调试
解决报错
https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
下载安装好后选择导入项目
我们来看看几个报错 unknown: Identifier 'e' has already been declared. 意思就是变量已经被创建了,可能在反编译的时候出问题了
打开对应的js文件,ctrl+g 输入行号快速跳转
定位看下函数,应该是VM2的报错提示,我们也直接注释掉
修改完之后保存再点下编译
排除了报错之后,小程序可以正常打开请求了,基本上遇到报错注释或者引入对应库解决,修改名字。
调试签名
通过搜索代码可发现一段疑似计算签名的地方
我们在调试器中定位下代码位置,选择sources,点到appContext
点击行号打上断点,重新请求看看会不会在此处暂停
可看到已经正常的断点到这个位置了
其实结合jsEncrtpter也可以写出对应的算法脚本,跑起来进行爆破 放个python的调用js案例 ctx = execjs.compile(""" print(ctx.call("add", 1, 2))import execjs
function add(x, y) {
return x + y;
}
""")
原文始发于微信公众号(猪猪谈安全):反编译&调试小程序请求签名
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论