热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

关于Linux内核级后门的原理和简单实战

来源: 作者: 时间:2007-06-13 Tag: 点击:

linux是一个具有保护模式的操作系统。它一直工作在i386 cpu的保护模式之下。

内存被分为两个单元: 内核区域和用户区域。(译者注:我觉得还是这样叫比较顺口)内核区域存放并运行着核心代码,当然,顾名思义,用户区域也存放并运行用户程序。当然,作为用户进程来讲它是不能访问内核区域内存空间以及其他用户进程的地址空间的。

不幸地是, 核心进程也有同样的情况。核心代码也同样不能访问用户区地地址空间。

那么,这样做到底有什么意义呢?好, 我们假设当一个硬件驱动试图去写数据到一个用户内存空间的程序里的时候, 它是不可以直接去完成的, 但是它可以利用一些特殊的核心函数来间接完成。同样, 当参数需要传递地址到核心函数中时,核心函数也不能直接的来读取该参数。同样的,它可以利用一些特殊的核心函数来传递参数。

这里有一些比较有用的核心函数用来作为内核区与用户区相互传递参数用。

#include

get_user(ptr)

从用户内存获取给定的字节, 字,或者长整形。这只是一个宏(在核心代码里面有此宏的详细定义),并且它依据参数类型来确定传输数量。所以你必须巧妙地利用它。

put_user(ptr)和get_user()非常相似, 但,它不是从用户内存读取数据,而是想用户内存写数据。

memcpy_fromfs(void *to, const void *from,unsigned long n)

从用户内存中的*from拷贝n个字节到指向核心内存的指针*to。

memcpy_tofs(void *to,const *from,unsigned long n)

从核心内存中的*from拷贝n个字节数据到用户内存中的*to。

/*译者注:这四个函数足以在2.0.x中解决内核和用户区的参数传递问题,在2.0.x以上

的版本有新的实现,即copy_user_to(...)以及copy_user_from(...)根据内核版本这些

特殊函数会有不同,请关注核心代码的实现方法。*/

系统调用

大部分的c函数库的调用都依赖于系统调用, 就是一些使用户程序可以调用的简单核心包装函数。 这些系统调用运行在内核本身或者在可加载内核模块中, 就是一些可动态的加载卸载的核心代码。

就象MS-DOS和其他许多系统一样, linux中的系统调用依赖一个给定的中断来调用多个系统调用。linux系统中,这个中断就是int 0x80。当调用'int 0x80'中断的时候,控制权就转交给了内核(或者,我们确切点地说, 交给_system_call()这个函数), 并且实际上是一个正在进行的单处理过程。

* _system_call()是如何工作的 ?

首先, 所有的寄存器被保存并且%eax寄存器全面检查系统调用表, 这张表列举了所有的系统调用和他们的地址信息。它可以通过extern void *sys_call_table[]来被访问到。该表中的每个定义的数值和内存地址都对应每个系统调用。大家可以在/usr/include/sys/syscall.h这个头中找到系统调用的标示数。他们对应相应的SYS_systemcall名。假如一个系统调用不存在, 那么它在sys_call_table中相应的标示就为0, 并且返回一个出错信息。否则,系统调用存在并在表里相应的入口为系统调用代码的内存地址。

这儿是一个有问题的系统调用例程:

[root@plaguez kernel]# cat no1.c

#include

#include

#include

extern void *sys_call_table[];

sc()

{ // 165这个系统调用号是不存在的。

__asm__(

"movl $165,%eax

int $0x80");

}

 

main()

{

errno = -sc();

perror("test of invalid syscall");

}

[root@plaguez kernel]# gcc no1.c

[root@plaguez kernel]# ./a.out

test of invalid syscall: Function not implemented

[root@plaguez kernel]# exit



相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析