抖音資料採集教程,Android群控黑盒呼叫,Sekiro使用手冊
阿新 • • 發佈:2021-01-03
抖音資料採集教程,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的呼叫日誌
感謝&參考資料
更多短視訊資料實時採集介面,請檢視文件: TiToData
免責宣告:本文件僅供學習與參考,請勿用於非法用途!否則一切後果自負。