2023年12月14日发(作者:)

反编译小程序遇到的问题以及如何反编译

一些说明

在找寻wxapkg包的时候,有一个大约10M的wxapkg的包反编译出来没有pages、lib等文件夹,并且这个包反编译会报This package is

unrecognizable或者 not a directory, scandir 'D:223_1123949441_'错误,这个包有可能是微信小程序运

行的一些核心包

分包和主包的文件名下划线后面的数字都是一样,主包的大小要比分包大

遇到的问题

编译报magic number is not correct

【描述】我遇到这种情况是因为我直接用的是电脑版微信文件下的 .wxapkg文件

【解决】直接在安卓模拟器上登录微信,获取模拟器上的 .wxapkg文件

编译出来没有wxss文件 vd_version_info is not define

【解决】只需要进文件里修改一下方法就行,找到function runOnce() 方法,修改成以下代码:

function runOnce() {

for (let name in runList) {

var start = `var window = window || {}; var __pageFrameStartTime__ = (); 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 + " rn" + runList[name]);

}

}

修改wxWxss文件的runVm函数 ,改为

function runVM(name, code) {

let wxAppCode = {};

let handle = {cssFile: name};

let gg = new GwxCfg();

let tsandbox = {

$gwx: ype["$gwx"],

__mainPageFrameReady__: ype["$gwx"], //解决 $gwx is not defined

__vd_version_info__: ype["$gwx"], //解决 __vd_version_info__ is not defined

__wxAppCode__: wxAppCode,

setCssToHead: (handle)

}

let vm = new VM({sandbox: tsandbox});

(code);

for (let name in wxAppCode) {

if (th(".wxss")) {

e = e(frameName, "..", name);

wxAppCode[name]();

}

}

}

【未解决】反编译wxss文件时报错 SyntaxError: Unexpected end of input

.wxapkg不是微信小程序的包

【报错】This package is unrecognizable 或者 not a directory, scandir 'D:223_1123949441_'

【说明】当前反编译的包不是工程文件夹,里面都是微信的基础包,无需还原。

【未解决】Illegal return statement

【问题说明】反编译其他的包可以,但是反编译这个包就报错了

【解决】我觉得可能是 wxappUnpacker 不支持反编译新开发的小程序;去gitub上查找最新的 wxappUnpacker,重新安装依赖,就可以

避免这个问题。

在解决了上面的问题后,js和wxml都可以反编译得到,但是wxss不能得到,同时出现下面这个错误;希望有大佬路过,可以解决这个问

题,谢谢。

我猜想可能是因为这个小程序采用了分包才导致的这个问题,当我反编译其他没有采用分包的小程序的时候,就得到了所有的文件,包括

wxss。

请选择/ 的目录

【解决】将项目下的 改名为

成功截图

手动获取相关的js代码

如果你想学习一下别人的代码逻辑,但是用上面的方法得不到js代码,可以试着手动来得到js代码,尤其是分包中的js代码。

对于主包,如果用上面的方法只能得到空文件,那么就可以试试下面这些单独的命令来得到 js,wxml,wxss等代码源码

- `node <...>` 将 中的内容拆分到各个文件对应的 .json 和 , 并通过搜索 app-

所在文件夹下的所有文件尝试将 iconData 还原为 iconPath 。

- `node <...>` 将 (或小游戏中的 ) 拆分成一系列原先独立的 javascript 文件,并使用

Uglify-ES 美化,从而尽可能还原编译前的情况。如果是子包的,则需要另外处理(和主包的保持结构一致定

义了__wxAppCode__,并没有`$gwx('init', global);`)

- `node [-m] <>` 将编译/混合到 ( 或 或 ) 中的 wxml 和 wxs 文件还

原为独立的、未编译的文件。如果加上`-m`指令,就会阻止`block`块自动省略,可能帮助解决一些相关过程的 bug 。

- `node <>` 通过获取文件夹{{dirs}}下的 ( 或 ) 和其他 html 文件的内容,还原出编译

前 wxss 文件的内容。

- `node [-o] [-d] [-s=

] <>` 将 wxapkg 文件解包,并将包中上述命令中所提的被编译/混合的文件自动地

恢复原状。如果加上`-o`指令,表示仅解包,不做后续操作。如果加上`-d`指令,就会保留编译/混合后所生成的新文件,否则会自动删去

这些文件。同时,前面命令中的指令也可直接加在这一命令上。而如果需要解压分包,请先解压主包,然后执行`node [-d]

-s=

<>`,其中`Main Dir`为主包解压地址。除`-d`与`-s`外,这些指令两两共存的后果是未定义的(当然,是

不会有危险的)。

微信小程序中js相关的代码都在 中,在下面这段代码中,/bookingSuccess/是js文件名【绿色的】,

其中 define()括号中 "use strict"; 和 }); require("/bookingSuccess/");之间的代码为 js文件的内容【红色的】。在

文件中,你只需要关心类似于下面这段代码的其他代码,一般在最后。

__wxRoute = ‘/bookingSuccess/bookingSuccess’;__wxRouteBegin = true; wxAppCurrentFile =

‘/bookingSuccess/’; define("/ b o o k i n g S u c c e s s / b o o k i n g S u c c e s s . j s

color{#228B22}{/bookingSuccess/}/bookingSuccess/", function(require, module,

exports,

{ “use strict”; Page({data:{num:0,time:"",shopName:""},onLoad:function(n)

{a({num:,time:,shopName:me}),areMenu()},myBooking:function()

{ctTo({url:"/myYuyue/myYuyue"})},onReady:function(){},onShow:function(){},onHide:function()

{},onUnload:function(){},onPullDownRefresh:function(){},onReachBottom:function(){},onShareAppMessage:function(){}});

}); require("/ b o o k i n g S u c c e s s / b o o k i n g S u c c e s s . j s color{#228B22}

{/bookingSuccess/}/bookingSuccess/");

window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSoc

提示:这里的js代码需要自己手动美化(有很多在线美化js的网站)

如下图,有三个js文件,绿框为文件名,红框为文件内容,黑框可以作为寻找标识。

最后将 !0 批量替换成 false; !1批量替换成 true

wxss和wxml 的代码在 ,例如想获取 /bookingSuccess/的内容:将以下代码另存为html文件

首先搜索 wxAppCode[’/bookingSuccess/’] = setCssToHead,可以看到setCssToHead是一个函数

将函数的第一个参数(数组)替换为以下html代码中setCssToHead的第一个参数

最后运行html就可以得到wxss

结果:

但是这个只能在iPhone 6上适配,需要改成rpx,方能适配其他的设备终端。rpx和px 的转换公式:

rpx = px * 2

px = rpx / 2

经过转换后,问题就完美解决