【Android】Frida Hook 文件读写操作

news2024/11/19 19:31:47

前言

在挖掘客户端漏洞的时候,通常会关注应用对什么文件进行了读写操作,当我们能控制被读的文件或观测到敏感写入的文件,通常可以造成一定危害。本文详细介绍了如何通过frida监控文件读写操作。

相关知识

1. 读写相关调用api

在Linux系统下,文件的创建、读取、追加、写入和删除等操作涉及到以下系统调用:

  • open:打开文件,用于创建和打开文件。
  • fopen: 打开文件
  • read:从文件中读取数据。
  • write:向文件中写入数据。
  • lseek:移动文件指针。
  • close:关闭文件。
  • unlink:删除文件。

2. Interceptor.attach

在Frida中,**Interceptor.attach()**是一个用于拦截函数调用的函数。它可以让我们在目标进程中拦截任意函数调用,并在函数调用前或函数调用后执行自定义的JavaScript代码。

Interceptor.attach()函数的语法如下:

Interceptor.attach(target, callbacks)

其中,target参数指定要拦截的函数,可以是函数名或函数地址。callbacks参数是一个回调函数对象,用于定义拦截函数调用时要执行的代码。回调函数对象可以包含以下函数:

  • onEnter(args):在函数调用之前执行的回调函数,args参数是一个数组,包含了函数调用时的参数。
  • onLeave(retval):在函数调用之后执行的回调函数,retval参数是函数调用的返回值。

3. Interceptor

在Frida中,Interceptor对象是一个用于拦截函数调用和修改函数实现的工具集。除了**Interceptor.attach()**函数外,Interceptor对象还提供了以下几个常用的方法:

  • Interceptor.replace(target, replacement):用于替换函数实现。target参数指定要替换的函数,可以是函数名或函数地址;replacement参数是一个JavaScript函数,用于替换原函数的实现。替换函数的参数和返回值需要和原函数保持一致。以下是一个使用Interceptor.replace()函数替换strcmp()函数实现的示例:
// Replace the implementation of strcmp() 
function Interceptor.replace(
	Module.findExportByName("libc.so", "strcmp"), 
	new NativeCallback(function (str1, str2) {   
		console.log("strcmp() called with arguments: " + Memory.readUtf8String(str1) + ", " + Memory.readUtf8String(str2));   
		return 0; 
	}, 'int', ['pointer', 'pointer'])); 
  • Interceptor.attachOnce(target, callbacks):用于一次性拦截函数调用。与Interceptor.attach()函数不同,Interceptor.attachOnce()函数只会拦截一次函数调用,然后自动解除拦截。这个方法的参数和Interceptor.attach()函数相同。

  • Interceptor.detachAll():用于解除所有拦截器。这个方法会解除所有通过Interceptor.attach()和Interceptor.attachOnce()函数添加的拦截器。

  • Interceptor.flush():用于刷新所有修改过的函数实现。在修改函数实现后,需要调用Interceptor.flush()函数来刷新目标进程中的函数缓存。这样做可以确保修改后的函数实现能够生效。

4. Module.findExportByName()

Module.findExportByName()是一个用于查找指定模块中导出函数地址的函数。它可以通过模块名称和函数名来查找函数地址,并返回一个指向函数地址的NativePointer对象。

Module.findExportByName()函数的语法如下:

Module.findExportByName(moduleName, symbolName)

其中,moduleName参数是要查找的模块名称,可以是模块文件名或模块名称字符串;symbolName参数是要查找的函数名称,可以是函数名字符串或函数地址。需要注意的是,如果moduleName是模块文件名,则需要包含文件路径信息,并且路径分隔符需要使用反斜杠(\)转义。

如果第一个参数是NULL,则表示在全局进行搜索函数。

以下是一个使用Module.findExportByName()函数查找libc.so模块中的printf()函数地址的示例:

var printfAddr = Module.findExportByName("libc.so", "printf");
console.log("printf() address: " + printfAddr);

在上述示例中,我们使用Module.findExportByName()函数查找libc.so模块中的printf()函数地址,并将结果输出到控制台。

需要注意的是,Module.findExportByName()函数只能在已经加载的模块中查找函数地址。如果要查找未加载的模块中的函数地址,可以使用Module.load()函数动态加载模块,并使用Module.getExportByName()函数查找函数地址。

监控文件读写的Frida脚本

基于上述相关知识,写出下列frida脚本

