最近想用微信開發者工具運行別人開發好的小游戲。 其實是可以運行的,但是登錄驗證失敗, 別人開發的小游戲appid, 和自己測試appid不一樣就導致登錄失敗了。
如果強行設置別人的appid, 開發者工具會報錯, 類似的錯誤提示為:你不是別人的appid的開發者, 無法設置。
登錄是用wx.login API登錄, 把這個API破解不久好了, 不必一定要設置成別人的appid.
將wxapkg解壓出的game.js 進行拆分成多個文件。
#coding:utf8 import os import re def writeFile(o): print(o[0]) path = os.path.dirname(o[0]) if path!='' and not os.path.exists(path): os.makedirs(path) with open(o[0], 'wb') as f: f.write(bytes(o[1], 'utf8')) def splitGame(filecon): if filecon is None: print ('文件內容為空') return ; obj = re.findall(r'\W+define\(\"(.*?)\",\Wfunction\(require,\Wmodule,\Wexports\)\{ \t\t\t\n(.*?)\W\t\t\t\}\)\;\n', filecon, re.M|re.DOTALL) if obj: for o in obj: writeFile(o) else: print ('沒有匹配到') def readCon(name): with open(name, 'r') as f: return f.read() splitGame(readCon('game2.js')) # splitGame(readCon('subContext.js'))
通過一系列斷點, 找到了兩處appid的地方,
asdebug.js文件:
__devtoolsConfig.appid.
__wxConfig.accountInfo.appid
看到這里,我已經懶得跟蹤asdebug.js在哪了, 因為是全局變量,登錄時候hook一下這兩個變量就OK了.
============
通過實際測試,發現該方案不行, 原因是asdebug是在VM中運行的,此window非game.js中的window。
執行之后, hook的實際是 Window.0. 實際全局: __global.parent
==========
通過一通搗騰之后, 發現即使hook修改了appid, 還不能通過驗證, 原因調用wx.login的時候壓根就沒有appid信息。
調用wx.login的時候發送了一個websocket請求。 截圖時返回的結果。
服務進程:/Applications/wechatwebdevtools.app/Contents/Frameworks/nwjs Framework.framework/Versions/86.0.4240.111/Helpers/wechatwebdevtools Helper (Renderer).app/Contents/MacOS/wechatwebdevtools Helper (Renderer)
有時間再調試下這個進程。
core.wxvpkg 文件有RSA-SHA1簽名驗證。理論上不可以修改。 但是把簽名驗證的方法hook掉, 還是可以的。 通過此法我修改了core.wxvpkg文件,發現可以正常運行了。
wx.login本質上是調用http post接口
獲取code碼:
curl -H 'host: servicewechat.com' --data-binary '{"scope":["snsapi_base"]}' 'https://servicewechat.com/wxa-dev-logic/jslogin?_r=0.700034971603429&newticket=tl1MUNfnG4w1C9n8DyWnxbJB1XrdZuhXDwuC3FrmZag&appid=wx418ad5760dd5bcba&platform=0&ext_appid=&os=darwin&clientversion=1052102020'
hook 輸出日志
setTimeout((function(){ const request = require("request"); var exec = require('child_process').exec; function dzqLog(m, a) { request({ url: "http://localhost:3000/echo", method: "POST", json: true, headers: { "content-type": "application/json", }, body: { m, a }, }); } try { var cmd = 'netstat -anp tcp | grep 3000 | grep LISTEN'; exec(cmd, function(error, stdout, stderr) { // alert('stdout:' + stdout) console.log(String(stdout)); if(String(stdout) !== ''){ console.log = function () { dzqLog("log", Array.from(arguments)); }; console.error = function () { dzqLog("error", Array.from(arguments)); }; console.info = function () { dzqLog("info", Array.from(arguments)); }; } }); } catch (error) { console.error(error.message); } // var oldRe = require; // require = function(s){ // console.log(s); // return oldRe(s); // }; // window && (window.require = require); // global && (global.require = require); // const xxx = require("../../../core.wxvpkg/e9e6a17485b9188c4c1ecada87e6b99c.js"); // ["checkBufferSignature", "checkSignature", "checkFileMd5Signature"].forEach( // (k) => { // xxx[k] = () => true; // } // ); }), 1000);
文件地址: /Applications/wechatwebdevtools.app/Contents/Resources/package.nw/js/unpack/hackrequire/index.js
日志效果圖:
結論:
wx.login 不可能破解,原因是code碼是從服務器拿的,傳入的appid. 服務器會校驗你的微信和appid有沒有開發或者測試權限(這個是項目管理員維護的), 也就是只能拿到你有權限的code碼。想獲取其他的appid的code碼一律失敗,
報錯:
騰訊的安全做的真牛逼