要求

  • 安装Nodejs
  • 一台root后的安卓手机或者装有可以打开微信小程序的安卓模拟器
  • 一个敢于折腾的耐心

准备

安装反编译工具

【推荐】方法一:你可以通过git clone将它存在本地

git clone https://github.com/qwerty472123/wxappUnpacker.git

将工具放在需要的目录内(例如wxappUnpacker)。

接着在该项目内执行:

npm install esprima css-tree cssbeautify vm2 uglify-es js-beautify escodegen

安装完项目依赖后开始进行最复杂的操作,提取小程序包。

提取微信小程序文件包

此时你有两个选择:通过安卓虚拟机获取,用你已经root的安卓机操作。

安卓虚拟机

  • 如果你是Windows,这就好说了。

    【似乎不太好用】我已经实践过了,这里有破解版的模拟器:Genymotion v2.12.2破解版。但是你要注册一个账号来添加虚拟设备,进行安装。安装完成后就可以启动了。

    【失败】网易的Mumu也是安卓模拟器,但是经过实践,居然不支持微信小程序。

  • 如果你是MacOS

    上面提到的Genymotion也是支持MacOS的,不过还是很麻烦。

    Mumu似乎不错,结果上面提到了,MacOS下也是打不开微信小程序的。

    结论:请自行尝试Genymotion模拟,或者找其他我还没发现的模拟器。

已Root安卓手机

你用有一台牛逼闪闪的安卓手机,但是大部分手机不允许root的,或者说root也是非常复杂的,所以如果你不懂得如何root,请考虑使用安卓虚拟机!

如果你优秀的root过了,这里又有两个方案:

  1. 【风险极高】粗暴的下载一个root explorer破解版,并授权root权限!
  2. 【推荐】从谷歌商店或者可靠的应用市场下载Root Explorer,土豪请付款购买,好像不到6美元,我这里尝试了一下ES文件浏览器也可以,所以接下来下载它并安装好。

看到这里,我当你已经拥有了一台可以登录微信、安装了文件管理工具、并给它授予最高权限的安卓手机了!

提取文件

  • 打开微信,登录微信账号。
  • 打开一个小程序,让他正确加载显示后就可以关闭了(这个时候小程序的包已经报留在你的手机某个位置了)。
  • 打开文件管理工具(模拟器终会提示root,真机请手动授权root权限),访问这个路径根目录(非存储) > data > data > com.tencent.mm > MicroMsg > 9f69************ad8d(类似这样的标识你所登录的账号的目录) > appBrand > pkg,可以看到类似下面这样的文件:

    • _46541548_7.wxapkg
    • _-529198367_190.wxapkg
    • *.wxapkg
  • 如果不多的话将他们打包成zip,发送给微信朋友或者其他方法上传到网络硬盘。
  • 再到电脑上把刚接收的或者上传的zip下载到电脑上,解压出来。

此时,文件就拿到了。

反编译

进入工具目录wxappUnpacker,建一个文件夹,比如pkg,将刚才拿到的文件放在这里。

假设,我要尝试反编译这个文件_46541548_7.wxapkg,执行命令:

node wuWxapkg.js ./pkg/_46541548_7.wxapkg

顺利的话会生成一个同名的目录。打开这个目录就能看到了。

异常

程序出问题,工具出问题,代码有BUG,再常见不过了。以下几个异常,你也许也发生过,可能不明白,我把我遇到的异常理解分享一下:

  • 未安装成功工具依赖的模块

Error: Cannot find module 'uglify-es'at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)at Function.Module._load (internal/modules/cjs/loader.js:507:25)at Module.require (internal/modules/cjs/loader.js:637:17)at require (internal/modules/cjs/helpers.js:22:18)at Object.<anonymous> (/Users/whidy/webs/wxappUnpacker/wuJs.js:3:16)at Module._compile (internal/modules/cjs/loader.js:689:30)at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)at Module.load (internal/modules/cjs/loader.js:599:32)at tryModuleLoad (internal/modules/cjs/loader.js:538:12)at Function.Module._load (internal/modules/cjs/loader.js:530:3)
  • 那就是你没装好依赖,再执行一次npm run uglify-es

  • 未识别的包

...
Saving files...
Unpack done.
/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104}else throw Error("This package is unrecognizable.\nMay be this package is a subPackage which should be unpacked with -s=<MainDir>.\nOtherwise, please decrypted every type of file by hand.")^Error: This package is unrecognizable.
May be this package is a subPackage which should be unpacked with -s=<MainDir>.
Otherwise, please decrypted every type of file by hand.at Array.packDone (/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104:14)at CntEvent.decount (/Users/whidy/webs/wxappUnpacker/wuLib.js:17:43)at ioLimit.runWithCb.err (/Users/whidy/webs/wxappUnpacker/wuLib.js:73:11)at agent (/Users/whidy/webs/wxappUnpacker/wuLib.js:54:14)at FSReqWrap.oncomplete (fs.js:141:20)

未定义的$gwx

Saving files...
Unpack done.
/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104}else throw Error("This package is unrecognizable.\nMay be this package is a subPackage which should be unpacked with -s=<MainDir>.\nOtherwise, please decrypted every type of file by hand.")^Error: This package is unrecognizable.
May be this package is a subPackage which should be unpacked with -s=<MainDir>.
Otherwise, please decrypted every type of file by hand.at Array.packDone (/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104:14)at CntEvent.decount (/Users/whidy/webs/wxappUnpacker/wuLib.js:17:43)at ioLimit.runWithCb.err (/Users/whidy/webs/wxappUnpacker/wuLib.js:73:11)at agent (/Users/whidy/webs/wxappUnpacker/wuLib.js:54:14)at FSReqWrap.oncomplete (fs.js:141:20)

