首页
社区
课程
招聘
[原创]Android群控黑盒调用 - Sekiro食用手册
发表于: 2020-6-7 14:53 12769

[原创]Android群控黑盒调用 - Sekiro食用手册

2020-6-7 14:53
12769

之前尝试用过virjar大佬的hermesagent, 后来大佬又迭代出新的基于长链接的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架构

详细的可以去看项目的readme, 说的非常详细: 项目传送门

克隆项目: git clone https://github.com/virjar/sekiro.git

修改settings.gradle的内容为: include ':sekiro-server', ':sekiro-lib' ,删掉appdemo防止编译它

启动服务器前注意事项

先准备一个测试的Demo, 很简单就是个加法, 注意Demo必须有加android.permission.INTERNET权限

再准备的一个Xposed的项目, 不会的可以先看我之前写的一篇笔记: AndroidStudio使用Xposed

在app的build.gradle添加依赖 implementation 'com.virjar:sekiro-api:1.0.1'

52.png

在Xposed的handleLoadPackage中启动client链接server,并添加处理事件的handler, 用于调用Add函数

编译错误More than one file was found with OS independent path解决

54.png

调用接口查看结果:

55.png

56.png

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
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
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();
  }
}
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);
            }

        });

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 9
支持
分享
最新回复 (13)
雪    币: 1454
活跃值: (267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢大佬分享
2020-6-9 09:33
0
雪    币: 19
活跃值: (331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
高并发集群场景呢。
2020-6-9 16:45
1
雪    币: 4046
活跃值: (3432)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
尕可 高并发集群场景呢。
可以部署多个client的
2020-6-9 19:17
0
雪    币: 2965
活跃值: (2082)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
只狼好评噢
2020-6-11 11:05
0
雪    币: 2141
活跃值: (4522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
一颗金柚子 只狼好评噢
哈哈 才发现这个单词是只狼
2020-6-11 11:11
0
雪    币: 243
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

你好;我AS导入Sekiro换成我本地gradle版本后出现了这个问题【Cannot set the value of read-only property 'name' for object of type org.gradle.api.publish.maven.internal.publication.DefaultMavenPublication.】该如何解决呢?

最后于 2020-6-11 14:08 被吉他jita编辑 ,原因:
2020-6-11 14:05
0
雪    币: 4046
活跃值: (3432)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
吉他jita 你好;我AS导入Sekiro换成我本地gradle版本后出现了这个问题【Cannot&nbsp;set&nbsp;the&nbsp;value&nbsp;of& ...
换回原来版本试试
2020-6-12 09:46
0
雪    币: 4046
活跃值: (3432)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
一颗金柚子 只狼好评噢
 
2020-6-12 09:53
0
雪    币: 26399
活跃值: (63262)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
10
感谢分享~
2020-6-12 10:20
0
雪    币: 48
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好东西
2020-6-12 22:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
让算法转发又简单了好多。感谢分享
2020-7-16 16:37
0
雪    币: 2904
活跃值: (1337)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
13
感谢大佬分享
2020-7-24 11:13
0
雪    币: 19950
活跃值: (4942)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
感谢大佬分享
2020-7-29 06:37
0
游客
登录 | 注册 方可回帖
返回
//