微信小程序逆向一

xiao1star2025-07-29文章来源:SecHub网络安全社区


微信小程序逆向

反编译工具

Release v1.5.0 · wux1an/wxapkg · GitHub–静态分析

20250624090250532.png

GitHub - JaveleyQAQ/WeChatOpenDevTools-Python: WeChatOpenDevTool 微信小程序强制开启开发者工具–动态分析

20250624091605451.png

windows小程序目录位置

点击设置->文件管理

20250624085128474.png

打开文件夹->来到上级目录的Applet文件中

该文件中就存放着我们的小程序

20250624085247250.png

工具使用

现在已经知道了小程序存储的位置了,让我们开始逆向吧

我们打开一个游戏的小程序

20250624085659744.png

可以看到在文件夹中生成了3个文件,主要的是wx+数字的文件夹

20250624085805089.png

20250624090010576.png

在我们的反编译工具的目录下打开cmd输入

wxapkg_1.5.0_windows_amd64.exe scan

对我们本地的小程序文件进行扫描

20250624090653979.png

接着按住回车键进行反编译处理

20250624090816545.png

可以看到在反编译工具的目录下生成了一个反编译的文件夹

20250624091006257.png

接着我们可以用vs或者phpstorm文件打开,这样我们就就可以实现静态的审计

20250624091143311.png

若要实现动调可以使用WechatOpenDevTools但是要注意这个对微信的版本是有要求的,其次还容易封号所以建议使用小号测试

20250624091909642.png

如何降低微信版本

GitHub - tom-snow/wechat-windows-versions: 保存微信历史版本

20250624092648628.png

确定小程序版本,可以打开任务管理器,在如下图这个位置

20250624092226801.png

右键选择打开文件所在位置,可以看到我们的是13639

20250624092336628.png

看起来是不符合的,那么我们可以先将微信版本降低之后再操作,如何微信小程序的版本不是符合工具的版本的话。,可以先退出微信,然后把高版本的文件夹删除再次测试

20250624094220855.png

接着开启小程序之后,在工具的文件夹中打开cmd,然后输入

WechatOpenDevTools-Python.exe -x

20250624094515475.png

接着点击小程序的右上角的三个点出现一个DevTools工具

20250624094600428.png

打开即可进行动调

20250624094938379.png

实战分析–小程序加解密

现在我们以某个小程序为例来进行分析

20250624122705985.png

首先是对其进行反编译获取其源码

20250624122742412.png

接着我们对其进行抓包处理

如何不知道如何抓取小程序的包,可以参考如下视频

https://www.bilibili.com/video/BV14h4y1A7Ti?vd_source=f20e7e8fc9017bb82c08ed10fbef44a3

20250624122915164.png

可以看到其路由为/gateway/sso/bbs/Admin/SysNews/ClientSysNews,我们直接在源码中搜索ClientSysNews即可,定位到在app-service.js

20250624123145309.png

我们还可以看到有一个json的参数,我们直接搜索这json:即可

我们发现共有6处、在这里就都演示出来了,其中有一处是请求数据的(我们要找的地方)、一处是文件上传的、剩余的json参数的值都为空

20250624123453020.png

此处就是我们要找的地方但是我们无法直接分析出他是如何加解密的

20250624123836924.png

我们就可以使用动调了实现,使用前面介绍的工具即可,先是network->Initiator,可以看到这里又有页面所使用的代码,由于我们无法通过名称直接看出具体在哪里,所以只能挨着看

20250624124153836.png

最终成功找到了指定的代码

20250624124659161.png

接着就打上断点,看看其加密过程,可以看到在这里我们的数据是加密的我们就依次往上看

20250624124837431.png

可以看到在这个位置我们数据还是未加密的状态

20250624125132552.png

再到下一步就可以看到数据加密了

20250624125329047.png

,可以确定 e.data = o.default.BaseConfig().PWDDATA_json + s.JS0N.stringify(e.data, f).toString()这一段就是加密的

接着我们跟进去,来到如下图所示可以看到参数t是我们的加密数据,通过调用stringify方法来完成加密的

20250624125619397.png

有了加密其解密其实就在其下面

20250624131438915.png

后来本想写一个脚本实现这个加密过程但是奈何能力有限无法实现,但是我们可以通过控制台来对数据进行加解密操作

o.default.BaseConfig().PWDDATA_json + s.JS0N.stringify('要加密的数据', f).toString()

成功加密

20250624131306886.png

解密数据

JSON.parse(s.JS0N.parse("要解密的数据".split(o.default.BaseConfig().PWDDATA_json)[1], f).toString(s.enc.Utf8))

20250624130724709.png

成功解码出来

接着我们对加密数据进行修改,然后进行加密

o.default.BaseConfig().PWDDATA_json + s.JS0N.stringify('{"TimeStamp":"","iPageSize":10,"pageIndex":0,"bIsPage":true,"DBSrc":"100","Opt":"Detail","No":"230810164513927532","OrgNo":"00110001","DCode":"ascasc"}', f).toString()

20250624132334646.png

将加密的数据放到burp中成功得到回显

20250624132425058.png

接着将回显的数据进行解密操作,解密数据如下

20250624132425058.png