手把手教你搭个Frida + Sekiro Rpc框架

简介: 手把手教你搭个Frida + Sekiro Rpc框架

一、目标



联手机签名是个比较取巧的方案,之前我们介绍过

android连真机签名公网ip更新方案


91fans.com.cn/post/androi…


Sekiro + Xposed 签名解决方案


91fans.com.cn/post/sekiro…


现在frida用的比较多,并且Sekiro也升级了新版本,我们今天就来手把手教你搭个 Frida + Sekiro Rpc框架。


二、步骤


我们以这个手机号加密算法为例

91fans.com.cn/post/smallv…


先运行服务器端


官网在这里 github.com/virjar/seki…


git clone下来;


在Linux或者mac上,执行脚本 build_demo_server.sh,之后得到发布压缩包:sekiro-service-demo/target/sekiro-release-demo.zip


如果是windows,或者不想自己构建,可以在这里直接下载

oss.virjar.com/sekiro/seki…


把zip包传到服务器上去解压223.png



window下运行 sekiro.bat


Linux/mac下运行 sekiro.sh


这样服务器端就跑起来。


firda开发sekiro客户端


sekiro是个相当牛X的库,基本上就是开箱即用了。

// 在普通Android应用中使用sekiro
new SekiroClient("test-android", UUID.randomUUID().toString())
        .setupSekiroRequestInitializer(new SekiroRequestInitializer() {
            @Override
            public void onSekiroRequest(SekiroRequest sekiroRequest, HandlerRegistry handlerRegistry) {
                handlerRegistry.registerSekiroHandler(new ClientTimeHandler());
            }
        }).start();


在Android代码里面这样一条api就可以了,然后在ClientTimeHandler类里面写逻辑

frida使用就稍稍有点复杂,复杂的点就在于要创建一个java类 ClientTimeHandler 来处理调用逻辑。


function initSekiro() {
    const SekiroClient = Java.use('com.virjar.sekiro.business.api.SekiroClient');
    const ActionHandler = Java.use('com.virjar.sekiro.business.api.interfaze.ActionHandler');
    const SekiroRequestInitializer = Java.use('com.virjar.sekiro.business.api.interfaze.SekiroRequestInitializer');
  //  注册一个ClientTimeHandler类,继承 ActionHandler
    const ClientTimeHandler = Java.registerClass({
        name: 'ClientTimeHandler',
        implements: [ActionHandler],
        methods: {
            action: function () {
                return 'mobile';
            },
            handleRequest: function (sekiroRequest, sekiroResponse) {
        const requestJsonData = sekiroRequest.getJsonModel();
        const requestData = JSON.parse(requestJsonData)['requestData'];
        if(!requestData){
          sekiroResponse.failed(JavaString.$new('requestData 不能为空'));
        }else{
          try{
            sekiroResponse.success(callMobile(requestData));
          }catch(error){
            sekiroResponse.failed(JavaString.$new(error.stack));
            throw error;
          }
        }
            }
        }
    })
  // 注册一个 SekiroRequestDefault类, 继承SekiroRequestInitializer
    const SekiroRequestDefault = Java.registerClass({
        name: "SekiroRequestDefault",
        implements: [SekiroRequestInitializer],
        methods: {
            onSekiroRequest: function (sekiroRequest, handlerRegistry) {
                handlerRegistry.registerSekiroHandler(ClientTimeHandler.$new());
            }
        }
    });
    const clientID = guid();
    const group = 'fridaHook_atlasEncrypt';
    const ip = '110.42.246.110';
   // 服务端端口号 默认是 conf/config.properties 里面配置5620, 这里改成了 8989
    const sekiro = SekiroClient.$new(group, clientID, ip, 8989);
    sekiro.setupSekiroRequestInitializer(SekiroRequestDefault.$new());
    sekiro.start();
}


这就可以了,挂上frida跑起来


sekiro状态查看和访问服务


http://110.42.246.110:8989/business-demo/groupList  展示当前系统中注册过的所有 group

{"data":["fridaHook_atlasEncrypt"],"ok":true,"status":0}


http://110.42.246.110:8989/business-demo/clientQueue?group=fridaHook\_atlasEncrypt 展示特定 group 下,注册过那些客户端/手机。

{"data":["65c8e8b5-1a67-2036-5b38-769cb670aeb3"],"ok":true,"status":0}


执行一下看看结果

# -*- coding: utf-8 -*-
import requests
url = 'http://110.42.246.110:8989/business-demo/invoke'
mobileid = '18913872618'
data = {
    'group': 'fridaHook_atlasEncrypt',
    'action': 'mobile',
    'requestData': mobileid
    }
res = requests.post(url,json=data).json()
print(res['data'])


结果很完美

3sCt3iAAMzIwOTAxMjA4AM8HAO7Jtk8ia8xTExAAAACFS7z70nRA3Ppgtdz9Kefb


收工上鲜啤


三、总结


基本上java的库,frida都可以无缝利用。比Xposed玩起来方便多了。


有个小小的问题是 frida hook的app有崩溃的几率, 这个就需要搞个看门狗来实现了。

sekiro 官方文档


sekiro.virjar.com/sekiro-doc/…


frida 加载 sekiro dex 文件 实现与服务端交互


www.qinless.com/387

778.png


这才知道我全部的努力,不过是完成了普通的生活。


TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号: 奋飞安全,最新技术干货实时推送

相关文章
|
3月前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
81 9
|
8月前
|
消息中间件 负载均衡 Dubbo
如何自己设计一个类似Dubbo的RPC框架?
如何自己设计一个类似Dubbo的RPC框架?
63 0
|
5月前
|
Dubbo Java 应用服务中间件
Rpc编程系列文章第三篇:Hessian RPC一个老的RPC框架
Rpc编程系列文章第三篇:Hessian RPC一个老的RPC框架
|
3月前
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
48 1
|
4月前
|
消息中间件 Dubbo Java
Simple RPC - 01 框架原理及总体架构初探
Simple RPC - 01 框架原理及总体架构初探
51 0
|
10月前
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
116 0
|
10月前
|
前端开发
Netty手写RPC框架
创建Request类,继承Message,klass是调用的Class目标,name,parameterType,argument分别是方法名称,参数类型,参数
65 0
|
7月前
|
负载均衡 Dubbo 网络协议
微服务RPC框架:Feign和Dubbo
微服务RPC框架:Feign和Dubbo
306 0
|
7月前
|
JSON 中间件 Go
Go语言学习 - RPC篇:gin框架的基础能力剖析
gin是非常流行的一款HTTP框架。相较于原生的HTTP server,gin有很多改进点,主要在于3点: 1. 上手简单,开发思路与原生HTTP基本一致 2. 引入多个工具库,提高了开发效率 3. 生态丰富,有许多开源的组件 围绕着gin框架,我们将展开今天的话题。
107 2
Go语言学习 - RPC篇:gin框架的基础能力剖析
|
7月前
|
XML Dubbo Java
Dubbo第一讲:从RPC到Dubbo框架详解
Dubbo第一讲:从RPC到Dubbo框架详解
100 0