php開發的js逆向rpc框架

失色天空發表於2022-04-25

一、前言

我們在寫爬蟲的時候,經常會遇到各種加密的引數,只能在瀏覽器打斷點然後一步一步的去追程式碼,想辦法把加密部分的js給摳出來在外部呼叫。這個過程漫長且費力,還需要一定的ast能力,容易把人勸退。所以現在有一種思想,直接在外部呼叫瀏覽器內已經生成的函式獲取結果,這就是所謂的js-rpc遠端呼叫。

在白度搜尋js-rpc框架,有pythongo實現的,所以我如法炮製,基於websocket開發了php版本,取名shermie,我個人覺得使用起來更方便一些,先上效果圖:

  • 服務端

  • 瀏覽器

  • 訪問

  • 程式碼

二、使用方法

  • 啟動服務

進入bin目錄,在命令列執行下面的命令

./cli.exe Websocket.php
  • 瀏覽器執行

1.在瀏覽器建立Websocket連線(把Websocket.js裡面的複製出來貼上到瀏覽器命令列執行),會返回一個client物件

2.在client物件上註冊需要呼叫的js函式

# 假設我們需要透過http呼叫btoa這個函式,第一個引數隨便命名,第二個引數是函式執行的內容

client.registeCall("btoa",function(params){
    let result = window.btoa(params);
    resolve(result);
});

# 會輸出一個訪問地址,比如這樣

[2022/4/24 18:16:01][info]  連線到伺服器成功
> client.registeCall("btoa",function(resolve,params){
    let result = window.btoa(params);
    resolve(result);
});
[2022/4/24 18:16:52][info]  註冊函式btoa成功
[2022/4/24 18:16:52][info]  訪問地址:http://127.0.0.1:9501/call?group=ef8d3da2-dca4-4236-ba99-82f76a5e1901&action=btoa&input=

# 引數說明

group:客戶端分組ID(不用管)

action:註冊的需要呼叫的函式(不用管)

input:呼叫這個函式傳入的引數(需要填寫)
  • 訪問地址獲取結果
    訪問上面列印的地址,並傳入自定義引數:http://127.0.0.1:9501/call?group=df777a58-ff44-41bb-81ce-935b6bea9c25&action=btoa&input="hh"最終返回的就是:window.btoa(“hh”)執行的結果

三、說明

github不能上傳超過100m的檔案,所以只能貼一個外部下載連結了,程式碼倉庫只包含最新的php檔案和js檔案,cli.exe請在檔案地址裡面下載

檔案地址:share.weiyun.com/xKKhm1MC
程式碼倉庫:github.com/kxg3030/js-rpc

四、缺陷

不能在斷點的地方植入ws指令碼,如果你想在某個斷點處直接建立ws連線然後呼叫斷點上下文中的方法是行不通的,瀏覽器渲染引擎是單執行緒的,斷點會導致整個執行緒阻塞,我們的注入指令碼不會執行。只能在斷點的地方用一個全域性變數儲存函式,然後放開斷點,注入指令碼執行。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
失色天空

相關文章