微信小程序“反编译”实战(一):解包

2020 年 3 月 22 日

微信小程序“反编译”实战(一):解包

我们知道,在微信开发者工具中开发完小程序后,点击“上传”按钮,微信开发者工具会进行“编译”,对 JS 代码进行压缩混淆以及对 wxmlwxss 和资源文件等进行整合打包成一个 .wxapkg文件上传给微信服务器。所以要“反编译”小程序,首先要获取到小程序对应的.wxapkg 包。我们从手机端入手,在手机上找到微信客户端下载保存在本地的小程序包。


获取小程序的 .wxapkg 文件


工具:一台已越狱的 iPhone 手机或者已 Root 的 Android 手机,本文以 iPhone 4S, iOS 8.4.1 为例,微信版本 v6.6.6。在已越狱的 iPhone 上打开 Cydia,搜索并安装iFile 或者 Filza等文件浏览 App,打开 iFile 或者 Filza,跳转到本地 App 安装目录:/var/mobile/Containers/Data/Application/,此时,你可以看到当 iPhone 上已安装的 App 列表,如下图所示:



找到“微信”的目录(我手机上对应的是:297286CE-9055-400A-99FA-D2D7C0735DCF 文件夹),点击进入,即为微信在此 iPhone 上的“沙盒”(Sandbox),相信 iOS 开发者对此目录已经非常熟悉了,该目录下主要有


DocumentsLibrarytmp 等文件夹,通常用于存放不同的数据和文件,这里不再赘述。我们在当前微信“沙盒”目录中搜索wxapkg 关键字,即可找到当前 iPhone 中微信已下载的小程序包,如下:



我们发现搜索到的 .wxapkg 文件名都是以数字命名的,如图中的


2.wxapkg25.wxapkg,它们的命名有什么规则呢?又放在哪呢?接着往下看。经过简单分析我们发现,微信下载的小程序包存放在以下目录:


/path/to/WeiChat SandBox/Library/WechatPrivate/{UserId}/WeApp/LocalCache/release/
复制代码


其中,{UserId}为当前登录的微信账号 Id 的 MD5 值(32 位字符串),例如我手机上小程序包存放的完整目录为:


/var/mobile/Containers/Data/Application/297286CE-9055-400A-99FA-D2D7C0735DCF/Library/WechatPrivate/c15d9cced65acecd30d2d6522df2f973/WeApp/LocalCache/release/
复制代码


该目录的内容如下图所示:



目录中有一系列以 wx...开头的文件夹,这些 wx… 的 18 位字符串即为每个小程序对应的 AppId,在每个 wx… 文件夹中都放着当前小程序对应的 .wxapkg 包,它以数字命名,数字代表着当前包为开发者第几次发布的(它与开发者在发布小程序时指定的版本号是不同的),例如我们的“知识小集”小程序一共发布了两个版本,所以wx48...85db文件中存放有2.wxapkg文件:



另外,我们发现,在 iOS 上,微信也为每个小程序分配了一个 Sandbox文件夹用于管理小程序在本地存储的数据和文件,如图:



其路径为:


/path/to/WeiChat SandBox/Library/WechatPrivate/{UserId}/WeApp/Sandbox/wx...(小程序 AppId)
复制代码


By The Way,Android 手机上小程序包的存放目录为(需 Root 权限才能访问):


/data/data/com.tencent.mm/MicroMsg/{UserId}/appbrand/pkg/
复制代码


拷贝 .wxapkg 文件到电脑上


通过上述分析,我们可以知道到小程序的压缩包 .wxapkg 存放在哪,接下来需要将手机上的.wxapkg 文件拷贝到电脑上。


在 iPhone 上打开Cydia搜索并安装OpenSSH 后,在iPhone > 设置 > 无线局域网中查看你当前手机连接的 WiFi,并记录 IP 地址,例如我的为:192.168.1.17,然后在你的 Mac 电脑上打开终端(与 iPhone 连接同一 WiFi),就可以通过 SSH 登录到你的手机上了(具体的细节详见 Cydia 上 OpenSSH 下载页面的使用说明):


ssh root@192.168.1.17
复制代码


接下来就可以通过 scp 命令从 iPhone 上拷贝文件到我们的电脑上了,例如,在我的 Mac 上的命令行里执行(不需要ssh 登录到 iPhone 上,直接在 Mac 的终端上执行):


scp root@192.168.1.17:/var/mobile/Containers/Data/Application/297286CE-9055-400A-99FA-D2D7C0735DCF/Library/WechatPrivate/c15d9cced65acecd30d2d6522df2f973/WeApp/LocalCache/release/wx48...85db/2.wxapkg /Users/Zubin/Desktop/WeApp/
复制代码


就可以把“知识小集”小程序的包2.wxapkg 拷贝到 Mac 桌面上的 WeApp 文件夹中了。


当然,如果你的电脑有安装 iTool 或者 PP 助手 之类的工具,当连接已越狱的 iPhone 好像可以直接访问手机上的目录和文件,可能就不用这么麻烦了(未验证)。


