.1. netty-sekiro
.1.1. Gerneral
SEKIRO 是一个android下的API服务暴露框架,可以用在app逆向、app数据抓取、android群控等场景。
- sekiro 是用springboot,和netty(nio)开发的高效通讯框架
- sekiro 不仅支持短连接,也支持长链接,能实时返回手机是否在线的技术
- sekiro 中使用了netty代表异步请求,服务器资源使用少
- sekiro 不依赖xposed架构,能与一切hook框架解耦合
.1.1.1. sekiro组织架构
- sekiro包含移动端开发和服务器端开发
- 服务器端是用Springboot管理各种组件,在Springboot bean(InitializingBean)初始化 afterPropertiesSet完成会启动两个nio服务,分别监听5600,5601端口.
- 5601 端口的nio服务器用于处理http请求,即处理调用接口处理。
- RBHttpRequestDecoder 用于http解码
- HttpResponseEncoder 用于http编码
- HttpObjectAggregator 最大报文处理
- HttpRequestDispatcher 对拿到的http请求处理
- HttpRequestDispatcher 中接受request请求,封装成SekiroNatMessage 发送给移动端,并且生成一个新任务设置事件回调接口并保存到concurrentmap中.
- 5600 端口的nio服务器用于处理tcp请求,与移动端数据交互
- SekiroMessageEncoder tcp编码
- SekiroMessageDecoder tcp解码
- ServerIdleCheckHandler 服务器空闲检查 读空闲,写空闲
- NatServerChannelHandler 自定义处理与移动端数据交互
- pipeline中的handler是依次执行,符合条件执行
- SekiroNatMessage 是移动端与服务器交互数据的对象
- SekiroNatMessage 目前包含3中类型
- SekiroNatMessage.TYPE_HEARTBEAT 用于处理心跳检查
- SekiroNatMessage.C_TYPE_REGISTER 用于移动端action注册
- SekiroNatMessage.TYPE_INVOKE 用于服务器介绍到客户端hook信息,并将信息返回给调用者
- SekiroNatMessage.C_TYPE_REGISTER 实际是将NatClient(封装移动端与服务端的channel,clietid,group信息)保存到natClientMap,poolQueue中
- SekiroNatMessage.TYPE_INVOKE 从channel中获取clientid,group,换取task任务,调用回调函数。即sekiroResponseEvent.onSekiroResponse(sekiroNatMessage);是将移动端hook后的返回信息(是否注册手机号)传递给回调函数,回调函数会返回response给调用者
- 移动端即client客户端包含一下handler
- SekiroMessageDecoder
- SekiroMessageEncoder
- ClientIdleCheckHandler 与服务器连接空闲检查
- ClientChannelHandler 自定义处理服务器端发来的数据
- ClientChannelHandler将服务器端发来的hook请求取出对于的action 调用
- sekiroResponse.success 触发channel.writeAndFlush(sekiroNatMessage); 将hook信息发送到服务端
.1.1.2. 人观流程
总结:4(调用者的request)->7(发送hook请求注册回调)-> 12(移动端寻找action调用) -> 13(返回hook到的信息) -> 10(服务器端收到hook消息回调给调用者)
- 其中7,10步骤都是异步,不断发送和接受
- 如何确保同一任务 这里采用 clientId + “—“ + group + “—“ + seq; 代表唯一id
.1.1.3. 解决前一版本bug
SekiroMessageDecoder 代替原理啊的SekiroNatMessageDecoder(更名为SekiroNatMessageDecoderError)