1. 程式人生 > 實用技巧 >抖音資料採集教程,Android群控黑盒呼叫,Sekiro使用手冊

抖音資料採集教程,Android群控黑盒呼叫,Sekiro使用手冊

抖音資料採集教程,Android群控黑盒呼叫,Sekiro使用手冊

0x0 前言

之前嘗試用過virjar大佬的hermesagent, 後來大佬又迭代出新的基於長連結的Sekiro, 一直想看都被耽擱了, 今天正好抽空嘗試一下, 順便寫篇筆記, 有錯誤的地方大佬們請指正哈

0x1 Sekiro介紹

SEKIRO 是一個android下的API服務暴露框架,可以用在app逆向、app資料抓取、android群控等場景

和其他群控框架相比的特點如下:

  • 對網路環境要求低,sekiro使用長連結管理服務,使得Android手機可以分佈於全國各地,甚至全球各地。手機摻合在普通使用者群體,方便實現反抓突破,更加適合獲取下沉資料。
    不依賴hook框架,就曾經的Hermes系統來說,和xposed框架深度整合,在當今hook框架遍地開花的環境下,框架無法方便遷移。所以在Sekiro的設計中,只提供了RPC功能了。
  • 純非同步呼叫,在Hermes和其他曾經出現過的框架中,基本都是同步呼叫。雖然說簽名計算可以達到上百QPS,但是如果用來做業務方法呼叫的話,由於呼叫過程穿透到目標app的伺服器,會有大量請求佔用執行緒。系統吞吐存在上線(hermes系統達到2000QPS的時候,基本無法橫向擴容和效能優化了)。但是Sekiro全程使用NIO,理論上其吞吐可以把資源佔滿。
  • client實時狀態,在Hermes系統我使用http進行呼叫轉發,通過手機上報心跳感知手機存活狀態。心跳時間至少20s,這導致伺服器排程層面對手機線上狀態感知不及時,請求過大的時候大量轉發呼叫由於client掉線timeout。在Sekiro長連結管理下,手機掉線可以實時感知。不再出現由於框架層面機制導致timeout

Sekiro架構

server:
    暴露一個TCP埠和兩個HTTP埠
    管理通過TCP連線的client和user發來的http 請求
client:
    通過TCP和server連線,響應server發來的請求
 
工作流程是這樣的:
    1. client通過TCP和server建立長連線
    2. user傳送http請求給server
    3. server根據使用者發來的http請求的引數,通過TCP將請求轉發給client
    4. client收到請求並響應server
    5. server將從client收到的請求返回給user

詳細的可以去看專案的readme, 說的非常詳細:

專案傳送門

0x2 服務端部署

  • 克隆專案: git clone [https://github.com/virjar/sekiro.git](https://github.com/virjar/sekiro.git)
  • 修改settings.gradle的內容為: include ':sekiro-server', ':sekiro-lib' ,刪掉appdemo防止編譯它
  • 啟動伺服器前注意事項
server端在`sekiro-server/src/main/resources/appliation.properties`中可以配置三個服務端埠, 主要服務端安全策略的出入口需要開放這個三個埠
#tomcat 佔用埠
server.port=5602
#長連結服務佔用埠
natServerPort=5600
# 非同步http佔用埠
natHttpServerPort=5601
# websocket佔用埠
webSocketServerPort=5603
 
如果自定義埠,client需要呼叫SekiroClient.start(String serverHost, int serverPort, final String clientID, String group)中去連線server

執行命令:./gradlew sekiro-server:bootJar 即可在 sekiro-server/build/libs/sekiro-server-0.0.1-SNAPSHOT.jar找到all-in-one的jar包

  • 通過nohup java -jar sekiro-server/build/libs/sekiro-server-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &啟動server

0x3 客戶端

  • 先準備一個測試的Demo, 很簡單就是個加法, 注意Demo必須有加android.permission.INTERNET許可權
public class MainActivity extends AppCompatActivity {
 
  public static int Add(int n1, int n2)
  {
      return n1 + n2;
  }
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
 
      Toast.makeText(MainActivity.this, "3 + 2 = " + Add(3, 2), Toast.LENGTH_LONG).show();
  }
}
  • 再準備的一個Xposed的專案, 不會的可以先看我之前寫的一篇筆記: AndroidStudio使用Xposed
  • 在app的build.gradle新增依賴 implementation 'com.virjar:sekiro-api:1.0.1'

  • 在Xposed的handleLoadPackage中啟動client連結server,並新增處理事件的handler, 用於呼叫Add函式
Log.i(TAG, "connect server....");
//服務端host
String testHost = "your_host";
//客戶端標識
String clientId = UUID.randomUUID().toString();
//介面組名稱
String groupName = "addDemoTest2";
//暴露的介面名稱
String actionName = "myAdd";
//拿classloader
clzLoader = lpparam.classLoader;
 
//連線服務端並且註冊處理的handler
SekiroClient.start(testHost, clientId, groupName)
        .registerHandler(actionName, new SekiroRequestHandler(){
            @Override
            public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse){
 
                //當服務端分配任務時, 這裡處理邏輯, 並把結果返回給服務端, 服務端再返回給呼叫者
                Class<?> clz = XposedHelpers.findClass("com.example.administrator.adddemo.MainActivity", clzLoader);
                int arg1  = sekiroRequest.getInt("arg1");
                int arg2  = sekiroRequest.getInt("arg2");
                Log.i(TAG, String.format("arg1 : %d, arg2 : %d", arg1, arg2));
                Object result = XposedHelpers.callStaticMethod(clz, "Add", arg1, arg2);
                Log.i(TAG, "result : " + result);
                sekiroResponse.success(result);
            }
 
        });
  • 編譯錯誤More than one file was found with OS independent path解決
//build.gradle裡android{}新增錯誤的path
 
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/INDEX.LIST'
    exclude ('META-INF/io.netty.versions.properties')
}

0x4 嘗試呼叫

  • 開啟app後, 使用瀏覽器檢視group列表是否註冊成功:
    [your_server_ip]:[server.port]/groupList

  • 呼叫介面檢視結果:
格式: your_server_ip:[natHttpServerPort]/[invoke_type]?group=[group_id]&action=[action_name]&param1=[arg]
 
例子: https://x.x.x.x:5602/asyncInvoke?group=addDemoTest2&action=myAdd&arg1=300&arg2=300

  • client的呼叫日誌

感謝&參考資料

sekiro實踐

更多短視訊資料實時採集介面,請檢視文件: TiToData


免責宣告:本文件僅供學習與參考,請勿用於非法用途!否則一切後果自負。