惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
量子位
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
AWS News Blog
AWS News Blog
T
Threat Research - Cisco Blogs
博客园 - Franky
Vercel News
Vercel News
H
Help Net Security
Martin Fowler
Martin Fowler
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Cyberwarzone
Cyberwarzone
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
C
CERT Recently Published Vulnerability Notes
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog RSS Feed
H
Hacker News: Front Page
P
Proofpoint News Feed
博客园 - 聂微东
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
D
Docker
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
S
Security @ Cisco Blogs
博客园 - 【当耐特】
F
Fortinet All Blogs
The Register - Security
The Register - Security
A
About on SuperTechFans
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
NISL@THU
NISL@THU
Attack and Defense Labs
Attack and Defense Labs
Help Net Security
Help Net Security
Cisco Talos Blog
Cisco Talos Blog
月光博客
月光博客
IT之家
IT之家
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
Hugging Face - Blog
Hugging Face - Blog

步步走

mac 环境变量与 shell · 步步走 mac 终端命令大全 · 步步走 深入学习 TypeScript 类型体操 · 步步走 微前端的几种架构介绍 · 步步走 git clone 的时候如何通过 SSH 链接来下载远程项目 · 步步走 从 ESLint 开始,说透我如何在团队项目中基于 Vue 做代码校验 · 步步走 死磕 36 个 JS 手写题(搞懂后,提升真的大) · 步步走 1.5 万字 CSS 基础拾遗(核心知识、常用需求) · 步步走 为你的网站加上 WebP 格式的图片吧 · 步步走 让人爱不释手的 JS 扩展操作符 13 用 · 步步走 6 分钟了解 HTTP 发展史 · 步步走 Resourse Hints 知多少 · 步步走 探究网页资源究竟是如何阻塞浏览器加载的 · 步步走 很多人知道 Web Storage,但是你清楚 Cookie 嘛 · 步步走 浏览器专题之缓存篇 · 步步走 从输入 URL 到页面显示发生了什么 · 步步走 浏览器专题之事件机制 · 步步走 浏览器专题之安全篇 · 步步走 「建议收藏」送你一份精心总结的3万字ES6实用指南(全) · 步步走
如何反编译微信小程序 · 步步走
typeR · 2024-06-12 · via 步步走

如何反编译微信小程序

什么是反编译

微信小程序可以运行在手机微信或者 pc 版微信环境下,它是以一个应用包的形式存在的,这个应用包的后缀通常是 .wxapkg。如果想知道某个微信小程序的功能模块是如何实现的,就需要把这个包给解开,这个过程就叫反编译。

获取小程序包

要反编译微信小程序,那首先就需要获取微信小程序的应用包。

可以在 pc 版本微信上获取包,那么就需要在 pc 版微信上先运行某个小程序;运行完成后,就会在电脑某个目录下生成这个小程序的包,我们需要找到这个目录,那么就找到了这个包了。

windows 和 mac 环境不同,包的位置也会不一样。

windows 系统

打开微信设置-文件管理-就能看到微信的目录了,继续往下找到 /applet 这个目录,就能看到小程序的包了。示例:D:\软件\WeChat Files\WeChat Files\Applet\小程序 AppID__APP__.wxapkg

mac 系统

包通常是被放在:/System/Volumes/Data/Users/你的用户名/Library/Containers/com.tencent.xinWeChat/Data/.wxapplet/packages/小程序 AppID/随机数/APP.wxapkg

知道了目录后,就可以拿到包了。

在 mac 下进入某个目录可以这样做:

  • 访达-前往-前往文件夹-然后把目录路径贴到输入框,选择某个路径就可以进去了;
  • 或者在终端用命令:open 目录路径;

如果 mac 系统的包不在刚刚说的目录下,还有一种方式可以找到。那就是通过微信小程序 AppID 来搜索目录。那就需要先知道某个微信小程序的 AppID 是什么。

可以通过如下这张图的操作路径来获取 AppID:

获取AppID

拿到了 AppID 后,就可以通过终端里输入命令来进行搜索了:

1
find / -name 某个AppID

当搜索到这种路径的时候就说明找到了,就可以停止搜索了。

反编译

拿到了小程序应用包,接下来就需要通过代码把这个包给解开,然后还原成可以跑在微信开发者工具上的微信小程序项目代码了。

反编译使用的是 github 上的开源项目:wxappUnpacker

把这个项目 clone 到本地后,安装好依赖,就可以使用如下命令进行反编译了:

1
node wuWxapkg.js /System/Volumes/Data/Users/你的用户名/Library/Containers/com.tencent.xinWeChat/Data/.wxapplet/packages/小程序AppID/随机数/__APP__.wxapkg

由于这个库的程序比较旧了,而小程序的项目结构或者语法再时时更新,所以在解包的时候有可能会报错,这个不用管。

解包完成后,会在 APP.wxapkg 的同级目录生成一个 APP 的文件夹,这个文件夹就是微信开发者工具的可识别的项目目录。把它复制到外面,好让微信开发者工具方便导入,导入项目过程中的 AppID 使用测试号即可。

在微信开发者加载代码的过程中,正常不会很顺利,我自己反编译了几个小程序也都会有问题。比如如下图:

报错

问题一:require(…)() is not a function

比如如下文件 miniprogram_npm/@vant/weapp/wxs/utils.wxs 中的 require(…)() 改成 require(…) 即可。

1
2
3
4
5
6
7
8
9
10
11
-  var bem = require('p_./miniprogram_npm/@vant/weapp/wxs/bem.wxs')();
+ var bem = require('p_./miniprogram_npm/@vant/weapp/wxs/bem.wxs');
- var memoize = require('p_./miniprogram_npm/@vant/weapp/wxs/memoize.wxs')();
+ var memoize = require('p_./miniprogram_npm/@vant/weapp/wxs/memoize.wxs');
- var addUnit = require('p_./miniprogram_npm/@vant/weapp/wxs/add-unit.wxs')();
+ var addUnit = require('p_./miniprogram_npm/@vant/weapp/wxs/add-unit.wxs');
module.exports = ({
bem: memoize(bem),
memoize: memoize,
addUnit: addUnit,
});

问题二:_typeof2 is not a function

这个错误文件是 @babel/runtime/helpers/typeof.js,把如下代码替换掉原文件代码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function _typeof2(o) {
"@babel/helpers - typeof";
return (_typeof2 =
"function" == typeof Symbol && "symbol" == typeof Symbol.iterator
? function (o) {
return typeof o;
}
: function (o) {
return o &&
"function" == typeof Symbol &&
o.constructor === Symbol &&
o !== Symbol.prototype
? "symbol"
: typeof o;
})(o);
}

function _typeof(o) {
return (
"function" == typeof Symbol && "symbol" === _typeof2(Symbol.iterator)
? (module.exports = _typeof =
function (o) {
return _typeof2(o);
})
: (module.exports = _typeof =
function (o) {
return o &&
"function" == typeof Symbol &&
o.constructor === Symbol &&
o !== Symbol.prototype
? "symbol"
: _typeof2(o);
}),
_typeof(o)
);
}

module.exports = _typeof;

其他一些别的错误,需要看报错信息对应改一下,这里就不再多介绍了。