本实践教程将一步步告诉你如何“反编译”获得其它小程序的源代码,包括“解包”和“源码还原”两篇,主要参考了看雪论坛、V2EX、GitHub 等网站上的帖子、教程、工具,在此不胜感激,参考链接详见文章底部,以及加上了我自己的一些理解和总结。
知识小集是一个团队公众号,每周都会有 原创 文章分享,我们的文章都会在公众号首发。欢迎关注查看更多内容。
我们知道,在微信开发者工具中开发完小程序后,我们点击“上传”按钮,微信开发者工具会进行“编译”,对 JS 代码进行压缩混淆以及对
wxml
、
wxss
和资源文件等进行整合打包成一个
.wxapkg
文件上传给微信服务器。
所以要“反编译”小程序,首先我们要获取到小程序对应的
.wxapkg
包。
之前在 V2EX 上有一篇文章
https://www.v2ex.com/t/419056
介绍了如何通过某 URL 直接下载每个小程序的
.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
开发者对此目录已经非常熟悉了,该目录下主要有
Documents
、
Library
和
tmp
等文件夹,通常用于存放不同的数据和文件,这里不再赘述。我们在当前微信“沙盒”目录中搜索
wxapkg
关键字,即可找到当前
iPhone
中微信已下载的小程序包,如下图:
我们发现搜索到的
.wxapkg
文件名都是以数字命名的,如图中的
2.wxapkg
和
25.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 [email protected]
接下来我们就可以通过
scp
命令从
iPhone
上拷贝文件到我们的电脑上了,例如,在我的
Mac
上的命令行里执行(不需要
ssh
登录到
iPhone
上,直接在
Mac
的终端上执行):
scp [email protected]:/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
文件夹中了。