写点什么

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

作者:奋飞安全
  • 2022 年 5 月 23 日
  • 本文字数:2202 字

    阅读完需:约 7 分钟

一、目标

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


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


http://91fans.com.cn/post/androidipsend/


Sekiro + Xposed 签名解决方案


http://91fans.com.cn/post/sekiroone/


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

二、步骤

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


http://91fans.com.cn/post/smallvideosignthr/

先运行服务器端

官网在这里 https://github.com/virjar/sekiro


git clone 下来;


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


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


https://oss.virjar.com/sekiro/sekiro-demo


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



window 下运行 sekiro.bat


Linux/mac 下运行 sekiro.sh


这样服务器端就跑起来。

firda 开发 sekiro 客户端

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


// 在普通Android应用中使用sekironew 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 官方文档


https://sekiro.virjar.com/sekiro-doc/index.html


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


https://www.qinless.com/387



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

发布于: 刚刚阅读数: 2
用户头像

奋飞安全

关注

独立安全研究员。 公众号: 奋飞安全 2022.02.21 加入

少习文,经史子集略有涉猎;北上学艺,A-Z语言敢说略懂;初入江湖,混入外企,乐不思蜀;后为人父,发愤图强,略有建树;而今重新出发,万事随缘。

评论

发布
暂无评论
手把手教你搭个Frida + Sekiro Rpc框架_奋飞安全_InfoQ写作社区