kernel hacking简单入门

2016-01-29 19:17 13 1 收藏

kernel hacking简单入门,kernel hacking简单入门

【 tulaoshi.com - Linux 】

 
By: w00w00 Security Development article by Nicolas Dubee
译:大鹰

以下代码均在linux i86 2.0.x的内核下面测试通过。它也许可以在之前的版本通
过, 但并没有被测试过. 因为从2.1.x内核版本就引入了相当大的改变, 显著地内存
管理上的差别, 但这些不是我们现在要讨论的内容.

Thanks to Halflife who first got the idea to use lkm for malicious
purposes, and tiepilot, my living hero.(一些感谢信息就不翻啦,西西)



用户空间与内核空间
---------------------------

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")

来源:http://www.tulaoshi.com/n/20160129/1508947.html

延伸阅读
Hibernate简介 Hibernate寓意:Let Java objects hibernate in the relational database. Hibernate 是Java应用和关系数据库之间的桥梁,负责Java对象和关系数据库之间的映射的ORM中间件。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Ja...
《海岛大亨3》游戏简单入门小教程 注:那些复杂的政治要素就先不谈了,这里只讲基本生存,做到以下几点,生存下来就没问题了 最基本的生存无外乎两点,收入和国内稳定度 钱怎么来? 初期最赚钱也是最容易获得回报的是伐木场,Logging camp,建一个即可,适当提高工资让工人满员,然后把你的总统叫过来督促生产,建筑上出现太阳即可。 有了闲钱...
标签: Web开发
代码如下: HTML HEAD STYLE type='text/css' .css1{ display:block; width:100px; height:100px; background-color:blue; } .css2{ display:block; width:100px; height:100px; background-color:red; } /STYLE /HEAD BODY a href='#' class='css1' id=freeett/a script src='jquery-1.3.2.js' /script script $(docum...
技巧一:自备脚架 拍摄夜景时通常需要较长时间曝光,因此相机要保持隐定才可以拍出清晰的照片。为免因震动而破坏照片效果,最好使用三脚架减低晃动。 技巧二:调低感亮度(ISO) 相信大家都知道高感亮度可以在相同的光圈值下得出更快的快门速度以减低拍摄时晃震的问题,但随之却会令照片产生噪点。特别是在拍摄夜景的时候,长时间曝光会令...
标签: PS基础 PS抠图
在掌握了路径和图层样式之后,我们终于可以开始“白手起家”地制作网页了。这不同于以往开启一幅图像后对其进行调整,或将两个图层通过蒙版或图层混合模式进行合成等操作,是完全在一片空白上逐步建立所需的图像。从中大家也会学习到一些关于制作网页设计稿的技巧。其实我们是很希望将全部内容在一本书内写完的,但由于篇幅有限,因此将另外...

经验教程

437

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部