Linux内核Hook系统调用execve

article/2025/8/12 13:04:03

资源下载地址:linux内核hook系统调用execve函数-Linux文档类资源-CSDN下载

(已在内核为 4.19.0-amd64-desktop版本uos编译通过,并成功达到目的)

在Linux系统中,用户层程序无法直接控制系统内核,只能通过系统调用。

一般调用顺序为:

用户进程->execve()->syscall()->stub_execve()->sys_execve()-> do_execve().....

本文章使用的是国产uos-Linux,内核为 4.19.0-amd64-desktop

使用strace命令,可以查看进程的系统调用(以deepin-calculator这个进程为例):

 可见第一行即使用了execve系统调用。

那么,我们可以在内核中对execve函数进行hook,加入你想干的事情(比如让他打不开,又或者做一些邪恶的事情~),这里我们来让系统无法使用dpkg命令,也就是整个系统现在装不了也卸载不了软件了~~

(1)函数声明

typedef asmlinkage long (*m_sys_call_ptr_t)(const struct pt_regs *);static m_sys_call_ptr_t *psys_call_table;m_sys_call_ptr_t old_execve ; 

(2)获取系统调用地址

psys_call_table = (m_sys_call_ptr_t *)kallsyms_lookup_name("sys_call_table");

(3)替换系统调用

	disable_write_protect();old_execve = psys_call_table[__NR_execve];psys_call_table[__NR_execve] = HookGetExecves;enable_write_protect(); 	

注意这里替换的时候需要先对内核代码段打patch,也就是对开启内核代码段的保护(CR0),替换完毕后再关闭:

//关闭内存写保护
void disable_write_protect(void) { write_cr0(read_cr0() & (~0x10000)); }
// 开启内存写保护
void enable_write_protect(void) { write_cr0(read_cr0() | 0x10000); }

(4)自定义hook函数,做你想做的事情

这里,我直接让deep-calculator起不来,无法打开

asmlinkage long HookGetExecves(const struct pt_regs * regs)
{char __user *filename = (char *)regs->di;char user_filename[NAME_MAX] = {0};long copied = strncpy_from_user(user_filename,filename,NAME_MAX);//printk("%s  %s %d  %d\n",__func__,user_filename,copied, NAME_MAX);if((strcasecmp(user_filename,"/usr/bin/dpkg")==0)){const char * const *argv = (const char *const *)regs->si;get_user_cmdline(argv, user_filename, NAME_MAX); // 解析出命令行,如果进程后面加了参数printk("====%s=====\n",user_filename); return -1; //这里让程序无法打开,直接退出}return old_execve(regs);
}

(5)还原系统调用

disable_write_protect();psys_call_table[__NR_execve] = old_execve;enable_write_protect();

最后,写个makefile编译一下,如图:

 然后 sudo insmod hook.ko将编译好的内核模块,加载进去:

输入sudo dmesg --follow 可跟踪查看内核打印的消息,因为我们在代码中加了printk,现在来使用dpkg这个命令,看看有什么效果。

 

上面是使用dpkg -l 命令查看所有软件,发现现在dpkg已经用不了了。

然后下面的内核也打印出了printk里面的内容,即我们所调用的进程以及参数。

 资源下载地址:linux内核hook系统调用execve函数-Linux文档类资源-CSDN下载


http://chatgpt.dhexx.cn/article/EqYf5Uee.shtml

相关文章

执行新程序 execve()

新程序的执行 一:execve() 之所以叫新程序的执行,原因是这部分内容一般发生在fork()和vfork()之后,在子进程中通过系统调用execve()可以将新程序加载到子进程的内存空间。这个操作会丢弃原来的子进程execve()之后的部分,而子进程…

简单的execve流程

本文转载于网络 基于Linux0.11源码来叙述该功能,源码可以在oldlinux.org上自行获取 _sys_execve:lea EIP(%esp),%eax #取堆栈中存放系统调用的返回地址的地址pushl %eax #将该地址入栈call _do_execve #调用do_execve函数addl $4,%esp #丢弃该地址ret这边做了一个很…

Linux0.11系统调用之execve流程解析

Linux0.11系统调用之execve流程解析 前言execve功能介绍execve本质execve系统调用流程总结 前言 本文是基于Linux0.11源码来叙述该功能,源码可以在oldlinux.org上自行获取。 execve功能介绍 execve是用于运行用户程序(a.out)或shell脚本的…

5.execve()到底干了啥?

导语 很多童鞋有分析阅读Linux源代码的强烈愿望,可是Linux内核代码量庞大,大部分人不知道如何下手,以下是我分析Linux源代码的一些经验,仅供参考,有不实之处请大神指正! 1.要想阅读内核首先要进入内核&…

Linux系统编程(再论execve)

文章目录 前言一、execve的第三个参数二、进程空间三、命令行参数规范四、optstring规则的扩展定义总结 前言 本篇文章我们继续来研究一下execve这个系统调用,上篇文章已经讲解了前两个参数的意义了,那么这篇文章就来讲解一下第三个参数的具体含义。 一…

Linux0.11 execve函数(六)

