刚刚get到一个新技能,趁着热乎赶紧整理出来分享给大家。本教程适用于任何小程序的反编译,但大多数项目都做了代码的压缩混淆,尤其是使用第三方框架的。而且小程序开发工具也会做一层编译,所以破解得到的项目实际是最终编译过的,但这并不影响代码的可读性,毕竟主要逻辑还是在。而且如果是纯原生开发的小程序经过破解得到的破解包不管是项目结构还是可读性与原项目基本没差。

以新浪微博小程序为例进行实战操作

一、下载网易mumu模拟器,安装微信与re文件浏览器;

下载地址:网易mumu官网

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

二、登录微信在小程序页搜索小程序名称,找到并打开小程序,模拟器打开小程序有可能闪退,但不要紧,因为小程序包已经开始后台下载了;

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

三、回到模拟器桌面打开RE文件管理器,提示请求超级用户访问权限,点击永久记住选择,允许其获取root权限。(注意:一定要允许root权限!)

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

四、按此路径进入目录:

/data/data/com.tencent.mm/MicroMsg

  • MicroMsg会保存你的用户相关信息,每登录一个微信号就会产生一个哈希值作为用户标识进行对应,
    看时间找到最新的一个用户点进去;

    使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

  • 找到appbrand目录,里面包含2个文件夹,一个是pkg(执行文件),一个是jscache(缓存文件)

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

  • 进入pkg目录下,找到最近的一个.wxapkg的文件,这个就是刚刚缓存的小程序文件,但它是个二进制文件不能直接拿来用,需要对它进行反编译处理。

    使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

  • 长按文件将它进行压缩为tar格式,然后发送到别人的微信上,让他一会在转发给你即可。

流程图

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

五、.wxapkg 解包

兜兜转转绕了一圈我们终于拿到小程序的 .wxapkg 包,接下来就是如何将它反编译成为一个完整的项目了,首先 .wxapkg 文件到底是什么呢?你可能会认为它就是类似 Android 的 .apk 或者 iOS 的 .ipa 安装包,本质上是一个 .zip 压缩包?其实不是的,它是一个二进制文件,实际的文件结构如下图(图片取自文章 微信小程序源码阅读笔记):

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

如何编译:

  1. 打开终端,用git下载代码 git clone https://github.com/qwerty472123/wxappUnpacker.git

  2. 切换到wxappUnpacker目录使用cnpm i安装依赖,安装之前需要安装Node环境(自行安装);

  3. 解压得到的tar文件,得到wxapkg的路径,在wxappUnpacker目录下执行node node wuWxapkg.js + wxapkg文件路径即可。

    使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

  4. 看到以下输出说明反编译成功,这时候你就会得到一个项目文件了。

    使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

    5.使用编辑器打开文件夹开心的看大神们怎么实现各种功能的吧,总会对你有所启发,微博的这个小程序源码可读性特别高,除了样式文件,感觉已经全了,有图有真相。

目录结构:

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家
代码片段:
使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家

局限(包括但可能不限于以下内容)

  • 实现中很多功能基于特定的版本(wcc-v0.6vv_20180111_fbi, 且不考虑面向低版本适配)和字符串搜索,所以不能很好的适应各种特殊情况。
    wxml 文件拥有不同于 xml 和 html

  • 文件的字符转义规则,且尚未公开(并非"没有"),因此未能很好的还原相关内容。

  • js 文件被压缩后会丢失原始变量名等信息内容无法还原;wxss 文件压缩后的注释也会丢失。

  • wxs 文件会将所有的变量如 Math 改为 nv_Math ,这里仅通过字符串替换去除。

  • 一些被引用 wxss 文件本身的源文件丢失,因此无法恢复原始目录。

  • 有些项目开启了难以复原的es6转es5选项,检验本项目结果是否正确时需要关闭项目中的es6转es5选项。

  • wxml 中一些无法找到相对应 的正向语句的内容无法还原。

  • json 中components项丢失,仅会标注被其他包引用的自定义组件。

最后欢迎大家关注公众号前端小苑,我会定期在这里发表原创文章。

使用安卓模拟器获取任意小程序源码完整教程(多图预警!)-编程之家