一、目标
联手机签名是个比较取巧的方案,之前我们介绍过
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应用中使用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 官方文档
https://sekiro.virjar.com/sekiro-doc/index.html
frida 加载 sekiro dex 文件 实现与服务端交互
这才知道我全部的努力,不过是完成了普通的生活。
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。
关注微信公众号: 奋飞安全,最新技术干货实时推送