热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

偶然有需求了解别人的小程序实现方法,网上相关资料很多,顺便了解了一下,做个总结,没啥技术含量,分享出来。要求安装Nodejs一台root后的安卓手机或者装有可以打开微信小程序的安卓

偶然有需求了解别人的小程序实现方法,网上相关资料很多,顺便了解了一下,做个总结,没啥技术含量,分享出来。

要求

  • 安装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. (/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=.\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=.
    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)

    好像挺顺利,东西也出来了,可是最后还是报错了,推断是包内有包,子包解压失败。有关更多可以阅读:https://github.com/qwerty4721…

  • 未定义的$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=.\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=.
    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]();
    }
    }

    再重新跑一次,Bingo!万事大吉。

总结

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

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

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

这也让我想起很多年前,我也搞过类似的事情,大约8年前玩安卓手机的时候,解锁Bootload,开启Root来自个性化手机几乎满天都是,大把一键root,一键解锁工具,因此那时候安卓手机安全性很低,小白用户不懂,一不小心就中毒群发小广告。

那时候也流行Wifi万能钥匙,流量很贵的啦,我经常蹭了网,再去系统目录找到那个存放wifi的配置文件来查看别人家的Wifi密码。然后再用这个密码尝试admin/密码,看看路由啥的,不过我没搞过破坏的。

好了,大家如果还有不明白的,可以留言,我有空再分析一下这个工具的实现方式,也顺便尝试一下其他小程序(SWAN,头条,支付宝等),是否也是类似的,等有了结论再来一篇了~


推荐阅读
  • Node.js 入门指南(一)
    本文介绍了Node.js的安装步骤、如何创建第一个应用程序、NPM的基本使用以及处理回调函数的方法。通过实际操作示例,帮助初学者快速掌握Node.js的基础知识。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
author-avatar
保佑想-回丽水的阿卉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有