微信小程序逆向分析:第一步,从手机中提取出wxapkg文件
第一步,从手机中提取出wxapkg文件
以安卓为例,进入以下目录:
/data/data/com.tencent.mm/MicroMsg/(一长串字符串)/Appbrand/pkg
把这些包从手机里导出来,进行解析,用adb进行导出,如果不知道哪个文件可以批量导出如果很多wxapkg建议清理一下,重启目标小程序。可能出现好几个包)
可以找到wxapkg文件,把它提取到电脑上。
第二步,利用解包工具解包
下载解包工具https://github.com/wanliofficial/wxappUnpacker,https://github.com/Cherrison/CrackMinApp
1
node wuWxapkg.js <wx_mini_progranm_file_path>
解包要先解主包
node wuWxapkg.js 分包.wxapkg -s=主包的目录
解决解包过程中的程序报错
- 可能是子包
- 。。。
解包成功的标识
- 根目录下生成:app.js app.json app.wxss
第三步,了解小程序的文件结构
小程序包含一个描述整体程序的 app 和多个描述各自页面的 page。
一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下:
| 文件 | 必需 | 作用 |
|---|---|---|
| app.js | 是 | 小程序逻辑 |
| app.json | 是 | 小程序公共配置 |
| app.wxss | 否 | 小程序公共样式表 |
一个小程序页面由四个文件组成,分别是:
| 文件类型 | 必需 | 作用 |
|---|---|---|
| js | 是 | 页面逻辑 |
| wxml | 是 | 页面结构 |
| json | 否 | 页面配置 |
| wxss | 否 | 页面样式表 |
注意:为了方便开发者减少配置项,描述页面的四个文件必须具有相同的路径与文件名。
允许上传的文件
在项目目录中,以下文件会经过编译,因此上传之后无法直接访问到:.js、app.json、.wxml、*.wxss(其中 wxml 和 wxss 文件仅针对在 app.json 中配置了的页面)。除此之外,只有后缀名在白名单内的文件可以被上传,不在白名单列表内文件在开发工具能被访问到,但无法被上传。具体白名单列表如下:
- wxs
- png
- jpg
- jpeg
- gif
- svg
- json
- cer
- mp3
- aac
- m4a
- mp4
- wav
- ogg
- silk
第四步,静态分析
第五步,调试小程序
下载微信开发者工具
注册开发者账号
导入解包之后的程序
解决错误,导入之后可能出现各种错误,比如,缺少配置,属性错误,语法错误等,需要手动修改
对于插件代码,一般来说都是根据控制台中的异常,找到插件id,然后在微信插件市场找到对应插件名称 然后在小程序app.json中删除该插件引用即可。
对于相对路径错误,也是同理,根据异常找到对应文件进行修改即可,这里可能会遇到__wuBaseWxss__中wxss文无法找到的问题,一个可能原因是反编译分包时wxss文件没有解压到主包__wuBaseWxss__目录下,因此可以手动复制过去。
在这步过程中就会用到小程序开发者文档中所学到的目录结构相关知识,对各文件作用需要一定了解才能顺利修复。
实质上开发者工具是个类似Chrome的浏览器,虽然开发者工具也存在控制台,但是该控制台中只能看到逻辑层JS代码,无法看到渲染层
查看微信小程序开发者工具的包内容,然后进入Contents/Resources/app.nw/js/core/index.js,注释掉如下代码就可以查看开发者工具渲染后的代码。
if (nw.App.argv.indexOf(‘inspect’) !== -1) {
tools.openInspectWin()}
动态调试接口信息
实现源码
我们实现爬虫的时候,我们把js代码写好(可以调用加密开源库或把js从小程序里扣出来都可以的),通过nodejs环境执行js。Python可以通过pyexecjs完成调用。这个库会查找本地可用于执行的js环境,这个需要配置相关的环境变量即可。另外,如果我们执行的js引入了开源库,需要在工程目录下,把引入的库拷贝过来