安卓中抓取方式除了全协议技术和自动化配合hook之外,还有一种难度和实现原理均介于两者之间的RPC方式,即通过注入一段代码至目标APP中来将目标API暴露供外调用,例如通过Xposed插件在对方APP中启动一个HTTP服务,然后预先定义好Http接口的请求参数,在Http服务响应对应的接口时通过反射执行对方APP中的方法来获取结果并返回,如此一来对外部Http调用放来说,仿佛目标APP对外开放了一个Http接口。
上述例子是简单的通过一个Http服务来完成暴露,但实际上并不限于基于HTTP协议完成,也可以通过自定义长链接完成,其次通过Http服务实际上只能供一个局域网中访问,对于公网服务来说无法突破NAT限制。
无论怎样,核心都是注入和服务暴露,具体注入的方式和服务暴露方式都有多种方式,例如注入可以通过Hook或者重打包或者VA,服务暴露有HTTP、TCP长链接(自定义协议、Netty)等。
Sekiro是维佳哥写的一个成熟的RPC暴露框架,前身是hermes,基于Netty实现了内网穿透和通信协议自定义,可以与一切Hook框架配合,可以运用于安卓和JS。
关于Sekiro的架构解析可以参考GITHUB解析:
食用手册:
由于RPC的方式可以直接调用对方方法API,因此可以简化省略一些逆向工作,例如:
- 黑盒算法直接调用
- 半协议抓取(优点:少数设备&同步调用返回)
- 安卓群控
但RPC方式也存在一些缺点,例如:
- 相比于全协议仍然需要设备部署和维护,调用链路长
- 算法如果绑定本地环境或者设备指纹,可能会暴露抓取特征