本实践教程将一步步告诉你如何“反编译”得到其它小程序的源代码,包括“解包”和“源码还原”两篇,主要参考了看雪论坛、V2EX、GitHub 等网站上的帖子、教程、工具,在此不胜感激,参考连接详见文章底部,以及加上了我本身的一些理解和总结。php
知识小集是一个团队公众号,每周都会有原创文章分享,咱们的文章都会在公众号首发。欢迎关注查看更多内容。html
咱们知道,在微信开发者工具中开发完小程序后,咱们点击“上传”按钮,微信开发者工具会进行“编译”,对 JS 代码进行压缩混淆以及对 wxml
、wxss
和资源文件等进行整合打包成一个 .wxapkg
文件上传给微信服务器。python
因此要“反编译”小程序,首先咱们要获取到小程序对应的 .wxapkg
包。git
以前在 V2EX 上有一篇文章 https://www.v2ex.com/t/419056
介绍了如何经过某 URL 直接下载每一个小程序的 .wxapkg
,但很快被微信封了。github
所以,咱们只能从手机端入手,在手机上找到微信客户端下载保存在本地的小程序包。json
工具:一台已越狱的 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
列表,以下图所示:bash
找到“微信”的目录(我手机上对应的是: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
文件拷贝到电脑上。
在 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
文件究竟是什么呢?你可能会认为它就是相似 Android 的 .apk
或者 iOS 的 .ipa
安装包,本质上是一个 .zip
压缩包?其实不是的!,它是一个二进制文件,实际的文件结构以下图:
图片取自文章 微信小程序源码阅读笔记,同时此文章的做者也提供了解包的脚本(各类语言的)放在了 GitHub 上:
我下载了 Python 2
的解包脚本,与 .wxapkg
文件放在一个目录,而后在命令行里执行以下命名便可获得解包后的文件:
python unwxapkg.py 2.wxapkg
复制代码
以“知识小集”小程序为例,解包后获得的文件目录以下(已经基本与我开发“知识小集”小程序的工程目录一致了):
每一个小程序解包后的文件都大同小异,主要包含以下文件:
app-service.js
: 小程序工程中全部 JS 文件的汇总,已被混淆;app-config.json
: 小程序工程 app.json
以及各个页面的 JSON 配置文件汇总,可直接查看;page-frame.html
: 全部页面的 .wxml
和 app.wxss
样式文件的汇总,可读性差,须要还原;*.html
: 包含每一个页面对应的 .wxss
信息,可读性较好;资源文件
: 各种图片、音频等资源文件本文主要介绍了如何获取小程序的 .wxapkg
包文件,以及如何解包得到小程序“编译”混淆后的代码和资源文件。在下一篇文章《微信小程序“反编译”实战(二):源码还原》将介绍如何将 .wxapkg
包内内容还原为"编译"前的内容。