微信開發者工具分析


最近想用微信開發者工具運行別人開發好的小游戲。    其實是可以運行的,但是登錄驗證失敗, 別人開發的小游戲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碼一律失敗,

報錯:

DEV_APP_NOT_BAND: -80002

騰訊的安全做的真牛逼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM