内核调试和系统调用劫持

摘要:
如何在不重新编译内核和rmmod内核模块的情况下修改系统调用为了解决这个问题,最终实现了两种解决方案:1。Linux系统调用劫持2。Kprobes内核调试技术:Linux系统调用劫持:实际上是修改内核符号表以达到劫持效果。Kprobes是一个轻量级内核调试工具。它可以动态地将探测点插入内核中,可以使用kprobes技术重新运行,并在探测点执行用户定义的操作。以下是测试过程。您可以看到,每当内核调用sys_Write和sys_Write时,我们将首先调用探测函数。

如何在不重新编译内核,不rmmod内核模块的情况下修改系统调用

为了解决这个问题,最终实现了两种解决方式:

1.Linux系统调用劫持

2.Kprobes内核调试技术(并非真正的修改)

 

下面分别说下:

 

Linux系统调用劫持:

其实就是修改内核符号表,来达到一个劫持的作用。因为系统调用实际上是触发了一个0x80的软中断,然后转到了系统调用处理程序的入口system_call()system_call()会检查系统调用号来得出到底是调用哪种服务,然后会根据内核符号表跳转到所需要调用的内核函数的入口地址,所以,如果我们这个时候修改了内核符号表,使其跳转到我们自己的函数上,就可以完成劫持。

不过2.6之后,内核符号表便不再导出了,所以需要我们在内存中找到它的位置。具体查找的方式为:查找到中断向量表中的0x80中断服务函数的位置,然后在这个中断服务函数代码中查找根据内核符号表跳转的指令,从指令中可以分析出内核符号表的位置。

下面的是一个简单的劫持mkdir系统调用的测试,通过加载hook.ko内核模块,劫持mkdir系统调用,然后使用mkdir命令创建一个目录,来测试是否截齿成功。如果成功的话会输出“PID xxx called sys mkdir ! By qiankun”。结果测试成功。下面是经过。

 

内核调试和系统调用劫持第1张 

 

kprobes内核调试技术

     首先声明两点:

 1.这种方式其实并非修改,而是只是在运行的内核中动态的插入探测点,当内核运行到该探测点后可以执行用户预定义的回调函数。执行完毕后返回正常的执行流程。所以说他其实并非真正的修改了原有的系统调用。但是可以达到一定类似于修改了的效果,暂且算作一种“伪修改”吧。

2.我在测试的时候使用的是kprobes中的jprobe探测方式,其实其他的内核调试技术比如systemtap等应该能够实现这种功能,但是我就不一一实现了。

  

Kprobes是一个轻量级的内核调试工具,利用kprobes技术可以再运行的内核中动态的插入探测点,在探测点进行用户预定义的操作。

 

Kprobes使用主要可以分为三部分:

1.注册探测点部分。

2.调试处理部分。

3.注销探测点部分。

 

下面是使用kprobesjprobe探测方式,对sys_opensys_write进行添加探测点。这样可以一定程度上影响sys_opensys_write的最后结果,达到类似修改的目的。下面是测试过程,可以看到,每当内核调用sys_writesys_open的时候,都会先调用我们的探测函数。

 

 内核调试和系统调用劫持第2张

     代码如下:

内核调试和系统调用劫持第3张



来自为知笔记(Wiz)



附件列表

免责声明:文章转载自《内核调试和系统调用劫持》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ext Js简单Grid分页及选择器的使用Windows 2003单用户单会话登录远程桌面[转载]下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何调试程序的 Release 版本

很多时候程序的 Debug 版本运行没有任何问题,但是一旦发布 Release 版本后,运行就出错,着实让人郁闷。大家知道,VC++ 中 Release 版本是对无法对源代码进行调试的。一般的做法是在怀疑有错误的代码前后插入MessageBox 函数,在函数中显示可能导致错误的变量的值。或者插入写文件的语句,输出可能导致错误的变量的值到一个记录文件。其实,...

Web开发(F12调试)

参考学习: 参考:Node.js v12.16.1 文档 参考:Node.js 教程 | 菜鸟教程 目录 1、Node.js介绍及作用 1.1 Node.js介绍 1.2 Node.js作用 2、第一个Node.js程序 1)新建一个文件nodetest.js 2)通过node命令执行 3)Node.js全局变量 3、NPM介绍(...

30. 如何使用 GDB 调试 Go 程序?

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com 我的 Github:git...

Libevent:2设置

Libevent有一些整个进程共享的全局设置。这些设置会影响到整个的库。因此必须在调用Libevent其他函数之前进行设置,否则,LIbevent就会陷入不一致的状态。 一:Libevent中的日志信息 Libevent可以记录内部的error和warning信息,而且如果在编译时设置的话,它还可以记录debug消息。默认情况下,这些信息都会写到stde...

system 系统调用、gcc编译过程

system 库函数的功能是执行操作系统的命令或者运行指定的程序 #include <stdio.h> #include <stdlib.h>//引入库 int main() { //system("notepad");//打开记事本 system("dir");//查看目录   system("ipconfig")...

C#中的release和debug模式

以下内容来源:https://www.cnblogs.com/rgjycs/p/9254332.html 在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好...