function hook_file_read() {

    // Hook open、fopen、read函数
    Interceptor.attach(Module.findExportByName(null, "open"), {
        onEnter: function (args) {
            var path = Memory.readUtf8String(args[0]);
            this.path = path;
        },
        onLeave: function (retval) {
            if (retval > 0) {
                console.log("[open] path: " + this.path);


            }
        }
    });

    Interceptor.attach(Module.findExportByName(null, "fopen"), {
        onEnter: function (args) {
            var path = Memory.readUtf8String(args[0]);
            this.path = path;
        },
        onLeave: function (retval) {
            if (retval != 0) {
                console.log("[fopen] path: " + this.path);

            }
        }
    });

    Interceptor.attach(Module.findExportByName(null, "read"), {
        onEnter: function (args) {
            this.fd = args[0].toInt32();
            this.buf = args[1];
            this.size = args[2].toInt32();
        },
        onLeave: function (retval) {
            if (retval > 0 && this.fd > 0) {
                var data = Memory.readByteArray(this.buf, retval >>> 0);
                console.log("[read] fd: " + this.fd + ", size: " + retval + ", data: " + data);
            }
        }
    });
    // 3. Hook the write system call
    Interceptor.attach(Module.findExportByName(null, "write"), {
        onEnter: function (args) {
            // Get the file descriptor and buffer address
            var fd = args[0].toInt32();
            var buf = args[1];

            // Log the write call
            console.log("[write] fd: " + fd + ", buf: " + buf);
        }
    });

    // 4. Hook the lseek system call
    Interceptor.attach(Module.findExportByName(null, "lseek"), {
        onEnter: function (args) {
            // Get the file descriptor and offset
            var fd = args[0].toInt32();
            var off = args[1].toInt32();

            // Log the lseek call
            console.log("[lseek] fd: " + fd + ", offset: " + off);
        }
    });

    // 5. Hook the close system call
    Interceptor.attach(Module.findExportByName(null, "close"), {
        onEnter: function (args) {
            // Get the file descriptor
            var fd = args[0].toInt32();

            // Log the close call
            console.log("[close] fd: " + fd);
        }
    });

    // 6. Hook the unlink system call
    Interceptor.attach(Module.findExportByName(null, "unlink"), {
        onEnter: function (args) {
            // Get the file path
            var path = Memory.readUtf8String(args[0]);

            // Log the unlink call
            console.log("[unlink] path: " + path);
        }
    });


}

// 调用hook_file_read函数
setImmediate(hook_file_read);

运行实例:
在这里插入图片描述

后话

Interceptor.attach非常强大,主要还是看挖掘思路,往往能起到非常好的辅助效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有哪些自媒体平台有播放量就会有收益?

自媒体是近年来兴起的一种新型媒体,指的是由个人或小团体通过互联网自行发布内容,通过社交媒体等渠道传播和推广的媒体形态。自媒体平台的出现,让更多人能够自由发表意见和观点,实现了信息的自由传播。同时,随着互联网…

跨平台.NET应用UI组件DevExpress XAF v22.2亮点 - 支持.NET 7

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…

数据结构——二叉树基础结构篇(C语言)

引言 现在是北京时间2023年6月13日9点11分。从决定要开始减脂之后,饥饿总是伴随着我。一觉起来肚子咕咕叫,我还是想先把文章发了再吃第一餐。燕麦加蛋白粉几乎伴随了我大学的第一年早饭。昨天练了一个小时背,练背后还做了45分钟有氧。空腹训…

BeautifulPrompt:PAI推出自研Prompt美化器,赋能AIGC一键出美图

作者:曹庭锋、汪诚愚、吴梓恒、黄俊 背景 Stable Diffusion(SD)是一种流行的AI生成内容(AI Generated Content,AIGC)模型,能在文字输入的基础上生成各种风格多样的图像。在目前的AIGC方向&…

十五周算法训练营——普通动态规划(上)

今天是十五周算法训练营的第十一周,主要讲普通动态规划(上)专题。(欢迎加入十五周算法训练营,与小伙伴一起卷算法) 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那…

设计模式——适配器模式

1.定义 将一个类的接口转换成客户所希望的另一个接口,Adapter模式使得那些原本因为接口不兼容而不能一起工作的那些类可以一起工作。 2.使用场景 一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式算是“无…

驱动开发:内核LoadLibrary实现DLL注入