这个就要修改一下工具源码了,打开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]();}
}

改成新的:

function runVM(name,code){let wxAppCode={},handle={cssFile:name};let gg = new GwxCfg();let tsandbox ={$gwx:GwxCfg.prototype["$gwx"],__mainPageFrameReady__:GwxCfg.prototype["$gwx"],__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]();}
}

总结

总的来说,这个操作还是比较容易的,最大的难点就是想办法提出文件了。工具别人写好了,有问题,Issue上面的解决方案很多,很快就能解决。

想要实现更多,也可以参考工具的说明文档通过不同的命令操作。

当然,小程序缓存到本地是迫不得已的,为了提高加载速度嘛。这个东西,微信官方大概已经知道了,我想可能也会封堵吧。这个微信官方或许也只是单纯打包了一下,所以就比较容易破解,如果他加壳,加密的话,或许以后就难了。

通过安卓手机,获取微信小程序包进行反编译方法相关推荐

  1. 模拟器获取微信小程序pgk然后反编译

    小程序反编译的几点心得 参考链接 https://blog.csdn.net/qq_41297837/article/details/103962564 https://github.com/yswu ...

  2. 微信小程序源码反编译

    @IT猴~ 写有用的文章 微信小程序源码反编译 亲测有效,能返编译市面上百分之90的小程序.准备: 1.夜神模拟器 2.node.js 3.微信 夜神模拟器 夜神模拟器官网: https://www. ...

  3. 如何获取微信小程序包

    下载一个夜神模拟器 并在模拟器中下载微信 打开并登陆微信,访问小程序等小程序加载 完成则可以获取微信小程序的pak包 打开Amaze 文件管理 点击文件根目录 依次访问 data/data/com.t ...

  4. 微信小程序如何进行反编译详细教程

    前言介绍 小程序反编译,其实还是简单的,要想拿到微信小程序源码,先要拿到小程序的包,用反编译脚本跑一下,微信小程序代码包里的所有文件.所有资源就出来了(除了project.config.json小程序 ...

  5. 获取微信小程序源码教程

    最近在研究微信小程序,网上很多的小程序都是可以借鉴的,那么如何获取源码就很重要了 目录 1.安装对应环境 (Node,js) 2.下载反编译脚本 3.下载安卓模拟器获取微信小程序反编译文件 4.反编译 ...

  6. 只需两步快速获取微信小程序源码

    第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两 ...

  7. 一键获取微信小程序,反编译

    一键获取微信小程序,反编译 相关地址 操作方法 在这里我总结一下获取 wxapkg文件的一些注意事项. 相关地址 本文中软件为搬运,如有违规请告知.感谢作者:Cherrison 下载地址:https: ...

  8. 获取微信小程序源码并进行反编译

    获取微信小程序源码并进行反编译 只需如下几部就可以爬取到你所想要的微信小程序源码: 第一: node.js运行环境 如果没有安装nodejs,请先安装一下 下载地址:https://nodejs.or ...

  9. 利用 node.js 云函数解密获取微信小程序的手机号码等加密信息 encryptedData 的内容。

    首先你必须会用微信小程序的云函数功能: 1.创建一个名为token的云函数 2.在云开发的云函数管理中添加对应的token云函数 3.在开发工具中编辑云函数token 4.点击右键,安装并部署 大致是 ...

最新文章

  1. 2022-2028年中国体育用品行业投资分析及前景预测报告(全卷)
  2. oracle nodemanage,Linux 下Weblogic集群搭建-04通过nodemanage进行节点的启动与关闭
  3. App Inventor2项目部署到本地
  4. window部署DM8的DEM系统
  5. Mysql笔记——DML
  6. NLTK频率分类中定义的函数
  7. 微信支付 企业转账 小程序发红包 提现 发红包 企业支付等遇到的问题
  8. Easy UI中dategrid的getSelections方法只能获取一个id的解决办法
  9. 构建iscsi网络存储服务
  10. ruby 疑难点之—— attr_accessor attr_reader attr_writer
  11. matlab 象限图,【数据可视化】Tableau教程(十)象限图
  12. pg数据库客户端linux,PostgresSQL客户端pgAdmin4使用
  13. 【国产mcu填坑篇】------STC(宏晶)
  14. 微信小程序实战--仿知识星球(一)
  15. 日期时间选择器bootstrap(手机适应)
  16. 三文鱼肉质和虹鳟鱼肉质有什么区别差异
  17. Windows系统,多开微信(电脑版)
  18. 2021高校毕业生薪酬Top100出炉 !
  19. 嵌入式常用的英文缩写词汇
  20. 自带显示大屏 富士通ScanSnap iX1500扫描仪初体验

热门文章

  1. tarjan算法中比较dfn 还是low
  2. CSDN写作小技巧—— Markdown 语法排版
  3. VS 2010错误提醒: 必需属性“VSInstallDir”缺失或为空 以及 error MSB8008
  4. 解决Win10系统过期失效问题的经验总结
  5. fedroa设置启动快捷键
  6. vue项目中 高德地图总是出不来的问题
  7. 学习分享:RNN(持续更新)
  8. uni-app H5+ 连接蓝牙打印机打印文字及二维码
  9. android shareSDK 微博分享案例
  10. C/C++ 机房预约系统