反编译&调试小程序请求签名
2023-9-2 20:48:46 Author: 猪猪谈安全(查看原文) 阅读量:48 收藏

点击蓝字

关注我们

声明

本文作者:keac&catw0rld

本文字数:2507字

阅读时长:约10分钟

附件/链接:点击查看原文下载

本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,狼组安全团队以及文章作者不为此承担任何责任。

狼组安全团队有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经狼组安全团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

前言

大半夜的师傅 catw0rld 师傅找到我问怎么调试小程序,之前只调试过一些网页版的混淆代码,于是就和师傅一起研究就有了今天的文章

团队正在招新中!点击团队招人计划查看~


反编译

使用安卓模拟器挂微信找小程序包脱出来解包的操作太繁琐了,这里推荐两种方法

MAC PC端微信

使用现有工具(https://github.com/TinyNiko/mac_wxapkg_decrypt) 采用github提到的第一种解密方法首先需要安装frida

更新pip
python3 -m pip install --upgrade pip

安装frida
pip3 install frida

安装frida-tools
pip3 install frida-tools

检测是否安装成功然后就可以跟着步骤开始解密小程序包了 小程序包根路径

/Users/你的用户/Library/Group Containers/xxx.com.tencent.xinWeChat/Library/Caches/xinWeChat

先删除原有小程序包文件夹,后续使用mac pc端微信打开小程序此处会重新生成包的文件夹,方便辨认此时再使用pc端打开需要反编译的小程序即可看见此目录下生成了小程序包文件夹 一路跟进去找到包的绝对路径

/Users/用户/Library/Group Containers/xxxxxxx.com.tencent.xinWeChat/Library/Caches/xinWeChat/打开小程序生成的文件夹/WeApp/LocalCache/release/xxxxx/4.wxapkg

复制绝对路径,修改_agent.js中两处路径然后开始解密,挂着小程序看下进程中所对应的pid任意一个都可以,运行后会在_agent.js自定义文件处生成解密后的小程序包 接下来就是正常解包操作

Windows PC端微信

也是已经有师傅写好解密小程序包的工具了(https://github.com/BlackTrace/pc_wxapkg_decrypt) 找到微信小程序包所在根路径

C:\WeChat Files\Applet\

此处我是虚拟机微信修改了文件路径的,应该是可以在设置处查看微信文件路径把wx字符串开头的文件夹删除,方便后续定位需要反编译的小程序包路径 然后打开小程序 Applet文件夹下即生成小程序文件夹跟进文件夹获取加密小程序包(APP.wxapkg),复制绝对路径,使用工具解密即可 wxid即之前小程序文件夹名称 解密成功后会在工具同级目录下生成dec.wxapkg最后正常使用unpacker解包

调试

解决报错

师傅反编译完拿到的是这么一个压缩包,可以看到完整的微信小程序的结构都在https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html下载安装好后选择导入项目

到现在为止还是非常简单的,然后看到console还有报错提示,把报错的修复了就好了。我们来看看几个报错 unknown: Identifier 'e' has already been declared. 意思就是变量已经被创建了,可能在反编译的时候出问题了打开对应的js文件,ctrl+g 输入行号快速跳转

这段跟我们需要调试的代码没有直接关系,直接注释掉即可

再来看下面的报错,VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL is not defined 可以看到是在 es6-promise.js? [sm]:196 的报错,显示变量没有定义

定位看下函数,应该是VM2的报错提示,我们也直接注释掉

修改完之后保存再点下编译排除了报错之后,小程序可以正常打开请求了,基本上遇到报错注释或者引入对应库解决,修改名字。

调试签名

本次要解决的是_sign的问题通过搜索代码可发现一段疑似计算签名的地方我们在调试器中定位下代码位置,选择sources,点到appContext点击行号打上断点,重新请求看看会不会在此处暂停可看到已经正常的断点到这个位置了

第一个按钮(F8):断点间调试 

第二个按钮(F10):单步调试 

第三个按钮(F11):进入函数 

第四个按钮(shift+F11):离开函数 

第五个按钮(ctrl+F8):取消全部断点

断点到了对应的位置就可以在console里面输入方法信息进行查看,鼠标移动到对应变量上可以看到对应的值 从这段代码调试可以看出是把appid等什么的信息,变量名加值排序再拼接,最后加上一些其他的参数md5后结果 

这时候就可以根据具体的函数写脚本进行调试,这里推荐直接使用js,复制粘贴代码下来可以直接自动化跑。

比如在这种的复杂js场景下,使用Golang直接调用js代码解析

后记

其实结合jsEncrtpter也可以写出对应的算法脚本,跑起来进行爆破 放个python的调用js案例

import execjs 

ctx = execjs.compile(""" 
function add(x, y) { 
 return x + y; 

"""
\) 

print(ctx.call("add", 12)) 

作者

catw0rld

不日新者必日退

扫描关注公众号回复加群

和师傅们一起讨论研究~

WgpSec狼组安全团队

微信号:wgpsec

Twitter:@wgpsec

 点击下方小卡片或扫描下方二维码观看更多技术文章

师傅们点赞、转发、在看就是最大的支持


文章来源: http://mp.weixin.qq.com/s?__biz=MzIyMDAwMjkzNg==&mid=2247511894&idx=1&sn=1a506774b4bf24427da111fb3e43fab8&chksm=97d04041a0a7c957a9318a9e2771bc4f97b5a2a3f8b53e17cba4932c53142c71cfd29b986fa8&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh