首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
Linux系统可卸载内核模块完全指南(上)
来源:www.unix5.com 作者:riechelr_hl(收集) 发布时间:2007-06-06  
简介

把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支持。

#define MODULE
#include 
int init_module(void)
{
printk("<1>Hello World\n");
return 0;
}
void cleanup_module(void)
{
printk("<1>Bye, Bye");
}

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

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

 

# gcc -c -O3 helloworld.c

# insmod helloworld.o

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

 

# lsmod

Module     Pages  Used by

helloworld     1    0

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

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

# rmmod helloworld


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

1.2什么是系统调用

我希望你能够懂,每个操作系统在内核中都有一些最为基本的函数给系统的其他操作调用。在Linux系统中这些函数就被称为系统调用(System Call)。他们代表了一个从用户级别到内核级别的转换。在用户级别中打开一个文件在内核级别中是通过sys_open这个系统调用实现的。在/usr/include/sys/syscall.h中有一个完整的系统调用列表。下面的列表是我的syscall.h

共4页: 上一页 1 [2] [3] [4] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·Linux系统可卸载内核模块完全指
·Linux系统可卸载内核模块完全指
·详解Linux 2.6内核新文件系统变
·Linux系统内核模块和驱动的编写
·内核设计篇
·Linux内核对I/O端口的管理实现(
·Linux内核对I/O端口的管理实现(
·使用 Linux 系统调用的内核命令
·Linux操作系统的源代码目录树结
·Linux 和对称多处理
·使用 SystemTap 调试内核
·Linux内核入侵检测安全增强实现

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!