微信小程序反编译教程 wxapkg解包与源码还原实战
本文就微信小程序如何进行反编译,查看源码,使用工具和过程进行分析
使用工具
- 小程序包解密工具 UnpackMiniApp
- 小程序逆向编译 wxappUnpacker
- Node.js 环境
- 微信开发者工具
一.找到小程序wxapkg包
Windows下微信小程序wxapkg包存放目录
# 微信 -> 设置 -> 文件管理 -> 可以看到文件保存的位置,点击打开文件夹 -> 小程序相关包存放在 默认保存位置中的 Applet 目录
# 如果文件管理的位置是: D:\Users\username\Documents\WeChat Files\WeChat Files
# 存放小程序 wxapkg 包的 Applet 目录
D:\Users\username\Documents\WeChat Files\WeChat Files\Applet1.先删除所有 wx + 数字 这类的目录(wx75d1********5933),方便等下找到最新运行的小程序文件。
因为不是按照小程序名称存储的,不知道哪个小程序对应哪个目录中的包
Applet 目录中的小程序包目录名称示例
wx75d1********5933
wx7cdb********dc9c
wx8303********0900
wx8bcf********2e03
wx91d2********ff74
wx9a71********11cb
wxa4b8********1cfc
wxa581********4686查看删除后,每次小程序打开的文件名称是否唯一
第一次打开 *** 小程序
wxbd30********46e2
删除后再次打开小程序,还是这个名字,具体命名规则未知
wxbd30********46e22.进入微信,打开要获取 wxapkg 包的小程序
3.返回刚才存在小程序 wxapkg 文件的 Applet 目录
可以看到有个新生成的目录 wxbd30********46e2,这个就是存储对应小程序 wxapkg 文件的目录
目录结构示例
$ tree wxbd30********46e2/
wxbd30********46e2/
└── 199
├── __APP__.wxapkg
├── _book-offline_.wxapkg
├── _sub-pkg-card_.wxapkg
├── _sub-pkg-common_.wxapkg
├── _sub-pkg-consult_.wxapkg
├── _sub-pkg-global-sdk_.wxapkg
├── _sub-pkg-online-reg_.wxapkg
├── _sub-pkg-settings_.wxapkg
└── _sub-pkg-todo_.wxapkg而我们需要的是其中的 __APP__.wxapkg 文件
二.使用UnpackMiniApp对小程序包解密
使用 UnpackMiniApp.exe 解密小程序包 __APP__.wxapkg
注意: UnpackMiniApp.exe 同层目录需要存在 wxpack 目录,用于存放解密后的包
运行 UnpackMiniApp.exe,选中刚才获取的 __APP__.wxapkg 文件,进行解密
会在 wxpack 目录 生成 wxbd30********46e2.wxapkg 文件
三.使用wxappUnpacker对解密后的小程序包进行反编译
wxappUnpacker 需要node环境,正式反编译之前,确保安装了node。node.js 的安装这里就不进行赘述了。
1.安装node.js
已安装node
> node -v
v18.16.02.安装 wxappUnpacker 所需依赖
# 提速可以使用国内源
# npm config set registry https://registry.npmmirror.com/
npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify3.安装依赖后,进行反编译
报错
PS D:\src\微信小程序解密\wxappUnpacker> node .\wuWxapkg.js D:\src\微信小程序解密\wxpack\wxbd30********46e2.wxapkg
Unpack file D:\src\微信小程序解密\wxpack\wxbd30********46e2.wxapkg...
Header info:
firstMark: 0xbe
unknownInfo: 0
infoListLength: 3824
dataLength: 2537561
lastMark: 0xed
File list info:
fileCount: 80
Saving files...
Unpack done.
Split app-service.js and make up configs & wxss & wxml & wxs...
deal config ok
deal js ok
deal wxss.js ok
deal css ok
D:\src\微信小程序解密\wxappUnpacker\wuConfig.js:49
for (let page of subPackage.pages) {
^
TypeError: subPackage.pages is not iterable
at D:\src\微信小程序解密\wxappUnpacker\wuConfig.js:49:45
at D:\src\微信小程序解密\wxappUnpacker\wuLib.js:103:14
at agent (D:\src\微信小程序解密\wxappUnpacker\wuLib.js:66:23)
at FSReqCallback.readFileAfterClose [as oncomplete] (node:internal/fs/read_file_context:68:3)
Node.js v18.16.0解决方法:
https://github.com/system-cpu/wxappUnpacker/issues/7
在for前面加个判断 if (subPackage.pages)
亲测有效,非常感谢!https://www.cnblogs.com/Wei-notes/p/17932722.html
TypeError: subPackage.pages is not iterable 异常
这个异常其实就是简单的subPackage参数为空导致出现的异常,打开报错的文件找到对应的报错位置,外层加个判断就ok了,如下例:
复制代码
if(subPackage.pages){
for (let page of subPackage.pages) {
let items = page.replace(root, '');
newPages.push(items);
let subIndex = pages.indexOf(root + items);
if (subIndex !== -1) {
pages.splice(subIndex, 1);
}
}
} 处理实践
修改wxappUnpacker\wuConfig.js文件
for (let page of subPackage.pages) {
let items = page.replace(root, '');
newPages.push(items);
let subIndex = pages.indexOf(root + items);
if (subIndex !== -1) {
pages.splice(subIndex, 1);
}
}
# 调整为
if(subPackage.pages){
for (let page of subPackage.pages) {
let items = page.replace(root, '');
newPages.push(items);
let subIndex = pages.indexOf(root + items);
if (subIndex !== -1) {
pages.splice(subIndex, 1);
}
}
}成功
PS D:\src\微信小程序解密\wxappUnpacker> node .\wuWxapkg.js D:\src\微信小程序解密\wxpack\wxbd30********46e2.wxapkg
Unpack file D:\src\微信小程序解密\wxpack\wxbd30********46e2.wxapkg...
Header info:
firstMark: 0xbe
unknownInfo: 0
infoListLength: 3824
dataLength: 2537561
lastMark: 0xed
File list info:
fileCount: 80
Saving files...
Unpack done.
Split app-service.js and make up configs & wxss & wxml & wxs...
deal config ok
deal js ok
deal wxss.js ok
deal css ok
=======================================================
这个小程序采用了分包
子包个数为: 54
=======================================================
Decompile ./base.wxml...
Decompile success!
Decompile ./comp.wxml...
Decompile success!
Decompile ./pages/home/index.wxml...
Decompile success!
Decompile ./pages/index/index.wxml...
Decompile success!
Decompile ./pages/me/index.wxml...
Decompile success!
Decompile ./pages/news-list/index.wxml...
Decompile success!
splitJs: D:\src\微信小程序解密\wxpack\wxbd30********46e2\app-service.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 common.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 runtime.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 taro.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 vendors.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 app.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 comp.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 pages/index/index.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 pages/home/index.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 pages/news-list/index.js
D:\src\微信小程序解密\wxpack\wxbd30********46e2 pages/me/index.js
Splitting "D:\src\微信小程序解密\wxpack\wxbd30********46e2\app-service.js" done.
Guess wxss(first turn)...
Import count info: {}
Guess wxss(first turn) done.
Generate wxss(second turn)...
Generate wxss(second turn) done.
Save wxss...
saveDir: D:\src\微信小程序解密\wxpack\wxbd30********46e2
Split and make up done.
Delete files...
Deleted.
File done.
Total use: 3.962s反编译后的文件位于 wxpack 目录中的 wxbd30********46e2
四.通过微信开发者工具打开
微信开发者工具下载页面,进入下载页面下载安装即可
接下来使用微信开发者工具打开反编译后的文件夹D:\src\微信小程序解密\wxpack\wxbd30********46e2即可
打开微信开发者工具,需要登录,可以先用游客模式进入,点击导入,选择位于 wxpack 目录中的 wxbd30********46e2,开发模式 小程序
五.总结
这样关于微信小程序的反编译就结束了,可以通过微信开发者工具查看相关代码