当前位置:首页 > IT技术 > 微信平台 > 正文

看见有意思的小程序想借鉴一下?10分钟带你学会微信小程序的反编译
2021-07-26 10:10:06

 

以中银E路通小程序为例介绍下小程序反编译操作流程

实验环境

  • 操作系统:MacOS10.13.6

  • node:v10.8.0

  • 微信开发者工具:Stable v1.02.1910120

前置准备

  • 需要安装pc端模拟器工具可以选择网易MuMu,或者其它模拟器

  • 模拟器设置中配置共享文件夹

  • 下载反编译工具wxappUnpacker

模拟器内软件安装

需要安装以下两个软件

看见有意思的小程序想借鉴一下?10分钟带你学会微信小程序的反编译_微信小程序

  • RE文件管理器(查看小程序压缩包)

  • 微信(使用微信打开小程序以下载小程序包)

获取小程序包

1.使用自己手机上的微信打开"中银E路通"小程序,可以添加到"我的小程序"
2.打开模拟器的微信并登录
3.在模拟器微信的下拉小程序最近使用历史中打开"中银E路通",如果历史记录中没有就在我的小程序中找一找
4.打开小程序等待加载之后就可以去找源码包了
5.打开RE文件管理器,进入到以下路径查找源码包(可以根据下载时间区分出你想要的源码包)

  1. /data/data/com.tencent.mm/MicroMsg/4c8188dbf07eec893d0ac90974657aeb/appbrand/pkg

6.拷贝小程序包至模拟器共享文件夹,为了方便解包重命名为zyel

 

看见有意思的小程序想借鉴一下?10分钟带你学会微信小程序的反编译_微信小程序_02

获取完毕。

开始解包

解包流程

1.进入克隆下来的反编译工具根目录
如果没有安装过npm包就先执行安装

  1. npm install

2.解包

  1. node wuWxapkg.js <path/to/zyel.wxapkg>

可以看到命令行输出如下提示

  1. Unpack file zyel2.wxapkg...

  2.  

  3. Header info:

  4. firstMark: 0xbe

  5. unknownInfo: 0

  6. infoListLength: 1547

  7. dataLength: 971189

  8. lastMark: 0xed

  9.  

  10. File list info:

  11. fileCount: 42

  12. { name: '/components/home/images/home-icon1.png',

  13. off: 1561,

  14. size: 2969 }

  15. { name: '/components/home/images/home-load-btn.png',

  16. off: 4530,

  17. size: 235 }

  18. { name: '/components/key/imgs/back.png', off: 4765, size: 4369 }

  19. { name: '/images/arrow-right.png', off: 9134, size: 223 }

  20. { name: '/images/detailsCoins-btn1-ac.png',

  21. off: 9357,

  22. size: 1180 }

  23. { name: '/images/detailsCoins-btn1.png', off: 10537, size: 614 }

  24. { name: '/images/detailsCoins-btn2-ac.png',

  25. off: 11151,

  26. size: 936 }

  27. { name: '/images/detailsCoins-btn2.png', off: 12087, size: 546 }

  28. { name: '/images/home-ac.png', off: 12633, size: 2281 }

  29. { name: '/images/home.png', off: 14914, size: 1565 }

  30. { name: '/images/mine-ac.png', off: 16479, size: 2324 }

  31. { name: '/images/mine-icon1.png', off: 18803, size: 1115 }

  32. { name: '/images/mine-icon3.png', off: 19918, size: 852 }

  33. { name: '/images/mine-icon4.png', off: 20770, size: 1038 }

  34. { name: '/images/mine-icon5.png', off: 21808, size: 1039 }

  35. { name: '/images/mine-icon6.png', off: 22847, size: 9137 }

  36. { name: '/images/mine-icon7.png', off: 31984, size: 1796 }

  37. { name: '/images/mine.png', off: 33780, size: 1682 }

  38. { name: '/images/ranking-one.png', off: 35462, size: 4883 }

  39. { name: '/images/ranking-three.png', off: 40345, size: 4993 }

  40. { name: '/images/ranking-two.png', off: 45338, size: 4928 }

  41. { name: '/images/shop-ac.png', off: 50266, size: 2393 }

  42. { name: '/images/shop.png', off: 52659, size: 1807 }

  43. { name: '/app-config.json', off: 54466, size: 18010 }

  44. { name: '/app-service.js', off: 72476, size: 728734 }

  45. { name: '/pages/CSR/CSR.html', off: 801210, size: 3759 }

  46. { name: '/pages/card/card.html', off: 804969, size: 5518 }

  47. { name: '/pages/coinRecord/coinRecord.html',

  48. off: 810487,

  49. size: 3832 }

  50. { name: '/pages/coinShop/coinShop.html', off: 814319, size: 469 }

  51. { name: '/pages/detailsCoins/detailsCoins.html',

  52. off: 814788,

  53. size: 4498 }

  54. { name: '/pages/home/home.html', off: 819286, size: 5043 }

  55. { name: '/pages/integralDec/integralDec.html',

  56. off: 824329,

  57. size: 3153 }

  58. { name: '/pages/integralTask/integralTask.html',

  59. off: 827482,

  60. size: 5007 }

  61. { name: '/pages/login/login.html', off: 832489, size: 1649 }

  62. { name: '/pages/mine/mine.html', off: 834138, size: 2429 }

  63. { name: '/pages/orderList/orderList.html',

  64. off: 836567,

  65. size: 5701 }

  66. { name: '/pages/ranking/ranking.html', off: 842268, size: 4388 }

  67. { name: '/pages/share/share.html', off: 846656, size: 5327 }

  68. { name: '/pages/shop/creditBuy.html', off: 851983, size: 2730 }

  69. { name: '/pages/shop/shop.html', off: 854713, size: 3175 }

  70. { name: '/pages/welfare/welfare.html', off: 857888, size: 751 }

  71. { name: '/page-frame.html', off: 858639, size: 114111 }

  72. Saving files...

  73. Unpack done.

  74. Split app-service.js and make up configs & wxss & wxml & wxs...

  75. Decompile ./pages/CSR/CSR.wxml...

  76. Decompile success!

  77. Decompile ./pages/card/card.wxml...

  78. Decompile success!

  79. Decompile ./pages/coinRecord/coinRecord.wxml...

  80. Decompile success!

  81. Decompile ./pages/coinShop/coinShop.wxml...

  82. Decompile success!

  83. Decompile ./pages/detailsCoins/detailsCoins.wxml...

  84. Decompile success!

  85. Decompile ./pages/home/home.wxml...

  86. Decompile success!

  87. Decompile ./pages/integralDec/integralDec.wxml...

  88. Decompile success!

  89. Decompile ./pages/integralTask/integralTask.wxml...

  90. Decompile success!

  91. Decompile ./pages/login/login.wxml...

  92. Decompile success!

  93. Decompile ./pages/mine/mine.wxml...

  94. Decompile success!

  95. Decompile ./pages/orderList/orderList.wxml...

  96. Decompile success!

  97. Decompile ./pages/ranking/ranking.wxml...

  98. Decompile success!

  99. Decompile ./pages/share/share.wxml...

  100. Decompile success!

  101. Decompile ./pages/shop/creditBuy.wxml...

  102. Decompile success!

  103. Decompile ./pages/shop/shop.wxml...

  104. Decompile success!

  105. Decompile ./pages/welfare/welfare.wxml...

  106. Decompile success!

  107. Guess wxss(first turn)...

  108. Splitting "/Users/gangxue/demo/wxappUnpacker/zyel/app-service.js" done.

  109. Import count info: {}

  110. Guess wxss(first turn) done.

  111. Generate wxss(second turn)...

  112. Generate wxss(second turn) done.

  113. Save wxss...

  114. Split and make up done.

  115. Delete files...

  116. Deleted.

  117.  

  118. File done.

  119. Total use: 3148.983ms

