首页
社区
课程
招聘
[原创]FridaManager:Frida脚本持久化解决方案
2021-3-31 20:30 38877

[原创]FridaManager:Frida脚本持久化解决方案

2021-3-31 20:30
38877

logo

FridaManager:Frida脚本持久化解决方案

FridaManager持久化原理简介

Frida强大的功能让无数安全研究人员沉溺其中。我们往往使用pc编写好frida的js脚本,然后使用spawn或者attach的方式使得我们的hook脚本生效。那么能否做到像Xposed一样,让我们编写的hook脚本不依赖于pc,从而达到hook脚本的持久化呢?同时,是否能够在手机上单独设置哪一个js脚本只对哪一个app生效呢?答案是可以,得益于fridagadget共享库的强大功能,可以让我们达成frida脚本的持久化!众所周知,要想使用fridagadget,就需要对app进行重打包,注入该so库,首先,鉴于众多app开发人员安全意识的增强,app大多都会对签名进行校验,使得重打包后的app并不会正常的运行,往往会伴随大量的crash。同时,众多加固厂商的技术也不容小觑。不管是从重打包繁琐的流程还是从app保护的角度出发,对app进行重打包来使用fridagadget都不是一个良好的解决方案。那么有没有一个一劳永逸同时足够简单的方案呢?自然是有,我们依然从app的生命周期出发,在我在FART系列脱壳文章中针对加壳app的运行流程做了简单的介绍,当我们点击一个app的图标后,最先进入的便是ActivityThread这个类,同时,不同于对加固app的脱壳,需要选择尽可能晚的时机来完成对已经解密dex的dump和修复,要想对任意一款app实现Frida hook脚本的持久化,我们的hook时机应当是尽可能的早,如果时机晚了,就可能会错过对app中自身类函数的hook时机,比如壳自身的类函数。因此,我们对于fridagadget注入的时机至少要早于app自身声明的APPlication子类的attachBaseContext函数的调用。因此,我们依然可以从ActivityThread中选择足够多的时机(只要还没有完成对APPlication子类的attachBaseContext函数的调用的时机都可以)。同时,我们又可以根据不同的app的包名来对当前运行的app进程注入不同的js脚本,这样,我们就不仅能够实现对Frida脚本的持久化,同时,还能够根据配置,针对不同的app进程,选择不同的js脚本。FridaManager就是基于此原理实现。

FridaManager使用流程

1、下载FridaManager定制rom,刷入手机

这里暂时只提供了nexus 5x的7.1.2 ,之后会放出Android 10的FridaManager版本rom,后期根据需求会逐步增加更多版本rom。

2、在手机中安装FridaManager app

安装后进入设置授予该app读写sd卡权限,FridaManager app主要用于方便对不同的app选择需要持久化的js脚本,界面非常简单(请忽略FridaManager丑陋的界面......)
gui1

3、在手机中安装要进行持久化hook的目标app

特别注意:安装完成后不要立即打开该app,同时注意到设置中授予该app读写sd卡权限(因为接下来要读取位于sd卡中的配置文件以及要持久化的js文件)

4、点击进入FridaManager主界面,完成对要持久化hook的app的设置

FridaManager的主界面主要分为两块,左边是用于选择要持久化的app;在选择好要进行注入的app后,接下来可以通过右边选择对其持久化的js脚本文件,此时可通过进入js脚本所在目录,点击选中。
当选中要持久化的app以及其对应的js脚本后,会弹出对话框,这时,便配置成功 (如下图)。
gui1
接下来只需要退出FridaManager,打开要持久化hook的app即可,这便是FridaManager的简单的使用流程。(同时,需要注意,当修改了需要持久化的js脚本文件后,需要kill掉app进程,重新打开才能生效)

体验第一个FridaManager持久化脚本:FridaManager版本的helloworld,将下面代码保存命名为helloworld.js,拷贝到手机sd卡当中。

1
2
3
4
5
6
7
8
9
10
11
12
function Log(info) {
    Java.perform(function () {
        var LogClass = Java.use("android.util.Log");
        LogClass.e("FridaManager", info);
    })
}
function main() {
    Log("hello fridamanager!");
    Log("goodbye fridamanager!");
}
 
