基於Sekiro的jsRPC的使用和安裝

2023-03-15 18:01:19

什麼是jsRPC

說實話在介紹 JSRPC 我向大家推薦一個庫 Selenium-wire 感覺和JSrpc的原理很像
RPC指遠端過程呼叫,APP裡面的RPC大家比較熟悉了。
那什麼是jsRPC,顧名思義,就是指利用js手段實現程式碼遠端控制瀏覽器控制檯的一種手段,需要藉助websocket實現。
下面我們先簡單的寫一個小例子

var ws = require('nodejs-websocket');
console.log('開始建立連線...');

var cached = {}

var server = ws.createServer(function (conn) {
  conn.on('text', function (msg) {
    var key = conn.key
    console.log("將要傳送程式碼:【" + msg + "】至瀏覽器/python");
    server.connections.forEach(conn => {
      conn.send(msg);
    })
  })
  conn.on('close', function (code, reason) {
    console.log('關閉連線', code, reason)
  });
  conn.on('error', function (code, reason) {
    console.log('異常關閉', code, reason)
  });
}).listen(8015)
console.log('WebSocket建立完畢');

python

# -*- coding: utf-8 -*-
# @Time    : 2022/12/2 14:17
# @Author  : lzc
# @Email   : [email protected]
# @Software: PyCharm
# @blog    : https://www.cnblogs.com/zichliang

import websocket

ws = websocket.WebSocketApp("ws://127.0.0.1:8015")

def on_message(ws,message):
    if message.split("_")[0]!= 'js':
        print(message)


ws.on_message = on_message
ws.run_forever()

在瀏覽器中注入

(function () {
    if (window.WebSocket) {
        ws = new WebSocket("ws://localhost:8015");
        ws.onopen = function (e) {
        };
        ws.onclose = function (e) {
            console.log("server closed", e)
        }
        ws.onerror = function (e) {
            "connection error"
        }
        ws.onmessage = function (e) {
            console.log(e)
        }
    }
})()

在瀏覽器中對其進行操作
比如傳送什麼資料


在python程式碼中就能接收到這些資料

基於sekiro的isRPC應用

簡介: sekiro是基於長連結和程式碼注入的Android private API暴露框架

sekiro在安卓方面的應用請看課程 第六章
github: https://github.com/virjar/sekiro 作者:鄧維佳 virjar 渣總[都是一個人]
sekiro 在 web方向,使用 websocket協定注入
官方檔案內容:
Sekiro 已支援 websocket 協定,使用本功能可以支援注入js 到瀏覽器後,呼叫瀏覽器環境的is 程式碼
Web 環境基於 WebSocket 實現
檔案:https://sekiro.iinti.cn/sekiro-doc/01_user_manual/1.quickstart.html
下載地址:Go HTTP File Server (iinti.cn)
下載這個 到本地
並且下載好 JDK java的編譯器


然後執行響應版本
注意:

使用

使用方法:將js檔案 sekiroWebMini.js 注入到瀏覽器環境 ,
之後通過當前介面存取自己的瀏覽器服務:

ws://127.0.0.1:5612

然後注入我們的程式碼

var client = new SekiroClient("ws://127.0.0.1:5612/business/register?group=demo-ws&clientId="+Math.random());
client.registerAction("clientTime",function(request, resolve,reject ){
            resolve(""+new Date());
})


請注意,Sekiro JS RPC是Sekiro的擴充套件,依然需要遵循Sekiro的各種規則定義。

注入完成之後 使用我們的瀏覽器存取
http://127.0.0.1:5612/business/invoke?group=demo-ws&action=clientTime

必須與我們注入的程式碼相對應 不然就會失敗 成功之後是這樣的

可以看到 這裡返回的就是我們resolve(""+new Date()); 這段程式碼 也就意味著可以進行任何的操作。

對於sekiro jsRPC的理解

提供了一種瀏覽器與程式碼以及介面互動的一種可行性理論上只要是網站都可以通過這種方案在is層面突破反爬限制,且穩定性要優於目前的一切自動化框架

使用描述:
可能性1:針對解密函數的介面暴露
可能性2:針對資料介面的介面暴露
可能性3:針對自動化採集的介面暴露
可能性4:其他的一切想你所想....

優勢

sekiro驅動jsRPC的優勢與缺陷分析

  1. 與傳統自動化框架相比,穩定性更高且不需要考慮瀏覽器指紋。操作得當的話,效能不在一個數量級
  2. 可以通過js直接獲取加密引數,對於全域性變數的引數暴露具有極佳的體驗。[一劍破光陰]
  3. 可以直接獲取介面資料,對於獲取資料介面暴露明顯的網站具有極佳的體驗。
  4. 不考慮風控的情況下,能達到高並行。

缺陷

  1. 內建不可更改的瀏覽器環境不可更改,對於風控突破而言是個極大的隱患[瀏覽器沙箱可能會解決這個問題]
  2. 需要對js有較深理解,需要尋找合適的注入時機和注入位置[這個算缺陷麼? 菜是原罪]。
  3. 需要注入指令碼,所以要依託於油猴指令碼/autoResponse/手動注入[如果使用抓包工具需要注意埠問題]
  4. 對於全域性js混淆、風控嚴格、is引數分佈散亂、滑鼠軌跡指紋、變數作用域複雜的網址的支援較差。
  5. 需要保持瀏覽器開啟,所以多少會佔用些資源。
  6. 如果不取引數,而是隻取介面內容 或者 引數與IP繫結的加密,對代理池接入的支援不佳。