android获取ro._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
修改settings.gradle的内容为: include ':sekiro-server', ':sekiro-lib' ,删掉appdemo防止编译它
启动服务器前注意事项
1. server端在`sekiro-server/src/main/resources/appliation.properties`中可以配置三个服务端端口, 主要服务端安全策略的出入口需要开放这个三个端口
#tomcat 占用端口
server.port=5602
#长链接服务占用端口
natServerPort=5600
# 异步http占用端口
natHttpServerPort=5601
# websocket占用端口
webSocketServerPort=5603
2. 如果自定义端口,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的项目, 不会的可以先看我之前写的一篇笔记:
在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的调用日志
感谢&参考资料
android获取ro._Android群控黑盒调用 - Sekiro食用手册相关推荐
- android黑盒子调用,[原创]Android群控黑盒调用 - Sekiro食用手册
0x0 前言 之前尝试用过virjar大佬的hermesagent, 后来大佬又迭代出新的基于长链接的Sekiro, 一直想看都被耽搁了, 今天正好抽空尝试一下, 顺便写篇笔记, 有错误的地方大佬们请 ...
- android获取ro._Android应用获取系统属性
使用adb shell prop可以查看Android系统的属性.详情看下图 上面列出了很多属性, 如果要在使用中使用该属性, 比如说我是为了判断该手机是不是魅族手机. google在framewor ...
- android获取ro._Android 简单的设备信息获取
在用python写自动化测试脚本的脚本的时候通常回需要获取一些android设备的硬件信息.网上给的很多方案都是通常通过/system/build.prop中去获取,但是回遇到permission d ...
- android获取ro._抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册
抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册 0x0 前言 之前尝试用过virjar大佬的hermesagent, 后来大佬又迭代出新的基于长链接的Sekiro, 一直想看都被耽 ...
- android获取ro._怎么去获取现成机器的ro.hardware值
硬件抽象层模块文件的命名规范定义在hardware/libhardware/hardware.c文件中,如下所示. hardware/libhardware/hardware.c 01 /** 02 ...
- android获取ro._修改Android序列号(Serial Number)
文档说明 本文档以SC806-CN-00-71(msm8909平台 Android7系统)为例,描述如何修改Android Serial Number. Serial Number说明 菜单 Abou ...
- android获取静态apk包,如何从APK文件提取API调用?
使用Python,鉴于它是.apk文件,我试图提取Android应用程序进行的API调用. 有没有一种方法可以通过对包的APK进行静态分析来解析/提取包所使用的API的名称? 到目前为止,这是我尝试过 ...
- android sim卡联系人存储格式,Android获取手机通讯录、sim卡联系人及调用拨号界面方法...
android获取手机通讯录联系人信息 private void getPhoneContacts() { ContentResolver resolver = this.getContentReso ...
- android获取imei兼容_Android获取IMEI号码
1 android 获取 imei号码2 3 核心代码:4 5 Imei =((TelephonyManager) getSystemService(TELEPHONY_SERVICE))6 .get ...
最新文章
- Linux cp命令 拷贝文件
- spring无法用三级缓存解决循环依赖的问题分析
- 支持字典_手把手教你学Python之字典
- nodemanager不能正常关闭_家居燃气安全,燃气阀门的开与关可不能不当回事
- 杰克·韦尔奇语录-世界第一CEO
- Linus 谈软件开发管理经验(转载)
- pylint警告: An attribute defined in json.encoder line 158 hides this methodpylint(method-hidden)
- [转载] Python:把字符串转换成整数
- 【To Do】LeetCode 142. Linked List Cycle II
- 【Python学习笔记】集合set
- 车架号识别系统-VIN码识别查询
- python使用pillow生成纯透明png图片
- 星星之火-35:为什么傅里叶分析需要引入负频率以及负频率的物理意义是什么?
- IP地址和子网的划分详解
- thinksnsv4.6运行php,ThinkSNS开启调试模式
- 若依RuoYi-Vue项目部署(前后端分离版本)
- 指南-示例-luat示例-camera
- srm安全擦除Linux敏感文件,你受得了吗?-尚文网络xUP楠哥
- mysql数据库使用一条insert语句同时插入多条数据
- rtx2060为什么叫智商卡_为什么有的卡叫储蓄卡,有的卡叫借记卡呢?看完你就懂了...
热门文章
- 再谈TQ2440使用TFTP下载程序
- 九大数据可视化利器,你有足球竞猜平台源码下载在使用吗?
- 病毒:注册表的认识以及用c语言编写一个“百分之一熊猫烧香“
- python_8荣8耻
- 对TypeScript版PureMVC的优化
- JavaScript的工作原理:内存管理+如何处理4个常见的内存泄漏
- 谷歌浏览器怎么将迅雷设置为默认下载方式 谷歌浏览器设置迅雷为默认下载的教程
- Android Camera模块(一)
- C语言入门教程第三篇
- 黑马学成在线--项目环境搭建