本实用教程将一步步告诉你如何“反编译”获取其他小程序的源码,包括“解包”和“源码还原”,我主要参考了看学论坛、V2EX、GitHub等网站上的帖子、教程和工具。我很感激这一点。文章底部有详细的参考链接,也加入了一些自己的理解和总结。我们知道,我们在微信开发者工具中开发好小程序后,点击“上传”按钮,微信开发者工具会对JS代码进行“编译”、压缩和混淆,并对wxml、wxss和资源文件进行整合打包成一个.wxapkg文件上传到微信服务器。所以要“反编译”小程序,首先我们需要得到小程序对应的.wxapkg包。之前V2EX上有一篇文章介绍如何通过某个网址直接下载各个小程序的.wxapkg,但是很快就被微信屏蔽了。所以,我们只能从手机着手,找到手机上的微信客户端下载保存在本地的小程序包。小程序.wxapkg文件获取工具:越狱iPhone或root安卓手机本文以iPhone4S、iOS8.4.1、微信版本v6.6.6为例。在越狱后的iPhone上打开Cydia,搜索并安装iFile或Filza等文件浏览APP,打开iFile或Filza,跳转到本地App安装目录:/var/mobile/Containers/Data/Application/,此时,你可以看到当前iPhone安装的应用列表,如下图:找到“微信”目录(我手机对应的文件夹是:297286CE-9055-400A-99FA-D2D7C0735DCF文件夹),点击进入,也就是微信在这款iPhone上的“沙盒”里,相信iOS开发者已经很熟悉这个目录了。该目录下主要有Documents、Library、tmp等文件夹,通常用来存放不同的数据和文件。让我重复一遍。我们在当前微信“sandbox”目录下搜索wxapkg关键字,可以找到当前iPhone中微信下载的小程序包,如下图:我们发现搜索到的.wxapkg文件名都是以数字后,如图中的2.wxapkg和25.wxapkg,它们的命名规则是什么?它们放在哪里?我们往下看。经过简单分析,我们发现微信下载的小程序包存放在以下目录:/path/to/WeiChatSandBox/Library/WechatPrivate/{UserId}/WeApp/LocalCache/release/其中{UserId}为当前登录微信账号IdMD5值(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/WeiChatSandBox/Library/WechatPrivate/{UserId}/WeApp/Sandbox/wx...(appId)对了,小程序包在安卓手机上的存放目录是(需要root权限才能访问):/data/data/com.tencent.mm/MicroMsg/{UserId}/appbrand/pkg/Copy.wxapkg文件到电脑通过上面的分析,我们可以知道小程序的压缩包.wxapkg存放在哪里。接下来,我们需要将手机上的.wxapkg文件复制到电脑上。iPhone打开Cydia,搜索并安装OpenSSH,在iPhone>设置>无线局域网查看手机连接的WiFi,记录IP地址,比如我的是:192.168.1.17,然后打开你的终端Mac电脑(和iPhone连接同一个WiFi),可以通过SSH登录手机(具体见Cydia上OpenSSH下载页面的说明):sshroot@192.168.1.17接下来我们可以使用iPhone上的scp命令将文件复制到我们的电脑上,比如在我的Mac上命令行执行(不需要ssh登录iPhone,直接在Mac终端上执行):scproot@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/Desktop/AppZubin/“知识宝典”小程序的包2.wxapkg已经复制到我Mac桌面的WeApp文件夹中。当然如果你的电脑安装了iTool或者PP助手之类的工具,貌似连接越狱后的iPhone就可以直接访问手机上的目录和文件,可能就没那么麻烦了(未验证)。解包.wxapkg千辛万苦终于拿到了各个小程序的.wxapkg包,接下来我们就可以分析了。首先,.wxapkg文件是什么?你可能会认为它类似于Android.apk或iOS.ipa安装包,本质上是一个.zip压缩包?它不是!它是一个二进制文件。实际文件结构如下:图片取自微信小程序源码阅读笔记,本文作者在GitHub上也提供了解包脚本(各种语言):我下载的是Python2解包script,and.wxapkg文件放在一个目录下,然后在命令行执行以下名称即可得到解压后的文件:pythonunwxapkg.py2.wxapkg以“知识宝典”小程序为例,文件目录解压后得到如下(与我开发“知识宝库”小程序的项目目录基本一致):各个小程序的解压文件大同小异,主要包括以下文件:app-service.js:所有JS小程序项目Summary中的文件,一直看的一头雾水;app-config.json:小程序项目app.json的汇总和各页面的json配置文件,可直接查看;page-frame.html:所有页面的.wxml和app.wxss样式文件的汇总,可读性较差,需要恢复;*.html:包含每个页面对应的.wxss信息,可读性更好;资源文件:各类图片、音频等资源文件概要本文主要介绍如何获取.wxapkg包文件,以及小程序“编译”后如何解压得到混淆代码和资源文件。下一篇《微信小程序“反编译”实战(二):源码还原》将介绍如何将.wxapkg包中的内容恢复为“编译”前的内容。
