GithubHelp home page GithubHelp logo

wechat-app-unpack's Introduction

wechat-app-unpack

微信小程序解包心得

思路、源码:http://lrdcq.com/me/read.php/66.htm

解包工具:

Python2版本:https://gist.github.com/feix/32ab8f0dfe99aa8efa84f81ed68a0f3e

Python3版本:https://gist.github.com/Integ/bcac5c21de5ea35b63b3db2c725f07ad

PHP版本:https://github.com/Clarence-pan/unpack-wxapkg

JAVA版本:https://github.com/moqi2011/unweapp

nodejs版本:https://github.com/thedreamwork/unwxapkg

Kaitai Struct版本:https://github.com/coolzilj/kaitai_struct_format_for_wxapkg

目前分析如下:

目录

-\pages  每个页面的wxss样式文件

-app-config.json  页面配置的汇总(app.json+各个页面的配置文件)

-app-service.js 源码js的汇总

-page-frame.html wxml文件的汇总

app-config.json

{
      "page":{       //各页面配置
      "pages/index/index.html":{      //页面地址
           "window":{"navigationBarTitleText":""}     //页面配置
      }
       ...
  },
  "entryPagePath":"pages/index/index.html",   //小程序入口地址
  "pages":["pages/index/index"],  //页面列表
  "global":{      //全局页面配置
      "window":{
          "backgroundTextStyle":"light",
          "navigationBarBackgroundColor":"#0a83b1",
          "navigationBarTitleText":"",
          "navigationBarTextStyle":"#fff"
      }
  }
}

中文<->16进制在线互转:

https://www.bejson.com/convert/ox2str/

app-service.json

var __wxAppData = {};
var __wxRoute;
var __wxRouteBegin;
var global = {};

//一些第三方的js源码(所以不同小程序一般都不一样)
define(
    "utils/util.js", 
    function(require, module, exports, window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSocket,Reporter,webkit,WeixinJSCore){
    ...
    });
define(
    "app.js", 
    function(require, module, exports, window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSocket,Reporter,webkit,WeixinJSCore){
    ...
    });
require("app.js");
...

//每个页面对应的js源码
__wxRoute = 'pages/index/index';//页面路由地址
__wxRouteBegin = true; 
define(
    "pages/index/index.js", //js地址
    function(require, module, exports, window,document,frames,self,location,navigator,localStorage,history,Caches,screen,alert,confirm,prompt,XMLHttpRequest,WebSocket,Reporter,webkit,WeixinJSCore){
        //js源码
    });
require("pages/index/index.js");
...

page-frame.html

2018-01-27更新:由于还原总是不那么完美,便重新写了一个wxml分析器(在wxmlana中),可以用于对照混淆代码和还原后的代码(感谢q群[211691897]中各位大佬的帮忙)

2018-01-31更新:由于安全问题,以后不再提供wxml分析器的源码,稍晚时间会提供在线版的分析器供大家使用

目前分析器理论上支持以下几个版本:

v0.6vv_20170214_fbi
v0.6vv_20170919_fbi_wxs
v0.6vv_20171120_cua_xc
v0.6vv_20171201_cua_xc
v0.6vv_20171208_cua_xc
v0.6vv_20180104_fbi
v0.6vv_20180111_fbi

目前我分析了一小部分代码,写了个解析器,可以手动一个页面一个页面还原出wxml源码,但还无法解析变量(就是{{}}这一类的)

2018-01-04更新:可以解析单变量形式(如{{index}}),但表达式形式的还无法解析

2018-01-04更新:可以解析单变量形式(如{{index}})、表达式形式(如{{count?1:2}})

2018-01-04更新:可以解析block以及wx:for、wx:key

2018-01-09更新:修复部分bug,template模板组件还无法解析

2018-01-09更新:想到一个新思路还原源码,不再需要手动拷贝代码出来,防止变量丢失

2018-01-10更新:通过多人探讨发现,不同小程序可能由于编译上线时间不同,其中的函数及变量也发生了变化,目前analysis.js中的函数仅支持替换page-frame.html中版本为:

window.__wcc_version__ = 'v0.6vv_20170905_fbi_wxs'

如有其他版本的请将版本号以及对应的小程序名称发至Issues中,我会抽时间来研究

打开page-frame.html,将文件夹(wxmlana)下的ana.js引入

    <script src="ana.js"></script>

打开文件夹(wxmlana)下的analysis.js,按照对应的函数名称,替换page-frame.html中的函数

    //原page-frame.html中的名称:
    function _v(k) {...}
    function _n(tag){...}
    function $gwrt(should_pass_type_info){...}
    function wfor(to_iter, func, env, _s, global, father, itemname, indexname, keyname, o){...}
    if (path && e_[path]) {...}

注释掉page-frame.html中的 nf_init() :

    ...
    //nf_init();
    ...