setImmediate(main);

代码逻辑非常清晰,只是使用Frida对Log类函数进行了主动调用,打印出hello fridamanager!以及goodbye fridamanager!这两个字符串.
接下来,我们只需要设置该frida脚本生效的app(由于需要读取sd卡,自然app需要有sd卡读写权限)。此时,需要使用FridaManager进行对特定app的配置,配置该app需要持久化的该js脚本,然后打开app,便可看到logcat中的信息:
gui1

编写FridaManager持久化脚本跟踪jni函数的静态绑定以及动态绑定流程

将下面代码保存命名为traceJNIRegisterNative.js,拷贝到手机sd卡当中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function Log(info) {
    Java.perform(function () {
        var LogClass = Java.use("android.util.Log");
        LogClass.e("FridaManager", info);
    })
}
 
function readStdString(str) {
    const isTiny = (str.readU8() & 1) === 0;
    if (isTiny)
        return str.add(1).readUtf8String();
    return str.add(2 * Process.pointerSize).readPointer().readUtf8String();
}
function hook_register_native() {
    var libartmodule = Process.getModuleByName("libart.so");
    var PrettyMethodaddr = null;
    var RegisterNativeaddr = null;
    libartmodule.enumerateExports().forEach(function (symbol) {
        //android7.1.2
        if (symbol.name == "_ZN3art12PrettyMethodEPNS_9ArtMethodEb") {
            PrettyMethodaddr = symbol.address;
        }
    });
 
    var PrettyMethodfunc = new NativeFunction(PrettyMethodaddr, ["pointer", "pointer", "pointer"], ["pointer", "int"]);
    Interceptor.attach(RegisterNativeaddr, {
        onEnter: function (args) {
            var ArtMethodptr = args[0];
            this.JniFuncaddr = args[1];
            var result = PrettyMethodfunc(ArtMethodptr, 1);
            var stdstring = Memory.alloc(3 * Process.pointerSize);
            ptr(stdstring).writePointer(result[0]);
            ptr(stdstring).add(1 * Process.pointerSize).writePointer(result[1]);
            ptr(stdstring).add(2 * Process.pointerSize).writePointer(result[2]);
            this.funcnamestring = readStdString(stdstring);
            Log("[RegisterJni begin]" + this.funcnamestring + "--addr:" + this.JniFuncaddr);
        }, onLeave: function (retval) {
            Log("[RegisterJni over]" + this.funcnamestring + "--addr:" + this.JniFuncaddr);
        }
    })
}
function main() {
    Log("hello fridamanager!");
    hook_register_native();
    Log("goodbye fridamanager!");
}
setImmediate(main);

接下来安装一个加壳了的app,并到设置中授予sd卡读写权限,之后在FridaManager中完成对该app要持久化的traceJNIRegisterNative.js的配置,
接下来只需要打开该app,便可以观察到该app中每一个jni函数的绑定流程(包括静态注册和动态注册的jni函数)。
gui1

 

好了,就到这里吧,想要体验的可以gitub或者到微信群中去下载,enjoy the frida world!
后续更新会放在github:
FridaManager

 

交流体验、获取更多机型支持以及反馈问题可加微信 hanbing1e,进群深入讨论

 

#为了让更多人体验到FridaManager带来的快感,这里已经将FridaManager编译成Magisk模块,配合FridaManager管理目标APP和js脚本更为顺滑爽快!(可以配合使用魔改的fridagadget,轻松绕过APP的检测),下载链接:https://pan.baidu.com/s/1OXQW3T4ENDsfg2GR-Z8zDA 提取码:t1xl

1、安装Magisk模块

2、使用MagiskManager在线安装riru模块或者直接本地安装riru模块

3、安装完riru模块并重启后,再次进入MagiskManager,本地安装riru-fridamanager模块

4、重启后,手机安装FridaManager APP即可进行app和hook持久化脚本的管理。

注意,如果更新了sd卡中的js hook脚本,在FridaManager中需要重新设置该js脚本,并最好重启下手机,这样更新的js代码才会生效。