3.如果想单独执行config、js、wxml、wxss的反编译可以在解包时加-o参数不做后续操作

工具用法

  • node wuConfig.js<files...> 将 app-config.json 中的内容拆分到各个文件对应的 .json 和 app.json , 并通过搜索 app-config.json 所在文件夹下的所有文件尝试将 iconData 还原为 iconPath 。

  • node wuJs.js<files...> 将 app-service.js (或小游戏中的 game.js ) 拆分成一系列原先独立的 javascript 文件,并使用 Uglify-ES 美化,从而尽可能还原编译前的情况。

  • node wuWxml.js[-m]<files...> 将编译/混合到 page-frame.html ( 或 app-wxss.js ) 中的 wxml 和 wxs 文件还原为独立的、未编译的文件。如果加上 -m指令,就会阻止 block块自动省略,可能帮助解决一些相关过程的 bug 。

  • node wuWxss.js<dirs...> 通过获取文件夹下的 page-frame.html ( 或 app-wxss.js ) 和其他 html 文件的内容,还原出编译前 wxss 文件的内容。

  • node wuWxapkg.js[-o][-d][-s=<MainDir>]<files...> 将 wxapkg 文件解包,并将包中上述命令中所提的被编译/混合的文件自动地恢复原状。如果加上 -o指令,表示仅解包,不做后续操作。如果加上 -d指令,就会保留编译/混合后所生成的新文件,否则会自动删去这些文件。同时,前面命令中的指令也可直接加在这一命令上。~~而如果需要解压分包,请先解压主包,然后执行 node wuWxapkg.js[-d]-s=<MainDir><subPackages...>,其中 MainDir为主包解压地址。除 -d与 -s外,这些指令两两共存的后果是未定义的(当然,是不会有危险的)。~~

导入开发者工具

打开微信开发者工具,导入项目即可
注意在中银E路通解包后的项目设置中

  • 注意勾选不校验合法域名

  • 勾掉e6转es5(这个小程序貌似并没有使用es6语法)

看见有意思的小程序想借鉴一下?10分钟带你学会微信小程序的反编译_微信小程序_03

解包其它小程序可能项目配置略有不同。

看见有意思的小程序想借鉴一下?10分钟带你学会微信小程序的反编译_微信小程序_04

本文摘自 :https://blog.51cto.com/x

开通会员,享受整站包年服务立即开通 >