一、目标
之前介绍过 android连真机签名公网ip更新方案 ,但是有很多朋友留言说,自己家里的ADSL根本没有公网ip,那就没法玩了。
要解决这个问题,还有一个方案是用 frp内网穿透 来解决,但是实际使用过程中发现不是很稳定。
今天我们要介绍的 sekiro 是一个基于长链接和代码注入的Android Private API暴露框架。
工作流程是这样的:
- client通过TCP和server建立长连接
- user发送http请求给server
- server根据用户发来的http请求的参数,通过TCP将请求转发给client
- client收到请求并响应server
- server将从client收到的请求返回给user
二、步骤
先安装服务器端
git clone https://github.com/virjar/sekiro.git
当前目录执行编译命令: ./gradlew sekiro-server:bootJar
即可在 sekiro-server/build/libs/sekiro-server-0.0.1-SNAPSHOT.jar 找到 all-in-one的jar包
通过命令 java -jar sekiro-server-0.0.1-SNAPSHOT.jar 即可启动服务器
nohup java -jar sekiro-server-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
App部分
在app的build.gradle添加依赖 implementation 'com.virjar:sekiro-api:1.0.1'
import java.util.UUID;
import com.virjar.sekiro.api.SekiroClient;
import com.virjar.sekiro.api.SekiroRequest;
import com.virjar.sekiro.api.SekiroRequestHandler;
import com.virjar.sekiro.api.SekiroResponse;
// connect sekiro
//服务端host
String testHost = "111.121.132.157";
//客户端标识
String clientId = "googleEx"
//接口组名称
String groupName = "myTestApp";
//暴露的接口名称
String actionName = "getsign";
//拿classloader
// ClassLoader clzLoaderNet = loadPackageParam.classLoader;
//连接服务端并且注册处理的handler
SekiroClient.start(testHost, clientId, groupName)
.registerHandler(actionName, new SekiroRequestHandler(){
@Override
public void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse){
// sekiroResponse.success(" now:"+System.currentTimeMillis()+ " your param1:" + sekiroRequest.getString("param1"));
//当服务端分配任务时, 这里处理逻辑, 并把结果返回给服务端, 服务端再返回给调用者
Class<?> clz = XposedHelpers.findClass("com.example.administrator.adddemo.MainActivity", loadPackageParam.classLoader);
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);
}
});
// end
//build.gradle里android{}添加错误的path
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/INDEX.LIST'
exclude ('META-INF/io.netty.versions.properties')
}
试试是否正常
http://111.121.132.157:5602/groupList 展示当前系统中注册过的所有 group
{"status":0,"message":null,"data":["myTestApp"],"clientId":null,"ok":true}
http://111.121.132.157:5602/natChannelStatus?group=myTestApp 展示特定 group 下,注册过那些手机。
{"status":0,"message":null,"data":{"enable":["googleEx"],"disable":[]},"clientId":null,"ok":true}
调用 myTestApp 接口组的 getsign 接口,参数 param1, get/post 都支持 http://111.121.132.157:5601/asyncInvoke?group=myTestApp&action=getsign¶m1=testparam1
{"clientId":"googleEx","data":" now:1618384502944 your param1:testparam1","ok":true,"status":0}
三、总结
Sekiro 更高阶的应用可以参考作者的github中的介绍。基本上 1-2台手机就能搞定的活,自己弄个公网ip搭个就ok。如果规模上去了,还需要调度和均衡负载之类的,Sekiro 就大有用武之地了。
小时候的我们都幻想过自己是带着面具的超级英雄,谁曾想过长大以后,我们成了怪兽出场时四处逃窜的路人。
关注微信公众号,最新技术干货实时推送