当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 17:28:51 Node.js

偶尔需要知道如何实现别人的小程序。网上有很多相关资料。需要安装Nodejs。root过的安卓手机或者能打开微信小程序的安卓模拟器。一个敢于辗转反侧的病人,看起来很单纯。准备安装一个反编译工具【推荐】方法一:可以使用gitclone到本地存在的gitclonehttps://github.com/qwerty472123/wxappUnpacker.git把工具放到需要的目录下(例如wxappUnpacker)。方法二:也可以直接下载工具包,点击下载,解压。然后在项目中执行:npminstallesprimacss-treecssbeautifyvm2uglify-esjs-beautifyescodegen安装好项目依赖后,开始最复杂的操作,解压小包。提取微信小程序文件包此时,你有两种选择:通过安卓虚拟机获取,或者使用你root过的安卓机进行操作。Android虚拟机如果你是Windows,这个好说。【推荐】选择夜神模拟器下载安装。【好像不太好用】我已经实践过了,这里提供模拟器破解版:Genymotionv2.12.2破解版。但是需要注册一个账号才能添加虚拟设备并安装。安装完成后,就可以启动了。【失败】网易的木木也是安卓模拟器,但是经过实践,不支持微信小程序。如果你是macOS,上面提到的Genymotion也支持macOS,但是还是很麻烦。mumu貌似不错,但是上面说了微信小程序在macOS下是打不开的。结论:自己尝试Genymotion仿真器,或者寻找其他我还没有找到的仿真器。刷机的安卓手机你有一台功能强大的安卓手机,但是大部分手机是不允许刷机的,或者刷机也很复杂,所以如果你不会刷机,请考虑使用安卓虚拟机!如果你已经过极品root,这里还有两个解决办法:【风险很高】粗暴下载破解版的rootexplorer,授权root权限!【推荐】从GooglePlay商店或可靠的应用市场下载RootExplorer。如果你有钱,请付钱购买。好像不到6块钱。我这里试用了ES文件浏览器,所以下载安装。看到这里,我想你已经拥有一部可以登录微信、安装文件管理工具、授予最高权限的安卓手机了!解压文件,打开微信,登录微信。打开一个小程序,让其正确加载显示,然后关闭(此时小程序的包已被举报遗留在手机某处)。打开文件管理工具(模拟器最终会提示root,请在真机上手动授权root权限),访问此路径根目录(非存储)>数据>数据>com.tencent.mm>MicroMsg>9f69***********ad8d(类似于标识你登录账户的目录)>appBrand>pkg,可以看到类似如下文件:_46541548_7.wxapkg_-529198367_190.wxapkg*.wxapkg如果数量不多,加一个打包成zip,发给你的微信好友或者通过其他方式上传到网络硬盘。然后到电脑上下载刚刚收到或上传的zip到电脑上,解压。此时,文件可用。反编译进入工具目录wxappUnpacker,新建一个文件夹,比如pkg,把刚刚得到的文件放在这里。假设,我想尝试反编译_46541548_7.wxapkg这个文件,执行命令:nodewuWxapkg.js./pkg/_46541548_7.wxapkg如果顺利的话,会生成一个同名目录。打开这个目录就可以看到了。程序异常、工具异常、代码bug等问题,太常见了。以下异常可能发生在你身上,你可能不理解它们。分享一下我遇到的异常的理解:ThemodulethatsuccessfultooldependsisnotinstalledError:Cannotfindmodule'uglify-es'atFunction.Module._resolveFilename(internal/modules/cjs/loader.js:581:15)在Function.Module._load(internal/modules/cjs/loader.js:507:25)在Module.require(internal/modules/cjs/loader.js:637:17)在require(internal/modules/cjs/helpers.js:22:18)在Object.(/Users/whidy/webs/wxappUnpacker/wuJs.js:3:16)在Module._compile(internal/modules/cjs/loader.js:689:30)在Object.Module._extensions..js(internal/modules/cjs/loader.js:700:10)在Module.load(internal/modules/cjs/loader.js:599:32)在tryModuleLoad(internal/modules/cjs/loader.js:538:12)atFunction.Module._load(internal/modules/cjs/loader.js:530:3)那说明你没有安装好依赖,执行npmrunuglify-又是。无法识别的包...保存文件...解压完成。/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104}elsethrowError("Thispackageisunrecognizable.\nMaybethispackageisasubPackagewhichshouldbeunpacked使用-s=。\n否则,请手动解密每种类型的文件。")^Error:Thispackageisunrecognizable.MaybethispackageisasubPackagewhichshouldbeunpackagewhichshouldbeunpackagewith-s=.Otherwise,请手动解密每种类型的文件。在Array.packDone(/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104:14)在CntEvent.decount(/Users/whidy/webs/wxappUnpacker/wuLib.js:17:43)在ioLimit.runWithCb.err(/Users/whidy/webs/wxappUnpacker/wuLib.js:73:11)在代理(/Users/whidy/webs/wxappUnpacker/wuLib.js:54:14)在FSReqWrap.oncomplete(fs.js:141:20)貌似很顺利,东西也出来了,结果最后还是报错了。推断是包中有包,子包解压失败。更多信息,你可以阅读:https://github.com/qwerty4721...Undefined$gwxSavingfiles...Unpackdone./Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104}elsethrowError("This包无法识别。\n可能是这个包是一个子包,应该用-s=解包。\n否则,请手动解密每种类型的文件。")^错误:这个包无法识别。可能是这个包是一个子包,应该使用-s=解包。否则,请手动解密每种类型的文件。在Array.packDone(/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104:14)在CntEvent.decount(/Users/whidy/webs/wxappUnpacker/wuLib.js:17:43)在ioLimit.runWithCb.err(/Users/whidy/webs/wxappUnpacker/wuLib.js:73:11)在代理(/Users/whidy/webs/wxappUnpacker/wuLib.js:54:14)在FSReqWrap.oncomplete(fs.js:141:20)这个需要修改工具源码,打开wuWxss.js文件,修改内容如下://OriginalfunctionrunVM(name,code){letwxAppCode={},handle={cssFile:name};升etvm=newVM({sandbox:Object.assign(newGwxCfg(),{__wxAppCode__:wxAppCode,setCssToHead:cssRebuild.bind(handle)})});vm.run(代码);for(letnameinwxAppCode)if(name.endsWith(".wxss")){handle.cssFile=path.resolve(frameName,"..",name);wxAppCode[名称]();}}更改为新的:functionrunVM(name,code){letwxAppCode={},handle={cssFile:name};让gg=newGwxCfg();让tsandbox={$gwx:GwxCfg.prototype["$gwx"],__mainPageFrameReady__:GwxCfg.prototype["$gwx"],__wxAppCode__:wxAppCode,setCssToHead:cssRebuild.bind(handle)};letvm=newVM({sandbox:tsandbox});vm.run(代码);for(letnameinwxAppCode)if(name.endsWith(".wxss")){handle.cssFile=path.resolve(frameName,"..",name);wxAppCode[名称]();}}再跑一次,宾果游戏!总结一切都好总的来说,这个操作还是比较容易的,最大的难点就是找文件的方法。该工具已由其他人编写。如果有问题,Issue上有很多解决方案,很快就会解决。如果想实现更多,也可以参考工具的文档,通过不同的命令进行操作。当然,有必要在本地缓存小程序,以提高加载速度。微信官方可能已经知道这件事了,所以我觉得也可能被屏蔽了。可能这个微信官方只是简单的封装了一下,所以更容易破解。如果他打包加密,以后可能就很难了。这也让我想起,很多年前,我也做过类似的事情。大约8年前,我在玩安卓手机的时候,解锁了Bootload,开启了Root。个性化的手机几乎无处不在,一键root,一键解锁的工具很多,所以当时安卓手机的安全性很低,新手用户看不懂,不小心投毒发小广告.当时Wifi万能钥匙也很流行,流量很贵。经常上网,然后去系统目录下找存放wifi的配置文件查看别人的wifi密码。然后用这个密码试试admin/password,看看路由什么的,不过我没弄坏。嗯,如果还有不明白的可以留言。有空我会分析一下这个工具的实现,顺便试试其他小程序(SWAN,今日头条,支付宝等)。相似吗?等等结论又来了~