反编译获取微信小程序源码(包含错误解决办法)

PS:本文章仅用于分享自己反编译的过程以及解决办法,切勿小程序反编译成功后做一些违反人伦的事情!

一. 前言

    最近在搞学校的一个晚签到小程序的时候遇到了一个MD5加密问题,试了好多方法都没有解决,所以就想看看小程序的源码,就Google了一些反编译教程,在反编译过程中,每次都会报一些莫名的错误,然后自己又去百度,踩了不少的坑,终于把小程序的源码给搞到手了,成功解决了MD5加密问题,自动签到成功完成。

三. 准备

  1. node.js运行环境 ①. ,安装node.js,一路next,安装完成后将node.js设置为环境变量。 ②. 打开cmd,测试是否安装成功,在命令行输入node -v,如下: D:>node -v 结果:v12.13.1
  2. 下载反编译脚本 ① 最新地址: ② 用cd命令进入到你clone或者下载好的反编译脚本目录下,下载好后将wxappUnpacker.zip文件解压出来

四. 拿到 .wxapkg包

五. 使用反编译脚本解包 wxapkg

  1. 打开从GitHub上clone或者下载好的反编译脚本的目录,然后按住SHIFT同时点鼠标右键,打开PowerShell。
  2. 依次安装以下依赖,全部安装完。 npm install esprima -g npm install css-tree -g npm install cssbeautify -g npm install vm2 -g npm install uglify-es -g npm install js-beautify -g 这些 node.js 程序之间也有一定的依赖关系 。

六. 报错

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

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)
Saving files...
	Unpack done.
	/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104
  		    }else throw 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.")


  	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)

3. $gwx is not defined问题,这种报错是最多的一种

Saving files...
Unpack done.
/Users/whidy/webs/wxappUnpacker/wuWxapkg.js:104
    }else throw 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.")
          ^
ReferenceError: $gwx is not defined    
	at vm.js:3:3
	at Script.runInContext (vm.js:107:20)
	at VM.run (D:wxappUnpacker-master
ode_modulesvm2libmain.js:208:72)
	at runVM (D:wxappUnpacker-masterwuWxss.js:69:6)
	at runOnce (D:wxappUnpacker-masterwuWxss.js:97:27)

解决方法:打开脚本wuWxss.js代码 将原来的代码

functionrunVM(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]();
    }
}

替换为

functionrunVM(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]();
    }
}
function runOnce() {           }

替换为

function runOnce() {
for (let name in runList) {
// console.log(name, runList[name]);
var start = `var window = window || {}; var __pageFrameStartTime__ = Date.now(); var __webviewId__; var __wxAppCode__={}; var __mainPageFrameReady__ = function(){}; var __WXML_GLOBAL__={entrys:{},defines:{},modules:{},ops:[],wxs_nf_init:undefined,total_ops:0}; var __vd_version_info__=__vd_version_info__||{};
$gwx=function(path,global){
if(typeof global === undefined) global={};if(typeof __WXML_GLOBAL__ === undefined) {__WXML_GLOBAL__={};
}__WXML_GLOBAL__.modules = __WXML_GLOBAL__.modules || {};
}`;
runVM(name, start + " 
" + runList[name]);
}
}
经验分享 程序员 微信小程序 职场和发展