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=
恢复原状。如果加上`-o`指令,表示仅解包,不做后续操作。如果加上`-d`指令,就会保留编译/混合后所生成的新文件,否则会自动删去
这些文件。同时,前面命令中的指令也可直接加在这一命令上。而如果需要解压分包,请先解压主包,然后执行`node [-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
结果:
var __wxAppCode__= __wxAppCode__ || {};
var BASE_DEVICE_WIDTH = 750;
var isIOS=("iPhone");
var deviceWidth = || 375;
var deviceDPR = PixelRatio || 2;
var checkDeviceWidth = window.__checkDeviceWidth__ || function() {
var newDeviceWidth = || 375
var newDeviceDPR = PixelRatio || 2
var newDeviceHeight = || 375
if (ation && /^landscape/.test( || '')) newDeviceWidth = newDeviceHeight
if (newDeviceWidth !== deviceWidth || newDeviceDPR !== deviceDPR) {
deviceWidth = newDeviceWidth
deviceDPR = newDeviceDPR
}
}
checkDeviceWidth()
var eps = 1e-4;
var transformRPX = window.__transformRpx__ || function(number, newDeviceWidth) {
if ( number === 0 ) return 0;
number = number / BASE_DEVICE_WIDTH * ( newDeviceWidth || deviceWidth );
number = (number + eps);
if (number === 0) {
if (deviceDPR === 1 || !isIOS) {
return 1;
} else {
return 0.5;
}
}
return number;
}
window.__rpxRecalculatingFuncs__ = window.__rpxRecalculatingFuncs__ || [];
var __COMMON_STYLESHEETS__ = __COMMON_STYLESHEETS__||{}
var setCssToHead = function(file, _xcInvalid, info) {
var Ca = {};
var css_id;
var info = info || {};
var _C = __COMMON_STYLESHEETS__
function makeup(file, opt) {
var _n = typeof(file) === "string";
if ( _n && Property(file)) return "";
if ( _n ) Ca[file] = 1;
var ex = _n ? _C[file] : file;
var res="";
for (var i = - 1; i >= 0; i--) {
var content = ex[i];
if (typeof(content) === "object")
{
var op = content[0];
if ( op == 0 )if ( op == 0 )res = transformRPX(content[1], Width) + "px" + res;else if ( op == 1)res = + res;else if ( op == 2 )res = makeup(content[1], opt) + res;}elseres = content + res}return res;}var styleSheetManager = window.__styleSheetManager2__var rewritor = function(suffix, opt, style){opt = opt || {};suffix = suffix || ""; = suffix;if ( llegalSelector != undefined && _xcInvalid != undefined ){if ( llegalSelector )( "For developer:" + _xcInvalid );else{( _xcInvalid );}}Ca={};css = makeup(file, opt);if (styleSheetManager) {var key = ( || ()) + ':' + suffixif (!style) {m(key, );window.__rpxRecalculatingFuncs__.push(function(size){Width = ;rewritor(suffix, opt, true);});}(key, css);return;}if ( !style ){var head = || mentsByTagName('head')[0];style = Element('style'); = 'text/css';ribute( "wxss:path", );Child(style);window.__rpxRecalculatingFuncs__.push(function(size){Width = ;rewritor(suffix, opt, style);});}if (heet) {t = css;} else {if ( == 0 )if ( == 0 )
Child(TextNode(css));
else
odes[0].nodeValue = css;
}
return css
}
return rewritor;
}
__wxAppCode__['pages'] = setCssToHead([".",[1],"container{background-color:#f7f7f7}n.",
[1],"gray{color:#dcdcdc!important}n.",[1],"purple{color:#9f8bea!important}n.",[1],"repair-state-panel,.",[1],"work-sheet-
panel{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;margin-top:",[0,15],"}n.",[1],"repair-
state-title,.",[1],"work-sheet-title{color:#888;padding:",[0,5]," 0 ",[0,10]," ",[0,30],"}n.",],undefined,{path:"./pages"});
(__wxAppCode__['pages']("",{deviceWidth:375},))
但是这个只能在iPhone 6上适配,需要改成rpx,方能适配其他的设备终端。rpx和px 的转换公式:
rpx = px * 2
px = rpx / 2
经过转换后,问题就完美解决


发布评论