一、前言
我們在寫爬蟲的時候,經常會遇到各種加密的引數,只能在瀏覽器打斷點然後一步一步的去追程式碼,想辦法把加密部分的js給摳出來在外部呼叫。這個過程漫長且費力,還需要一定的ast能力,容易把人勸退。所以現在有一種思想,直接在外部呼叫瀏覽器內已經生成的函式獲取結果,這就是所謂的
js-rpc
遠端呼叫。
在白度搜尋js-rpc
框架,有python
和go
實現的,所以我如法炮製,基於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 協議》,轉載必須註明作者和本文連結