内核系统调用openat Hook(Android10)

2024-06-07 23:38

本文主要是介绍内核系统调用openat Hook(Android10),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下操作基于安卓10系统lineageOs 17.1源码研究,手机型号oneplus3 镜像研究测试。

一、安卓内核模块开发编译

    安卓系统如何开发内核可加载模块参考以下文章:
 "安卓10源码学习开发定制(11)内核篇之安卓内核可加载模块开发编译"

二、内核系统调用hook原理

    内核系统调用hook主要是在内核模块加载的时候,通过修改替换内核系统调用表sys_call_table的系统调用号地址来实现目的。

三、内核源码默认配置修改支持系统调用挂钩功能

  • 为了通过insmod命令加载内核模块,需要增加Android内核可加载内核模块配置的支持。

  • 为了获取sys_call_table导出全局内核符号表的地址需要增加内核符号表导出配置功能。

  • 为了向内核内存空间读写数据,需要禁用Android内核的内存保护。需要关闭CONFIG_STRICT_MEMORY_RWX这个选项来编译内核。

   如下是所有相关的配置修改:

# ///ADD START
# 允许通过insmod命令加载模块
CONFIG_MODULES=y
# 允许通过命令rmmod命令卸载内核模块
CONFIG_MODULE_UNLOAD=y
# 关闭内核内存读写保护
CONFIG_STRICT_MEMORY_RWX=n# 打开该配置使符号表中包含所有的函数地址
CONFIG_KALLSYMS=y# 打开该配置方便通过adb shell cat /proc/kallsyms查看内核导出的符号地址
CONFIG_KALLSYMS_ALL=y
# ///ADD END

  将以上配置追加到安卓源码内核源文件中,文件路径如下:

home/qiang/lineageOs/kernel/oneplus/msm8996/arch/arm64/configs/lineageos_oneplus3_defconfig

   配置好之后编译一次源码,产生内核的编译输出文件。后续编写内核模块需要依赖这些文件来进行编译。

四、获取内核符号表地址

     将以上内核源码配置修改之后,编译安卓系统。lineageOs源码编译过程中会自动编译内核源码。内核编译输出目录如下:

/home/qiang/lineageOs/out/target/product/oneplus3/obj/KERNEL_OBJ

   在内核编译输出目录找到System.map文件。打开该文件找到system_call_table符号表的地址。如下所示:

qiang@ubuntu:~/lineageOs/out/target/product/oneplus3/obj/KERNEL_OBJ$qiang@ubuntu:~/lineageOs/out/target/product/oneplus3/obj/KERNEL_OBJ$ pwd
/home/qiang/lineageOs/out/target/product/oneplus3/obj/KERNEL_OBJqiang@ubuntu:~/lineageOs/out/target/product/oneplus3/obj/KERNEL_OBJ$ ls -la System.map 
-rw-rw-r-- 1 qiang qiang 4946646 2月   3 22:46 System.mapqiang@ubuntu:~/lineageOs/out/target/product/oneplus3/obj/KERNEL_OBJ$ cat System.map  |grep "sys_call_table"ffffffc000093000 T compat_sys_call_table
ffffffc001057000 R sys_call_table

从以上System.map文件可以知道sys_call_table符号地址为:0xffffffc001057000

五、挂钩openat函数模块开发

     可加载模块openat hook核心关键代码如下:

