前言:
简单聊一下xxxxx.wxapkg
先来想想一个很简单的问题,小程序的源文件存放在哪?
当然是在微信的服务器上。
但是在微信服务器上,普通用户想要获取到,肯定是十分困难的,有没有别的办法呢?
简单思考一下我们使用小程序的场景就会明白,当我们点开一个微信小程序的时候,其实是微信已经将它的从服务器上下载到了手机,然后再来运行的。
所以我们应该可以从手机本地找到到已经下载过的小程序文件
那么如何才能在手机里找到小程序的源文件包呢?
这里只以安卓手机为例
具体目录位置直接给出:
根目录/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg/
在这个目录下,会发现一些 xxxxxxx.wxapkg 类型的文件,这些就是微信小程序的包
微信小程序的格式就是:.wxapkg
这里重要声明一下:虽然微信小程序的包后缀是.wxapkg,但有一些包的依赖后缀也是.wxapkg,真正的小程序包大小1M左右,而依赖包大小2、3M甚至更多。所以一股脑的反编译.wxapkg 类型的文件可能会报错: Error: This Package is unrecognizable, please decrypted every type of file by hand.,遇见这个问题的小伙伴请自知,你可能没找
对包哦!
.wxapkg是一个二进制文件,有其自己的一套结构。
微信小程序源码阅读笔记lrdcq大神的这篇博文有对.wxapkg的详细介绍,当然你也不可以不看
但是这里有个坑,想要进入到上面这个目录的话,用手机自带的文件管理器肯定是不行的,安卓或者iPhone都要要用到第三方的文件管理器,比如:RE文件管理器,并且安卓需要取得root权限,而苹果手机肯定是要越狱的,且iphone的越狱难度>>安卓获取root,不管越狱还是root,这都太费劲,当然有能力的同学可以直接从手机上来操作,但是这里不推荐从真机上获取。
下面我们来讲讲具体的操作步骤:
一、准备材料
1.node.js运行环境
如果没有安装nodejs,请先安装一下
下载地址:https://nodejs.org/en/
2.反编译的脚本
这里提供一个Github上qwerty472123大神写的node.js版本的,当然也有其它版本的,例如python版本,这里我只是简单地用node.js版本举例
地址:https://github.com/nieyangyang712/wxApp-Unpacker
3.安卓模拟器(要求自带root权限)
我使用的是夜神模拟器,下载地址:https://www.yeshen.com/cn/download/fullPackage
你也可以自选 或者:
网易 Mumu 模拟器安装
- 下载地址: http://mumu.163.com/360/
- 下载完安装包后直接安装
- 打开模拟器
- 安装 微信、RE文件管理器
- 设置Root 权限
- 打开 RE文件管理器,提示请求超级用户访问权限,选择允许
详细步骤
使用安卓模拟器获取到.wxapkg文件
不用越狱,不用root,使用电脑端的安卓模拟器来获取是一个非常简单快捷的获取方式,具体步骤如下:
1.打开安装好的安卓模拟器,并在模拟器中安装QQ、微信、RE管理器
QQ、微信在模拟器自带的应用商店里搜索下载安装即可
RE管理器的下载地址:https://pan.baidu.com/s/1PPBx08rNutXxhlMMJbuTpQ
提示一下:RE管理器在模拟器的应用商店一般也能搜到!!可以直接下载
下载好后直接拖拽进打开的模拟器窗口就会自动安装
2.设置一下模拟器
以我个人认为比较好用的夜神模拟器举例
首先到模拟器内部设置超级用户权限
先找到设置:
然后找到超级用户:
这些操作的目的都是为了能让RE管理器顺利的获取到ROOT权限
3.接下来在模拟器里打开微信,然后在微信中运行你想要获取的下程序(这其实是让微信把小程序的源文件包从服务器下载到了本地了)
就以我说的这款共享单车的小程序举例
在模拟器微信中运行一下后,直接切回模拟器桌面,运行RE浏览器 来到目录
根目录/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg/
就抵达了目的文件夹 :
或者直接在搜索框内搜索:/data/data/com.tencent.mm/MicroMsg/... 找到wxapkg的文件就是你要找的
打开文件管理器,找到/data/data/com.tencent.mm/MicroMsg 目录 ,然后找到一个很长的用户随机码,
继续找到/appbrand/pkg/xxx,接下来会出现小程序A的wxapkg包
压缩apkg包,然后长按发送到QQ,微信。接收到后存在本地就行了
然后:到此我们获取到了小程序的包 ,打开node.js , 路径切换到我们下载的反编译脚本的目录,
我这里是visual code 编辑器,github 上的 脚本源码,如图:
提示: ( 路径不要包含中文名称,否则反编译时可能因编码不对 造成异常 )
4 切换到反编译脚本的目录后 ,在node命令窗口中依次安装以下依赖:
npm install esprima --save
npm install css-tree --save
npm install cssbeautify --save
npm install vm2 --save
npm install uglify-es --save
npm install js-beautify --save
npm install escodegen --save
npm install cheerio --save
下面讲解需要更改的源码和操作步骤:
这时可能会报一个错误、【找不到escodegen模块】、莫紧张 , 否则容易秃头......
运行如下命令:npm i --save-dev escodegen
然后再输入命令:node .\wuWxapkg.js D:\2019\709\1\_497193109_61.wxapkg
在本地文件夹查看:
打开小程序的编辑器开启项目:
如果运行出现了点问题:
1、可以试试,点击开发者工具详情去掉 es6转es5的勾,勾上不校验安全域名
2、 勾选了还是无法运行?那么请在详情里把基础版本库调低至1.5左右,再试试
3、出现找不到某些文件的情况怎么办?我只能告诉:删!删!删! app.json
里面,提示找不到那个文件,就将pages下注册的该页面语句暂时删除掉。删
到可以运行为止
4、还是无法运行?那就自己想办法吧!
问题一:反编译微信小程序错误: $gwx is not defined和__vd_version_info__ is not defined 已解决
修改wxappUnpacker文件中的 wuWxss.js
function runVM(name, code) {
// let wxAppCode = {}, handle = {cssFile: name};
// let vm = new VM({
// sandbox: Object.assign(new GwxCfg(), {
// __wxAppCode__: wxAppCode,
// setCssToHead: cssRebuild.bind(handle)
// })
// });
// vm.run(code);
// for (let name in wxAppCode) if (name.endsWith(".wxss")) {
// handle.cssFile = path.resolve(frameName, "..", name);
// wxAppCode[name]();
// }
let wxAppCode = {};
let handle = {cssFile: name};
let gg = new GwxCfg();
let tsandbox = {
$gwx: GwxCfg.prototype["$gwx"],
__mainPageFrameReady__: GwxCfg.prototype["$gwx"], //解决 $gwx is not defined
__vd_version_info__: GwxCfg.prototype["$gwx"], //解决 __vd_version_info__ is not defined
__wxAppCode__: wxAppCode,
setCssToHead: cssRebuild.bind(handle)
}
let vm = new VM({sandbox: tsandbox});
vm.run(code);
for (let name in wxAppCode) {
if (name.endsWith(".wxss")) {
handle.cssFile = path.resolve(frameName, "..", name);
wxAppCode[name]();
}
}
}
问题二:Cannot find module 'uglify-es'
npm install esprima --save
npm install css-tree --save
npm install cssbeautify --save
npm install vm2 --save
npm install uglify-es --save
npm install js-beautify --save
npm install escodegen --save
问题三:$gwx is not defined
__vd_version_info__ is not defined
修改wxappUnpacker文件中的 wuWxss.js
function runVM(name, code) {
//let wxAppCode={},handle={cssFile:name};
//let vm=new VM({sandbox:Object.assign(new GwxCfg(),{__wxAppCode__:wxAppCode,setCssToHead:cssRebuild.bind(handle)})});
//vm.run(code);
//for(let name in wxAppCode)if(name.endsWith(".wxss")){
//handle.cssFile=path.resolve(frameName,"..",name);
//wxAppCode[name]();
//}
let wxAppCode = {};
let handle = {cssFile: name};
let gg = new GwxCfg();
let tsandbox = {
$gwx: GwxCfg.prototype["$gwx"],
__mainPageFrameReady__: GwxCfg.prototype["$gwx"], //解决 $gwx is not defined
__vd_version_info__: GwxCfg.prototype["$gwx"], //解决 __vd_version_info__ is not defined
__wxAppCode__: wxAppCode,
setCssToHead: cssRebuild.bind(handle)
}
let vm = new VM({sandbox: tsandbox});
vm.run(code);
for (let name in wxAppCode) {
if (name.endsWith(".wxss")) {
handle.cssFile = path.resolve(frameName, "..", name);
wxAppCode[name]();
}
}
}
问题四、报错
vm.js:3612
return function(env,dd,global){$gwxc=0;var root={"tag":"wx-page"};root.children=[]
^^^^^^
SyntaxError: Illegal return statement
SyntaxError: Illegal return statement
出现类似错误在网上找了很久,发现有一篇文章原文链接:wxappUnpacker 微信小程序反编译 2019 9月使用问题总结 讲到一位大佬给出了解决方案,larack8
他提出了https://github.com/qwerty472123/wxappUnpacker/issues/215
然后github地址https://github.com/larack8/wxappUnpacker
但是这里面有几个问题 Cannot find module 'uglify-es',本来都装好了,但是还报这个错误??
Error: Cannot find module 'uglify-es'
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/home/wq57885/wxappUnpacker2/wuJs.js:3:18)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
后来找到一个大佬的解决思路,需要升级到最新的nodejs,再重新安装库,这边仅供参考
npm install -g n
n latest
npm update -g
此时依然报错Cannot find module 'uglify-es',同时把 Error: Cannot find module 'cheerio'一起解决了
npm install uglify-es --save
npm install esprima --save
npm install css-tree --save
npm install cssbeautify --save
npm install vm2 --save
npm install uglify-es --save
npm install js-beautify --save
npm install escodegen --save
npm install cheerio --save
再次完美执行,久违的界面
或者选择dev分支的这个新的版本吧:
最近老有粉丝问我反编译失败了:
Illegal return statement
【问题说明】反编译其他的包可以,但是反编译这个包就报错了
【解决】我觉得可能是 wxappUnpacker 不支持反编译新开发的小程序;去gitub上查找最新的 wxappUnpacker,重新安装依赖,就可以避免这个问题。
gitub地址:https://github.com/nieyangyang712/wxappUnpacker
最后为了方便大家的沟通与交流请加QQ群: 625787746
请进QQ群交流:【IT博客技术分享群①】:https://jq.qq.com/?_wv=1027&k=DceI0140