抖音資料采集教程,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]¶m1=[arg]
例子: https://x.x.x.x:5602/asyncInvoke?group=addDemoTest2&action=myAdd&arg1=300&arg2=300

- client的呼叫日志

感謝&參考資料
sekiro實踐
更多短視頻資料實時采集介面,請查看檔案: TiToData
免責宣告:本檔案僅供學習與參考,請勿用于非法用途!否則一切后果自負,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/244192.html
標籤:大數據
下一篇:MySQL中最實用的SQL陳述句