在chrome中打开page-frame.html,在控制台(console)中输入:

    //解析单个wxml
    $gwx("...wxml地址...")();        //例如$gwx("./page/API/index.wxml")();

    //解析所有wxml
    $gwx("ana")()

即可获得源码

已知问题

1.template模块组件会被自动加载进源码中

2.会无视带有 wx:if 的组件,但其子组件还是会被还原出来的

wechat-app-unpack's People

Contributors

leo9960 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechat-app-unpack's Issues

解到m13发现一个错误

var m13=function(e,s,r,gg){
var lQ4=e_[x[13]].i
ai(lQ4,x[14],e,x[13],1,1)
var aR4=_m('view',['class',1107,'style',1],[],e,s,gg)
var tS4=_v()
_(aR4,tS4)
var eT4=o(1110,e,s,gg)
var bU4=gd(x[13],eT4,e,d
)
if(bU4){
var oV4=_1(1109,e,s,gg) || {}
var cur_globalf=gg.f
tS4.wxXCkey=3
bU4(oV4,oV4,tS4,gg)
gg.f=cur_globalf
}
else _w(eT4,x[13],3,22)
_(r,aR4)
lQ4.pop()
return r
}

错误内容:
test.html:2748 Uncaught ReferenceError: x is not defined
at m13 (test.html:2748)
at test.html:16740

这是解的哪个版本的包啊?

var r = {
score: t,
times: e,
game_data: JSON.stringify(n)
},
o = {
base_req: {
session_id: a.default.sessionId,
fast: 1
},
action_data: (0, s.encrypt)(r, a.default.sessionId)
};
wx.request({
url: h.AJAX_URL + "/wxagame/wxagame_settlement",
method: "POST",
data: o,
success: function (t) {
i(200 === t.statusCode ? 0 === t.data.base_resp.errcode ?A !0 : !1 : !1)
},
fail: function (t) {
i(!1)
}
})
这个actiondata是怎么加密的,没搞过前端看不太懂

有偿求助:解分包小程序

有偿求助:分包小程序,请联系企鹅4971381

E:\wechat-by\wxappUnpacker-master\node_modules\vm2\lib\main.js:210
throw this._internal.Decontextify.value(e);
^
SyntaxError: Unexpected token }
at VMScript.compile (E:\wechat-by\wxappUnpacker-master\node_modules\vm2\lib
main.js:78:20)
at VM.run (E:\wechat-by\wxappUnpacker-master\node_modules\vm2\lib\main.js:20
4:52)
at wu.get.code (E:\wechat-by\wxappUnpacker-master\wuJs.js:28:6)
at ioLimit.runWithCb (E:\wechat-by\wxappUnpacker-master\wuLib.js:80:8)
at agent (E:\wechat-by\wxappUnpacker-master\wuLib.js:54:14)
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)

我怎么都解不了

我把微信数据打包了 ,解备份包后有很多已经浏览过的小程序,试着解包,解开了,但是就在wxml源码这里解不了,试了很多都不行!

m0可以解出,m1,m2之后的怎么解出

Uncaught TypeError: Cannot read property 'i' of undefined
at m1 (test.html:9)
at test.html:49

var m1 = function (e, s, r, gg) { var f7 = e_['./page/API/pages/action-sheet/action-sheet.wxml'].i _ai(f7, '../../../common/head.wxml', e_, './page/API/pages/action-sheet/action-sheet.wxml', 1, 1) _ai(f7, '../../../common/foot.wxml', e_, './page/API/pages/action-sheet/action-sheet.wxml', 2, 2)..................

这里面的 e_['./page/API/pages/action-sheet/action-sheet.wxml'].i 会报错
_ai 也会报错

能一次把源码也解出吗

wxss还原方法如下

function makeup(file) {
省略.....
}
//return res;
console.log(res);
}
直接打印即可输出,把pages页面的html setCssToHead 放入到这个函数下面即可输出。 不过还原出来,也不是最终源代码。样式一样错位,希望研究看看什么原因

报错 "ap"

"ap" is not definet =====
直接控制台输出的微信代码 是需要复制到新建的wxml里面吗??
谢谢

👍 解出成功

  1. <script src="z.js" charset="UTF-8">></script> 加下编码,不然有的打印出来是乱码
  2. rev 会报replace错误,修复如下:将原来recv函数重命名为irev,新建个中间处理,变量替换有些还是有点问题
    function rev( ops, e, s, g, o ){ var temp = "" + irev(ops, e, s, g, o); if(temp.indexOf("{{") != -1) { return "{{" + ("" + irev(ops, e, s, g, o)).replace(/\{\{/g,"").replace(/\}\}/g,"") + "}}"; } return temp; } function irev( ops, e, s, g, o ){ ...... }

  3. 解出来有的地方会多出> ,类似:
    default

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.