Linux系统可卸载内核模块完全指南(上)

简介:

简介

将Linux操作系统用于服务器在现在是越来越普遍了。因此,入侵Linux在今天也变得越来越有趣.目前最好的攻击Linux的技术 就是修改内核代码。由于一种叫做可卸载内核(LoadableKernelModules(LKMs))的机制,我们有可能编写在内核级别运行的代码,而 这种代码可以允许我们接触到操作系统中非常敏感的部分。

在过去有一些很好的关于LKM知识的文本或者文件,他们介绍一些新的想法,方法以及一名Hacker所梦寐以求的完整的LKMs.而且也有一些很有趣的公开的讨论(在新闻组,邮件列表)。

然而为什么我再重新写这些关于LKMs的东西呢?下面是我的一些理由:

在过去的教材中常常没有为那些初学者提供很好的解释。而这个教材中有很大一部分的基础章节。

这是为了帮助那些初学者理解概念的。我见过很多人使用系统的缺陷或者监听器然而却丝毫不了解他们是如何工作的。在这篇文章中我包含了很多带有注释的源代码,只是为了帮助那些认为入侵仅仅是一些工具游戏的初学者!

每一个发布的教材不过把话题集中在某个特别的地方。没有一个完整的指导给那些关注LKMs的Hacker。这篇文章会覆盖几乎所有的关于LKMs的资料(甚至是病毒方面的)。

这篇文章是从Hacker或者病毒的角度进行讨论的,但是系统管理员或者内核的开发者也可以参考并从中学到很多东西。

以前的文章介绍一些利用LKMs进行入侵的优点或者方法,但是总是还有一些东西是我们过去从来没有听说过的。这篇文章会介绍一些新的想法给大家。(不是所有的新的资料,只是一些对我们有帮助的)

这篇文章会介绍一些简单的防止LKM攻击的方法,同时也会介绍如何通过使用一些像运行时内核补丁(Runtime Kernel Patching)这样的方法来对付这些防御措施。

要记住这些新的想法仅仅是通过利用一些特殊的模块来实现的.要在现实中真正使用他们还需要对他们进行改进。这篇文章的主要目的是给大家在整个LKM上一个 大方向上的指导。在附录A中,我会给大家一些实用的LKMs,并附上一些简短的注释(这是为那些新手的),以及如何使用他们。

整篇文章(除了第五部分)是基于 Linux 2.0.x的80x86机器的。我测试了所有的程序和代码段。为了能够正常使用这里提供的绝大部分代码,你的Linux系统必须有LKM支持。


只有在第四部分会给大家一些不需要LKM支持的源代码。本文的绝大多数想法一样可以在Linux2.2.x上实现(也许你会需要一些小小的改动)。

这篇文章会有一个特别的章节来帮助系统管理员进行系统安全防护。你(作为一名Hacker)也必须仔细阅读这些章节。你必须要知道所有系统管理员知道的,甚至更多。你也会从中发现很多优秀的想法。这也会对你开发高级的入侵系统的LKMs有所帮助。

因此,通读这篇文章吧。

第一部分. 基础知识

1.1 什么是LKMs

LKMs就是可卸载的内核模块(Loadable Kernel Modules)。这些模块本来是Linux系统用于扩展他的功能的。使用LKMs的优点有:他们可以被动态的加载,而且不需要重新编译内核。由于这些优 点,他们常常被特殊的设备(或者文件系统),例如声卡等使用。

每个LKM至少由两个基本的函数组成:

加载一个模块(常常只限于root能够使用)的命令是:

这个命令让系统进行了如下工作:

加载可执行的目标文件(在这儿是module.o)

调用 create_module这个系统调用(至于什么叫系统调用,见1.2)来分配内存。

不能解决的引用由系统调用get_kernel_syms进行查找引用。

在此之后系统调用init_module将会被调用用来初始化LKM->执行 int inti_module(void) 等等

(内核符号将会在1.3节中内核符号表中解释)

OK,到目前为止,我想我们可以写出我们第一个小的LKM来演示一下这些基本的功能是如何工作的了。

你可能会奇怪为什么在这里我用printk(....)而不是printf(.....).在这里你要明白内核编程是完全不同于普通的用户环境下的编程 的。你只能使用很有限的一些函数(见1.6)仅使用这些函数你是干不了什么的。因此,你将会学会如何使用你在用户级别中用的那么多函数来帮助你入侵内核。 耐心一些,在此之前我们必须做一点其他的.....

上面的那个例子可以很容易的被编译:

OK,现在我们的模块已经被加载了并且给我们打印出了那句很经典的话.现在你可以通过下面这个命令来确认你的LKM确实运行在内核级别中:

这个命令读取在 /proc/modules 的信息来告诉你当前那个模块正被加载。'Pages' 显示的是内存的信息(这个模块占了多少内存页面)。'Used by'显示了这个模块被系统使用的次数(引用计数)。

这个模块只有当这个计数为0时才可以被除去。在检查过这个以后,你可以用下面的命令卸载这个模块

OK,这不过是我们朝LKMs迈出的很小的一步。我常常把这些LKMs于老的DOS TSR程序做比较,(是的,我知道他们之间有很多地方不一样),那些TSR能够常驻在内存并且截获到我们想要的中断.Microsoft'sWin9x有 一些类似的东西叫做VxD.关于这些程序的最有意思的一点在于他们都能够挂在一些系统的功能上,在Linux中我们称这些功能为系统调用。


 



      本文转自glying 51CTO博客,原文链接:http://blog.51cto.com/liying/967702,如需转载请自行联系原作者




相关文章
|
6天前
|
资源调度 JavaScript 搜索推荐
Linux系统之部署envlinks极简个人导航页
【4月更文挑战第11天】Linux系统之部署envlinks极简个人导航页
40 2
|
8天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
9天前
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
58 0
|
9天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
26 0
|
16天前
|
存储 前端开发 Linux
Linux系统之部署ToDoList任务管理工具
【4月更文挑战第1天】Linux系统之部署ToDoList任务管理工具
61 1
|
7天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
20 6
|
2天前
|
运维 网络协议 Unix
18.系统知识-Linux常用命令
18.系统知识-Linux常用命令
|
6天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
16 3
|
11天前
|
Prometheus 监控 Cloud Native
【Linux】查看系统内存命令(详细讲解)
【Linux】查看系统内存命令(详细讲解)
|
13天前
|
Linux API C语言
FFmpeg开发笔记(一)搭建Linux系统的开发环境
本文指导初学者如何在Linux上搭建FFmpeg开发环境。首先,由于FFmpeg依赖第三方库,可以免去编译源码的复杂过程,直接安装预编译的FFmpeg动态库。推荐网站<https://github.com/BtbN/FFmpeg-Builds/releases>提供适用于不同系统的FFmpeg包。但在安装前,需确保系统有不低于2.22版本的glibc库。详细步骤包括下载glibc-2.23源码,配置、编译和安装。接着,下载Linux版FFmpeg安装包,解压至/usr/local/ffmpeg,并设置环境变量。最后编写和编译简单的C或C++测试程序验证FFmpeg环境是否正确配置。
35 8
FFmpeg开发笔记(一)搭建Linux系统的开发环境