远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建线程并调用 LoadLibrary 动态载入指定的DLL来实现注入,而在内核层同样存在一个类似的内核函数RtlCreateUserThread,但需要…

【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl

AP是在目标检测任务中,尝尝被用于评估模型预测能力的指标。那AP是什么?为什么能够充当不同模型综合对比评测的公认指标呢? 在学习下文之前,混淆矩阵和ROC可以先了解下: 【模型评估】混淆矩阵(confusion_m…

世界中西医结合医学研究院一行莅临万民健康交流指导

为进一步发展中医药产业,深入挖掘中医药文化,坚持中西医并重,传承精华,守正创新,助力乡村振兴、促进乡村医疗产业发展。6 月 10 日 , 世界中西医结合医学研究院医学工程院院士罗先义 、谈家桢生命基金会主任…

测试左移及其相关实践

本文首发于个人网站「BY林子」,转载请参考版权声明。 之前在《敏捷测试的核心》、《构建测试的体系化思维(进阶篇)》和《一页纸测试策略》等文章中提到过测试左移,但是没有专门针对这个主题做过系统的介绍,但又总是被社…

M4内核的FPU/DSP使用总结

FPU简介 近年,在Cortex-M3之后ARM公司又推出Cortex-M4内核,ARM Cortex-M4处理器是由ARM专门开发的最新嵌入式处理器,在M3的基础上强化了运算能力,新加了浮点、DSP、并行计算等。Cortex-M4处理器的最大亮点之一,也是本文…

dom-to-image分享多张异步图片遇到的坑

dom-to-image库 存在的问题 github-issue地址 问题:当超过一张图片时,ios/safari首次会出现某张图片空白,再次生成canvas才正常。 之前有一张图片时通过执行2次domtoimage.toJpeg(魔法),当超过1张图片时&a…

JavaWeb笔记(一)

Java网络编程 在JavaSE阶段,我们学习了I/O流,既然I/O流如此强大,那么能否跨越不同的主机进行I/O操作呢?这就要提到Java的网络编程了。 **注意:**本章会涉及到计算机网络相关内容(只会讲解大致内容&#x…

PyTorch 深度学习 || 专题八:PyTorch 全连接网络分类

PyTorch 全连接网络分类 文章目录 PyTorch 全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as plt from sklear…

Java企业级信息系统开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/pG623】 文章目录 一、Spring Boot单元测试概述1.1 对项目HelloWorld01进行单元测试1. 添加测试依赖启动器和单元测试2. 创建测试类与测试方法 1.2 对项目HelloWorld02进行单元测试1. 添加单元测试…

C++冷知识:构造函数初始化时,为什么使用 : 而不是使用作用域内初始化对象?

:是什么? 这样的行为被称之为初始化列表。具体展示如下: 直接初始化对象。 以一个线程池类为例: class ThreadPool { public:// 构造函数,创建指定数量的线程ThreadPool(size_t num_threads) : stop(false){....}// 析构函数&…

【计算摄影学】总目录

1.数码相机 《数码相机中的图像传感器和信号处理》和《光与赢的魔幻乐园有趣的透镜》 1.1 数码相机概览 1.2 数码相机中光学系统 2.图像传感器 《数码相机中的图像传感器和信号处理》和《智能cmos图像传感器与应用》 2.1 图像传感器基础知识 2.2 CCD图像传感器 2.3 CMOS图像…

RankNet方法在移动终端的应用

RankNet方法在移动终端的应用 RankNet代码示例pythonJava 移动终端的应用 RankNet RankNet 是一种排序学习方法,由 Microsoft Research 提出,用于解决排序问题。它基于神经网络,并使用一对比较的方式来训练和优化模型。 在 RankNet 中&…

你的企业还没搭建这个帮助中心网页,那你太落后了!

作为现代企业,拥有一个完善的帮助中心网页已经成为了不可或缺的一部分。帮助中心网页不仅可以提供给用户有关产品或服务的详细信息,还可以解答用户的疑问和提供技术支持,使用户在使用产品或服务时遇到问题可以很快地得到解决。因此&#xff0…

内网隧道代理技术(四)之NETSH端口转发

NETSH端口转发 NETSH介绍 netsh是windows系统自带命令行程序,攻击者无需上传第三方工具即可利用netsh程序可进行端口转发操作,可将内网中其他服务器的端口转发至本地访问运行这个工具需要管理员的权限 本地端口转发 实验场景 现在我们有这么一个环境…