//保存内核系统原有的openat函数地址
asmlinkage int (*real_openat)(int, const char __user*,int,umode_t);//保存系统调用表地址
void **sys_call_table;// 替换内核系统调用openat新的new_openat函数
int new_openat(int dirfd, const char __user* pathname, int flags,umode_t modex)
{int ret=-1;//cred 中保存了当前进程的uid pid等信息const struct cred *cred = current_cred();kuid_t uid=cred->uid;int pid=current->pid;int myuid=uid.val;if(myuid>10000){char bufname[256]={0};strncpy_from_user(bufname,pathname,255);//打印日志输出测试printk("openat pathname:%s  uid:%d pid:%d\n",bufname,myuid,pid);}ret= real_openat(dirfd, pathname, flags,modex);return ret;
}//模块加载的时候调用
static int __init hook_init(void){printk("load module success\n");//sys_call_table符号地址sys_call_table=(void*)0xffffffc001057000;printk("sys_call_table %p",(void*)sys_call_table);// 获取openat函数的调用地址real_openat = (void*)(sys_call_table[__NR_openat]);printk("11111111  real_openat %p\n",(void*)real_openat);//替换系统调用表openat函数地址sys_call_table[__NR_openat]=(unsigned long*)new_openat;printk("replace openat finish");return 0;
}

六、测试模块

    1. 编译内核模块,本人编译的模块为kernel_hook_openat.ko

        安卓系统如何开发内核可加载模块参考以下文章:
        "安卓10源码学习开发定制(11)内核篇之安卓内核可加载模块开发编译"

    2. 将内核模块adb push到手机,并用insmod命令加载模块,如下图所示:

图片


    3. 打印内核日志验证,日志如下:

4,3927,3837282014,-;load module success
4,3928,3837282027,-;sys_call_table ffffffc00105700011111111  real_openat ffffffc0001db1f8
4,3929,3837282031,-;replace openat finish4,3974,3850163171,-;openat pathname:/system/lib64/libselinux.so  uid:10129 pid:5822
4,3975,3850163867,-;openat pathname:/system/lib64/libcutils.so  uid:10129 pid:5822
4,3976,3850164538,-;openat pathname:/system/lib64/libprocessgroup.so  uid:10129 pid:5822
4,3977,3850164870,-;openat pathname:/system/lib64/libcrypto.so  uid:10129 pid:5822
4,3978,3850165322,-;openat pathname:/system/lib64/libz.so  uid:10129 pid:5822
4,3979,3850165703,-;openat pathname:/system/lib64/libc.so  uid:10129 pid:5822
4,3980,3850167419,-;openat pathname:/system/lib64/libm.so  uid:10129 pid:5822
4,3981,3850167877,-;openat pathname:/system/lib64/libdl.so  uid:10129 pid:5822
4,3982,3850168240,-;openat pathname:/system/lib64/libc++.so  uid:10129 pid:5822
4,3983,3850168565,-;openat pathname:/system/lib64/libpcre2.so  uid:10129 pid:5822
4,3984,3850168795,-;openat pathname:/system/lib64/libpackagelistparser.so  uid:10129 pid:5822
4,3985,3850169027,-;openat pathname:/system/lib64/libbase.so  uid:10129 pid:5822
4,3986,3850169780,-;openat pathname:/system/lib64/libcgrouprc.so  uid:10129 pid:5822
4,3987,3850179680,-;openat pathname:/sys/kernel/mm/transparent_hugepage/enabled  uid:10129 pid:5822
4,3988,3850180250,-;openat pathname:/dev/__properties__/property_info  uid:10129 pid:5822
4,3989,3850180348,-;openat pathname:/dev/__properties__/properties_serial  uid:10129 pid:5822
4,3990,3850180448,-;openat pathname:/dev/__properties__/u:object_r:default_prop:s0  uid:10129 pid:5822
4,3991,3850180496,-;openat pathname:/dev/__properties__/u:object_r:debug_prop:s0  uid:10129 pid:5822
4,3992,3850180572,-;openat pathname:/dev/__properties__/u:object_r:heapprofd_prop:s0  uid:10129 pid:5822
4,3993,3850180722,-;openat pathname:/system/lib64/libnetd_client.so  uid:10129 pid:5822

参考文章:

  • Hooking Android System Calls for Pleasure and Benefit

    https://www.cnblogs.com/lanrenxinxin/p/6289436.html

图片

这篇关于内核系统调用openat Hook(Android10)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040627

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同