首页
社区
课程
招聘
[原创]使用 frida 实现 Android 本地文件读写
2023-7-24 17:46 5787

[原创]使用 frida 实现 Android 本地文件读写

2023-7-24 17:46
5787

0x01 前言

刚好有个小需求,需要使用 Frida 读取 Android 中的文件数据,不难但是麻烦,做个小总结,也方便以后遇到问题时能够快速解决,文中代码均已验证可实现。

0x02 frida 写文件

2.1 使用 frida api 实现文件写入

1
2
3
4
5
6
7
function write_mes_1() {
    //frida 的api来写文件
    var file = new File("/sdcard/test.txt", "w");
    file.write("Hello Word!");
    file.flush();
    file.close();
}

在 sdcard 目录下创建 text.txt 文件后执行脚本:
图片描述

2.2 主动调用 libc api 实现文件写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function write_mes_2() {
    var addr_fopen = Module.findExportByName("libc.so", "fopen");
    var addr_fputs = Module.findExportByName("libc.so", "fputs");
    var addr_fclose = Module.findExportByName("libc.so", "fclose");
 
    var fopen = new NativeFunction(addr_fopen, "pointer", ["pointer", "pointer"]);
    var fputs = new NativeFunction(addr_fputs, "int", ["pointer", "pointer"]);
    var fclose = new NativeFunction(addr_fclose, "int", ["pointer"]);
    var filename = Memory.allocUtf8String("/sdcard/test.txt");
    var open_mode = Memory.allocUtf8String("w+");
    var file = fopen(filename, open_mode);
    console.log("fopen file:", file);
 
    var buffer = Memory.allocUtf8String("Word Hello!");
    var ret = fputs(buffer, file);
    console.log("fputs ret:", ret);
    fclose(file);
}

在 sdcard 目录下创建 text.txt 文件后执行脚本:
图片描述

0x03、frida 读文件

3.1 反射调用 Java api 实现文件读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Java.perform(function(){
    var fileName = "/sdcard/test.txt"
    console.log("> Reading file: ", fileName);
    var JString = Java.use("java.lang.String");
    var Files = Java.use("java.nio.file.Files");
    var Paths = Java.use("java.nio.file.Paths");
    var URI = Java.use("java.net.URI");
    var pathName = "file://" + fileName;
    var path = Paths.get(URI.create(pathName));
    var fileBytes = Files.readAllBytes(path);
    var ret = JString.$new(fileBytes);
    console.log(ret)
    return ret;
});

执行脚本,读取上面写入的 text.txt 文件:
图片描述

3.2 主动调用 libc api 实现文件读取

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
function readFile_2(fileName){
    var addr_fopen = Module.findExportByName("libc.so", "fopen");
    var addr_fread = Module.findExportByName("libc.so", "fread");
    var addr_fseek = Module.findExportByName("libc.so", "fseek");
    var addr_ftell = Module.findExportByName("libc.so", "ftell");
    var addr_fclose = Module.findExportByName("libc.so", "fclose");
     
    var fopenptr = new NativeFunction(addr_fopen, "pointer", ["pointer", "pointer"]);
    var freadptr = new NativeFunction(addr_fread, 'int', ['pointer', 'int','int','pointer']);
    var fseekptr = new NativeFunction(addr_fseek, 'int', ['pointer', 'int','int']);
    var ftellptr = new NativeFunction(addr_ftell, "int", ["pointer"]);
    var fcloseptr = new NativeFunction(addr_fclose, "int", ["pointer"]);
 
    var pf = fopenptr(Memory.allocUtf8String(fileName), Memory.allocUtf8String("rb"))
    fseekptr(pf, 0, 2);
    var size = fseekptr(fp);
    fseekptr(pf, 0, 0);
    console.log(size)
    var databuffer = Memory.alloc(size);
    freadptr(databuffer, 1, size, pf);
    console.log(databuffer.readCString())
    fcloseptr(file);
}
var fileName = "/sdcard/test.txt"
readFile_2(fileName);

执行脚本,读取上面写入的 text.txt 文件:
图片描述

0x04 总结

理论上无论从 Java 层和 so 层入手都可以实现文件的读写操作,但是在不同的 Android 版本上总是会遇到不同的问题,如在 Android 4.4 中我无法用 Java api 实现文件的读取操作,总结来看 Java 层无法读文件的情况居多,大部分版本中 so 层的脚本都是能够解决文件读写问题。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2023-7-25 09:49 被行简编辑 ,原因:
收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 62
活跃值: (556)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-7-24 20:51
2
1
支持一下 不过感觉用frida的cModule功能也许会更方便些
雪    币: 2671
活跃值: (3839)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
行简 2023-7-24 22:19
3
1
万里星河 支持一下 不过感觉用frida的cModule功能也许会更方便些
new CModule(source[,symbols]) 
看frida api介绍主要是用于将C source代码字符串编译为机器码放入内存中。
用于实现调用非常频繁的回调,例如:Interceptor和Stalker。
貌似不能用于文件读写。
雪    币: 19349
活跃值: (28971)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-7-25 09:22
4
1
mark
雪    币: 510
活跃值: (3811)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
codeoooo 2023-7-25 20:22
5
0
tql
雪    币: 733
活跃值: (570)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我想你了 2023-7-26 19:37
6
0
学习了
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_vstoqbfr 2023-8-20 23:47
7
0
能问下怎么直接运行frida的js脚本吗?不附加进程的情况下
游客
登录 | 注册 方可回帖
返回