系列文章目录 Linux 0.11启动过程分析(一) Linux 0.11 fork 函数(二) Linux0.11 缺页处理(三) Linux0.11 根文件系统挂载(四) Linux0.11 文件打开open函数(五&#xff09…

C语言 execve()函数使用方法

1.君の名は execve() – 叫做执行程序函数 就像Python中的os.system(cmd)这个函数,我们可以用这个函数来执行我们的shell脚本,单独的shell命令,或者是调用其他的程序,我们的execve()这个函数就和Python中的os.system函数类似&am…

SPSS-因子分析

因子分析 有可能用较少的综合指标分析存在于各变量中的各类信息,而各综合指标之间彼此是不相关的,代表各类信息的综合指标称为因子。定义:因子分析就是用少数几个因子来描述许多指标或因素之间的联系,以较少几个因子反映原资料的 …

spss进行主成分分析

什么是主成分分析 简而概之, 就是一组数据受太多因素影响, 选出几个能代表他们的因素,并进行线性组合得到一组比原维度小的因素组合, 作为新的因素集 用spss操作 随手拿出一组数据 1.数据统一标准化 因为我们得到的原始数据大小,类型不一, 一起分析会不准确, 所以将数据全部…

实用干货!因子分析超全步骤总结

因子分析是统计数据分析方法之一,因子分析包括探索性因子分析和验证性因子分析。本文主要讨论探索性因子分析。 一、研究背景 关于工作满意度有14个问题,调研得到215份问卷结果。希望通过因子分析,用少量因子反映14个题目的信息,…

NLP | 朴素贝叶斯法的学习与分类

朴素贝叶斯法的学习与分类 《统计学习方法》李航第四章 1、概述 书上对朴素贝叶斯的描述如下: 朴素贝叶斯法时基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然…

标定相机参数-张正友方法

一、实验原理 1.计算外参 设三维世界坐标的点为M=[X,Y,Z,1]T,二维相机平面像素坐标为m=[u,v,1]T,所以标定用的棋盘格平面到图像平面的单应性关系为: sm=A[R,t]M 其中 不妨设棋盘格位于Z = 0,定义旋转矩阵R的第i列为 ri, 则有: 令H=[h1 h2 h3]=λA[r1 r2 t] 于是空间到图…

《统计学习方法》——朴素贝叶斯法

引言 朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。朴素贝叶斯法实现简单,学习与预测的效率都很高,是一种常用的方法。 这一章需要大量的概率论知识,忘记了的同学建议先参阅人工智能数学基础之概率论。 朴素贝…

数据挖掘十大算法之 naïve Bayes

朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的分类方法。朴素贝叶斯法实现简单,学习与预测的效率都很高,被广泛应用于文本分类、垃圾邮件过滤、自然语言处理等场景。下面我们来介绍贝叶斯定理,在介绍贝叶斯定理之前,先介绍下…

专题:深度神经网络基本问题的原理详细分析和推导

文章目录 **写在最前面****1 神经网络算法的直观了解****1.1 神经网络过程描述**:**1.2 神经网络相关的几个问题****1.2.1 表征假设和激活函数** **1.2.2 结构设计(Architecture Design)****1.2.3 代价函数(Cost Function)和优化目标(Optimization objective)****1.…

第四章 朴素贝叶斯法

文章目录 朴素贝叶斯法的学习与分类基本方法数据定义学习联合概率分布如何求出条件概率分布?如何分类? 后验概率最大化的含义 朴素贝叶斯的参数估计法极大似然估计学习分类算法贝叶斯估计 朴素贝叶斯法(与贝叶斯估计是不同的概念)…

GAN生成对抗式神经网络数学推导

由上面一篇文章我们已经知道了,如果我们从真实数据分布里面取n个样本,根据给定样本我们可以列出其出现概率的表达式,那么生成这N个样本数据的似然(likelihood)就是 l ( θ ) ∏ i 1 N p ( x i ∣ θ ) l ( \theta ) \prod _ { i 1 } ^ { …

《统计学习方法》学习笔记(三)之 朴素贝叶斯法

朴素贝叶斯法 总述 朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练数据集,首先基于特征独立性假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 x x x,利用贝叶斯定理求出后验概率最…

朴素贝叶斯(二)|极大似然估计+学习与分类算法+贝叶斯估计| 《统计学习方法》学习笔记(十六)

朴素贝叶斯法的参数估计 1. 极大似然估计 在朴素贝叶斯法中,学习意味着估计 P ( Y c k ) P(Yc_k) P(Yck​)和 P ( X ( j ) x ( j ) ∣ Y c k ) P(X^{(j)}x^{(j)}|Yc_k) P(X(j)x(j)∣Yck​)。可以应用极大似然估计法估计相应的概率。先验概率 P ( Y c k ) P(Yc…

一文看懂 “极大似然估计” 与 “最大后验估计” —— 最大后验估计篇

本文历次修订后全长 2万8000余字,受到 CSDN 博文字数限制,故切分两篇发布,所以现在是两文看懂了… 前篇介绍参数估计背景和极大似然估计;本篇介绍最大后验估计和两种方法对比请务必先看前文:一文看懂 “极大似然估计”…