微信小程序反编译:解包wxapkg还原wxml和js完整流程
为什么要反编译小程序上周要逆向一个商业小程序的接口加密逻辑,没源码,只能从手机里把包抠出来反编译。微信小程序的包是wxapkg格式,加密加压缩,直接解压不行。记一下完整流程,从抓包到还原wxml。
[*]找包:Android手机root后,小程序包在 /data/data/com.tencent.mm/MicroMsg/<userhash>/app/pkg/,文件名_xxx_.wxapkg。没root用模拟器,雷电9系自带root。
[*]解密:wxapkg用的是V1加密时整个文件异或一个固定密钥,V2则前1023字节异或、后面用AES-128-CBC。用wxapkg-tools解V2,命令 wxapkg.py unpack -i input.wxapkg -o out_dir。
[*]还原:解密后得到app-service.js和page-frame.html。wxml被编译进了js,要用wcc反编译回wxml。一个叫wxappUnpacker的项目能批量还原。
[*]看接口:在app-service.js里搜 wx.request,所有接口URL和参数都明文,加密函数也能找到调用入口。
几个坑
第一个坑是包版本。微信8.0.40之后小程序包是V2格式,老的unpacker只支持V1,要找支持V2的fork。第二个坑是分包,主包加多个分包,分包在.wxapkg之外还有单独的子包,要全抓。第三个坑是wxml反编译不是百分百还原,事件绑定和wx:if的层级会丢,要对着js手动补。
# 解密加解包一条龙
python wxapkg.py unpack -i _112233_.wxapkg -o ./out
# 还原wxml
node wcc ./out/app-service.js > app-service.wxml
# 找接口
grep -rn "wx.request" ./out
grep -rn "sign\|encrypt\|token" ./out
反编译完的js用VS Code格式化一下,配合sourcemap能恢复到接近原始结构。我做的小程序最后在app-service.js第3800行找到了加密入口——sign函数是MD5(参数排序加时间戳加salt),salt硬编码在前端,30分钟搞完。
https://www.metk.cn/img/posts/wechat_miniprogram_decompile.jpg 我了个去,顶了 这类活很吃经验,工具只是辅助。 这类技术更新的频率很高,老教程参考价值有限。这套思路对其他 App 通用吗? App 侧的安全基本靠客户端自觉,服务端校验才是最后一道。 反调试这块的坑最多,建议先把常见检测点列一遍。你们环境是怎么解决版本兼容的? 通信协议那层如果能抓到明文,能省掉大量逆向工作。 现在的防护思路是增加时间成本,让你算不过来。这类分析一般要多久能出结果? 建议把分析过程记录下来,下次遇到类似的能省一半时间。你们环境是怎么解决版本兼容的? 混淆只能提高门槛,不能真正阻止有心人。有没有推荐的入门资料?