MgiskModule


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-6-27 01:20 被hanbingle编辑 ,原因: 更新Magisk支持,无需刷机,支持更多机型
上传的附件:
收藏
点赞11
打赏
分享
最新回复 (26)
雪    币: 2944
活跃值: (3921)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
0xEA 2021-3-31 20:32
2
0
前排
雪    币: 2554
活跃值: (2930)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
Snark 1 2021-3-31 20:50
3
0
雪    币: 493
活跃值: (860)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
_air 2021-3-31 21:01
4
0
感谢分享!插眼,不知是否比较容易检测,以及好奇持久化的稳定性,坐等坛友反馈
雪    币: 986
活跃值: (6012)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
Ssssone 2 2021-3-31 21:02
5
0
雪    币: 831
活跃值: (2830)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
爬虫不看学历 2021-3-31 22:06
6
0
鄙人认为,重新编译fridagadget去掉敏感特征是首要的。
雪    币: 8250
活跃值: (4575)
能力值: ( LV8,RANK:134 )
在线值:
发帖
回帖
粉丝
hanbingle 2 2021-3-31 22:15
7
0
爬虫不看学历 鄙人认为,重新编译fridagadget去掉敏感特征是首要的。
是的,FridaManager足够灵活,已经考虑了这个问题,只需要替换位于/sdcard/gadget目录下的fridagadget库文件即可
雪    币: 5233
活跃值: (3255)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
挤蹭菌衣 1 2021-3-31 22:17
8
0
奈何本屌没文化 一句卧槽行天下
雪    币: 41
活跃值: (854)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
番茄西瓜汤 2021-3-31 22:39
9
0
寒冰老师真强
雪    币: 1778
活跃值: (2165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhuzhu_biu 2021-3-31 23:49
10
0
雪    币: 2153
活跃值: (1745)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AZmoll 2021-4-1 01:09
11
0
tql
雪    币: 69
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ydzydz 2021-4-1 02:10
12
0
插眼 牛逼 不知道怎么方便获取到数据
雪    币: 1438
活跃值: (1521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
奋斗der小鸟 2021-4-1 10:17
13
0
牛逼,感觉如果不想刷机的话,可以通过 magisk + 定制magisk 模块+ 自编译 frida-gadget 来做持久化
雪    币: 174
活跃值: (3646)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TUGOhost 2021-4-1 10:33
14
0
牛逼
雪    币: 2794
活跃值: (847)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
丶咖啡猫丶 2021-4-1 10:54
15
0
寒冰大佬 百度链接挂了欸
雪    币: 110
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ling林 2021-4-1 13:04
16
0
太强了
雪    币: 973
活跃值: (517)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mihacker 2021-4-1 13:39
17
0
太强了   ~~~
雪    币: 4116
活跃值: (1019)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Papaya. 2021-4-1 15:35
18
0
寒冰大佬太强了
雪    币: 334
活跃值: (392)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_yvvzfcdo 2021-4-1 16:00
19
0
太强了
雪    币: 60
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chaos5787 2021-4-1 17:26
20
0
百度链接没有了
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
手把手教我吗 2021-10-27 10:21
21
0
为什么我FridaManager的App list里面没有显示我安装的目标应用,我手机是pixel系统
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
手把手教我吗 2021-10-27 10:28
22
0
mb_ehafzufw 为什么我FridaManager的App list里面没有显示我安装的目标应用,我手机是pixel系统
已授权读取sd权限,但手机的应用就是加载不出来
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
手把手教我吗 2021-10-27 17:20
23
0
mb_ehafzufw 为什么我FridaManager的App list里面没有显示我安装的目标应用,我手机是pixel系统
我的是安卓11,无法加载到applist
雪    币: 679
活跃值: (1537)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
hjhjl222 2021-11-10 12:01
24
0
神级膜拜
雪    币: 0
活跃值: (393)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Light紫星 2022-2-16 17:03
25
0
膜拜,不知道是否考虑出个zygisk版本
游客
登录 | 注册 方可回帖
返回