.wxapkg 解包


上述费了很大周折终于拿到每个小程序的.wxapkg 包,接下来可以对它进行分析了。首先.wxapkg 文件到底是什么呢?你可能会认为它就是类似 Android 的.apk 或者 iOS 的.ipa 安装包,本质上是一个 .zip 压缩包?其实不是的!,它是一个二进制文件,实际的文件结构如下图:



图片取自文章 微信小程序源码阅读笔记


http://lrdcq.com/me/read.php/66.htm,同时此文章的作者也提供了解包的脚本(各种语言的)放在了 GitHub


https://github.com/leo9960/wechat-app-unpack 上:



我下载了 Python 2 的解包脚本,与 .wxapkg文件放在一个目录,然后在命令行里执行如下命名即可得到解包后的文件:


python unwxapkg.py 2.wxapkg
复制代码


以“知识小集”小程序为例,解包后得到的文件目录如下(已经基本与我开发“知识小集”小程序的工程目录一致了):



每个小程序解包后的文件都大同小异,主要包含如下文件:


  • app-service.js:小程序工程中所有 JS 文件的汇总,已被混淆;

  • app-config.json: 小程序工程 app.json 以及各个页面的 JSON 配置文件汇总,可直接查看;

  • page-frame.html: 所有页面的 .wxmlapp.wxss 样式文件的汇总,可读性差,需要还原;

  • *.html: 包含每个页面对应的 .wxss 信息,可读性较好;

  • 资源文件: 各类图片、音频等资源文件;


总结


本文主要介绍了如何获取小程序的.wxapkg包文件,以及如何解包获得小程序“编译”混淆后的代码和资源文件。在下一篇文章《微信小程序“反编译”实战(二):源码还原》将介绍如何将.wxapkg 包内内容还原为"编译"前的内容。


参考链接


  • 看雪论坛:

  • https://bbs.pediy.com/thread-225289.htm

  • V2EX: https://www.v2ex.com/t/419056

  • GitHub: https://github.com/leo9960/wechat-app-unpack


2020 年 3 月 22 日 21:041976

评论

发布
暂无评论
发现更多内容

盘点2020 | 一个三线程序员的2020年,不卑不亢

沉默王二

程序员 盘点2020 沉默王二

The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

wood

eclipse

微软商店报错:0x80131500

wood

建议收藏,mybatis插件原理详解

田维常

mybatis

DAPP软件系统开发

开發I852946OIIO

系统开发

重点人员管理系统开发,重点人情报预警管控平台建设

WX13823153201

重点人员管理系统开发

边缘计算和5G:我们从何而来?

VoltDB

云计算 大数据 5G 物联网 边缘计算

zh-cn:子主题-wordpress

wood

WordPress

复盘node项目中遇到的13+常见问题和解决方案

徐小夕

Java node.js 前端 nodejs

微软最强 Python 自动化工具开源了!不用写一行代码!

星安果

Python 开源 自动化 工具 高效率

PC端怎么更改iCloudDrive目录位置?

wood

不装鲁大师怎么查看自己主板型号

wood

win10看不到局域网电脑,无法连接打印机

wood

盘点2020|多线程的遥感大数据行业产品经历

老壳有点爽

盘点2020 遥感大数据 InSAR

全部卸载office

wood

Tufin联合Cisco,将网络安全自动化进行到底

Geek_448e23

网络安全 自动化管理 云安全

架构师训练营 1 期 -- 第十三周总结

曾彪彪

极客大学架构师训练营

PostgreSQL高可用:多主复制解决方案

PostgreSQLChina

数据库 postgresql 开源

安装Centos7时提示 /dev/root does not exits

wood

测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》

清菡

测试开发

对于传统供热系统来说,转型智慧供热需要哪些条件?

一只数据鲸鱼

物联网 数据可视化 供暖系统 3D

wordpress后台的目录编辑页和标签页无法访问

wood

《O2O实战:他们是如何利用互联网的》.pdf

田维常

互联网

波场链智能合约软件系统开发|波场链智能合约APP开发

开發I852946OIIO

系统开发

盘点2020 | 微服务架构下该如何技术选型呢?

xcbeyond

微服务架构 技术选型 盘点2020 选型原则

警务通APP系统开发,移动警务平台搭建解决方案

t13823115967

智慧城市

智能微卡口监控系统搭建,智慧平安小区建设解决方案

t13823115967

智慧城市

5张图搞懂Java引用拷贝、深拷贝、浅拷贝

bigsai

Java 浅拷贝和深拷贝

一个服务器部署多个wordpress,500报错等等宝塔的设置

wood

安全管理 | 前后端方案详解:Vue/SpringBoot+SpringSecurity+JWT

梁龙先森

前端 springboot springsecurity JWT 七日更

架构师训练营第 1 期第 13 周作业

业哥

微信小程序“反编译”实战(一):解包-InfoQ