日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 操作系統 > 正文

kernel hacking簡單入門

2024-07-26 00:30:28
字體:
來源:轉載
供稿:網友

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

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


系統控制權就會轉向真正的系統調用, 用來完成你的請求并返回。 然后_system_call()
調用_ret_from_sys_call()來檢查不同的返回值, 并且最后返回到用戶內存。


* libc

這int $0x80 并不是直接被用作系統調用; 更確切地是, libc函數,經常用來包裝0x80中斷,
這樣使用的。

libc通常利用_syscallX()宏來描述系統調用, X是系統調用的總參數個數。

舉個例子吧, libc中的write(2)就是利用_syscall3這個系統調用宏來實現的, 因為實際的
write(2)原型需要3個參數。在調用0x80中斷之前,這個_syscallX宏假定系統調用的堆棧結
構和要求的參數列表,最后,當_system_call()(通過int &0x80來引發)返回的時候,
_syscallX()宏將會查出錯誤的返回值(在%eax)并且為其設置errno。

讓我們看一下另一個write(2)例程并看看它是如何進行預處理的。

[root@plaguez kernel]# cat no2.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

_syscall3(ssize_t,write,int,fd,const void *,buf,size_t,count);/*構建一個write調用*/

main()
{
    char *t = "this is a test./n";
    write(0, t, strlen(t));
}
[root@plaguez kernel]# gcc -E no2.c > no2.C
[root@plaguez kernel]# indent no2.C -kr
indent:no2.C:3304: Warning: old style assignment ambiguity in "=-".  Assuming "= -"

[root@plaguez kernel]# tail -n 50 no2.C


#9 "no2.c" 2




ssize_t write(int fd, const void *buf, size_t count)
{
    long __res;
    __asm__ __volatile("int $0x80":"=a"(__res):"0"(4), "b"((long) (fd)), "c"((long) (buf)), "d"((long) (count)));
    if (__res >= 0)
return (ssize_t) __res;
    errno = -__res;
    return -1;
};

main()
{
    char *t = "this is a test./n";
    write(0, t, strlen(t));
}
[root@plaguez kernel]# exit

注意那個write()里的"0"這個參數匹配SYS_write,在/usr/include/sys/syscall.h中定義。



* 構建你自己的系統調用。

這里給出了幾個構建你自己的系統調用的方法。
舉個例子, 你可以修改內核代碼并且加入你自己的代碼。一個比較簡單可行的方法, 
不過, 一定要被寫成可加載內核模塊。

沒有一個代碼可以象可加載內核模塊那樣可以當內核需要的時候被隨時加載的。

我們的主要意圖是需要一個很小的內核,當我們需要的時候運行insmod命令,給定的驅動就可以被
自動加載。這樣卸除來的lkm程序一定比在內核代碼樹里寫代碼要簡單易行多了。

* 寫lkm程序

一個lkm程序可以用c來很容易編寫出來。
它包含了大量的 #defines, 一些函數, 一個初始化模塊的函數,叫做init_module(),和一個卸載
函數:cleanup_module()。

這里有一個經典的lkm代碼結構:


#define MODULE
#define __KERNEL__
#define __KERNE_SYSCALLS__

#include 
#ifdef MODULE
#include 
#include 
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int errno;

char tmp[64];

/* 假如,我們要用到ioctl調用 */
_syscall3(int, ioctl, int, d, int, request, unsigned long, arg);

int myfunction(int parm1,char *parm2)
{
   int i,j,k;
   /* ... */
}

int init_module(void)
{
   /* ... */
   PRintk("/nModule loaded./n");
   return 0;
}

void cleanup_module(void)
{
   /* ... */
}

檢查代碼中的 #defines (#define MODULE, #define __KERNEL__)和
#includes (#include  ...)

一定要注意的是我們的lkm講要被運行在內核狀態,我們就不能用libc包裝的函數了, 但是我們可以
通過前面所討論的_syscallX()宏來構建系統調用。

你可以這樣編譯你的模塊'gcc -c -O3 module.c' 并且利用'insmod module.o'來加載。

提一個建議, lkm也可以用來在不完全重建核心代碼的情況下來修改內核代碼。舉個例子, 你可以修改
write系統調用讓它隱藏一部分給定的文件,就象我們把我們的backdoors放到一個非常好的地方:當
你無法再信任你的系統內核的時候會怎么樣呢?



* 內核和系統調用后門

在簡單介紹了上述理論,我們主要可以用來做什么呢。我們可以利于lkm截獲一些對我們有影響的系
統調用, 這樣可以強制內核按照我們的方式運行。例如:我們可以利用ioctl系統調用來隱藏sniffer
所造成的網卡PROMISC模式的顯示。非常有效。

去改變一個給定的系統調用,只需要在你的lkm程序中增加一個定義extern void *sys_call_table[],
并且利用init_module()函數來改變sys_call_table里的入口來指向我們自己的代碼。改變后的調用可
以做我們希望它做的一切事情, 利用改變sys_call_table來導出更多的原系統調用,并且。。。。


譯者后話:這篇文章相對比較淺顯易懂,所以可以作為大家入門lkm編程來用,它著重講述了linux系
統調用system call的原理,以及我們如何通過lkm來截獲它并換成我們想要的代碼來建立后門程序。
再次強調本文的依據是linux內核版本2.0.x,大家在自己系統實現時請對比內核代碼來做改變。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
一区二区视频在线| 97caopor国产在线视频| 欧美日韩亚洲一区| 伊人亚洲视频| 精品国产欧美日韩不卡在线观看| 日韩在线视频网| 一区二区不卡在线| 久久精品日韩无码| 日韩亚洲欧美中文在线| 欧美日韩国产观看视频| 欧美日韩综合在线免费观看| 国产三级免费观看| 日韩欧美不卡| 亚洲视频中文字幕| 欧美三级日韩在线| 久久99蜜桃精品| aaa免费看大片| 精品999视频| a级在线免费观看| 天堂精品高清1区2区3区| 欧美日韩综合视频| 激情国产在线| 日韩欧美中文字幕在线视频| 亚洲免费视频一区| 亚洲国产综合久久| 日韩欧美国产午夜精品| 最新中文字幕在线| 在线欧美日韩精品| 午夜国产欧美理论在线播放| 久久久91精品国产| 日韩一级网站| 亚洲九九精品| 国产欧美一级| 999精品在线| 国产欧美日韩高清| 日韩免费视频一区二区视频在线观看 | 精品国产91乱高清在线观看| 久草亚洲一区| 日韩欧美色综合| 色猫猫国产区一区二在线视频| 国产不卡一区二区在线观看| 久久视频www| 欧美不卡视频一区发布| 中文在线一区| 日韩中文字幕在线视频播放 | 精品国产乱码久久久久久蜜臀 | 国产欧美日韩三级| 美日韩精品免费视频| 午夜av一区二区| 日韩欧美综合| 在线日韩精品视频| 国产三级精品在线观看| 亚洲乱码一区av黑人高潮| 亚洲 欧美 精品| 精品日韩av| 国产嫩草影院久久久久| 久久久精品福利| 在线中文字幕网站| 搞黄在线观看| 久久人人精品| 国产对白在线| 亚洲一级特黄| 日韩欧美不卡| 亚洲 欧美 日韩系列| 欧美日韩精品久久久| 欧美在线日韩在线| 亚洲欧美99| 日韩 国产 一区| 欧美日韩中文字幕日韩欧美| 日韩精品视频免费看| 一区免费视频| 欧美日韩中文字幕综合视频| 亚洲一区资源| 91精品网站| 日韩视频在线一区二区| 国产丝袜在线播放| 中文字幕亚洲欧美| 在线亚洲免费| 中文字幕精品视频| 欧美日韩国产在线观看| 精品国产91乱高清在线观看| 日本熟女一区二区| 日韩在线播放一区二区| 欧美激情视频一区二区三区在线播放 | 日韩欧美中文第一页| 国产 欧美 日韩 在线| 欧美日韩国产在线播放| 亚洲黄色在线观看| 亚洲a一级视频| 国产在线观看a| 欧美日韩综合在线免费观看| 亚洲三级av| 日韩精品不卡一区二区| 日韩一级网站| 在线国产三级| xxxcom在线观看| 亚洲第一中文字幕| 国产农村妇女精品一二区| aaa欧美日韩| 91精品国产99| 国产黄在线播放| 999在线视频| av中文资源在线| 蜜桃视频中文字幕| 亚洲欧洲三级| 欧美日韩亚洲系列| 欧美日韩91| 中文字幕日韩视频| 国产福利久久久| 亚洲视频在线观看日本a| 日韩视频在线免费看| 最近免费中文字幕在线第一页| aaa欧美日韩| 伊人精品视频| 黄色视屏免费在线观看| 国产一区深夜福利| 亚洲三级欧美| 不卡视频一区二区三区| 久久韩国免费视频| 91麻豆免费视频网站| 亚洲综合日韩| 中文字幕久久精品| 欧美日韩亚洲综合在线| 日韩精品高清不卡| 中文字幕欧美在线| 综合图区亚洲白拍在线| 久久久99免费| 日韩欧美色综合网站| 成年人黄国产| 国产 欧美 日韩 在线| 国产黄色精品| 国产欧美日韩中文字幕在线| 亚洲第一视频网站| 日韩欧美在线1卡| 中文字幕亚洲区| 日本精品国语自产拍在线观看| www.精品av.com| 精品不卡一区二区| 国产69精品久久app免费版| 91精品视频播放| 日韩av一区二| 欧美日韩综合高清一区二区| 欧美一级日韩一级| 亚洲 国产 欧美 日韩| 99久久久精品免费观看国产| 欧美一级在线免费| 精品人妻一区二区三区视频| 欧美在线中文字幕| 午夜国产福利一区二区| 欧美中文字幕精品| 国产激情在线视频| 国产九九在线| 国产日韩精品久久久| 91麻豆免费视频网站| 国产视频2区| 国产欧美日韩精品在线| 国产一区在线精品| 中文字幕在线播出| 国产在线欧美日韩| 久久久久黄色| 欧美一级一级性生活免费录像| 一级特黄aaa大片在线观看| 日韩一级网站| 91精品国产91久久| 欧美高清视频一区二区三区| 国产激情久久| 91极品视频在线观看| 国产在线看一区| 欧美日韩中国免费专区在线看| 欧美在线视频二区| 亚洲视频在线观看三级| 国产三级精品在线观看| 中文字幕在线观看国产| 欧洲精品在线视频| 日韩视频第二页| 日韩免费电影网站| 欧美日韩国产片| 欧美激情一区二区在线| 日韩视频 中文字幕| 国产乱国产乱300精品| 国产在线欧美| 日韩wumaV| 欧美日韩国产中字| 日韩中文字幕观看| 国产小视频在线| 日韩欧美在线网址| 日韩你懂的电影在线观看| 中文字幕伊人| 欧美亚洲国产激情| 国产99对白在线播放| 成人无遮挡免费网站视频在线观看| 不卡在线视频| 自拍日韩亚洲一区在线| 国产欧美 在线欧美| 美女免费视频一区| 国产成人精品免费在线| 欧美日韩在线综合| 午夜国产在线视频| 日韩视频精品在线观看| 99在线国产| www日韩在线观看| 日韩一级网站| 亚洲成在线观看| 中文字幕在线看精品乱码| 国产小视频在线| 国产高清在线观看| 亚洲热在线观看| 亚洲黄色片在线观看| 欧美色欧美亚洲高清在线视频| 91精品国产高清| 狠狠色综合色区| 国产综合精品在线| 欧美激情视频一区二区三区在线播放| 国产中文在线观看| 国产最顶级的黄色片在线免费观看| 国产欧美日韩最新| 国产视频三级在线观看播放| 亚洲综合在线中文字幕| 国产91欧美| 91精品国产91久久久久久三级| 日韩国产在线观看一区| 最近免费中文字幕在线第一页| 一区二区三区在线免费| 激情五月综合| √新版天堂资源在线资源| 国产在线看一区| 国产1区在线| 亚洲综合日韩欧美| 日韩在线观看视频一区二区| 欧美在线视频第一页| 婷婷久久综合九色国产成人| 亚洲素人一区二区| 国产精品福利视频一区二区三区| 欧美日韩国产不卡在线看| 日韩区欧美区| 中文字幕人成乱码在线观看| 中文字幕亚洲二区 | 日韩中文字幕在线视频播放| 国产h片在线观看| 亚洲高清在线观看一区| 先锋男人资源站| 91精品国产综合久久久久| 精品欧美久久久| 视频一区二区不卡| 日韩午夜高潮| 日本a口亚洲| av高清一区| 久久久精品午夜少妇| 久久99久久99精品中文字幕| 在线看av的网址| 久久激情一区| 成人a在线观看| 国产视频一二区| 欧美 日韩 国产在线| 国产在线二区| 日韩亚洲欧美中文高清在线| 亚洲一区在线观看视频| 日韩精品一级| 午夜国产视频 | 一区精品在线播放| 亚洲一区在线观看免费| 亚洲一区不卡在线| 美女尤物久久精品| 国产综合成人久久大片91| av免费观看国产| 精品一二线国产| 欧美日韩在线播放一区| 欧美日韩精品久久久| 91欧美在线视频| 日韩欧美久久| 久久婷婷国产| 国产黄色在线免费观看| 亚洲三级免费看| 在线不卡一区二区| 日韩午夜中文字幕| 久久精品欧美日韩精品| 亚洲乱码一区av黑人高潮| 国产激情在线观看| 免费国产h视频在线观看86| 国产视频97| 亚洲欧洲在线观看av| 丰满少妇一区二区| 91国内在线| 日韩中文字幕在线视频观看 | 国产aa精品| 亚洲va韩国va欧美va精品| 欧美日韩在线播放一区| 不卡在线一区二区| 欧美婷婷久久| 日韩中文字幕网| 欧美日韩亚洲视频| 欧美日韩国产中文精品字幕自在自线| 国产视频不卡| 91精品国产色综合久久久蜜香臀| 欧美久久一二三四区| 久久精品国产成人一区二区三区| 中文字幕在线看精品乱码| 免费日韩精品中文字幕视频在线| 91精品国产亚洲| 日韩三级视频在线| 欧美 日韩 中文字幕| 国产99对白在线播放| 国产一级免费在线观看| 蜜桃久久久久| 午夜国产视频 | 欧美三级日韩三级| 欧美不卡视频一区| 久久网站免费观看| 国产成人精品网址| 成人a在线观看| 欧美日韩中文在线| 亚洲第一视频在线观看| 欧美日韩高清在线| 亚洲3区在线| 日本黄色一区二区| 欧美中文字幕在线视频| 日韩一级在线免费观看| 中文字幕人成乱码在线观看| 国产一区二中文字幕在线看| 日韩精品大片| 最近高清中文在线字幕在线观看 | 色屁屁一区二区| 91精品国产自产在线观看永久∴| 欧美日韩国产91| 99久久婷婷| 欧美日韩中文字幕在线观看| 亚洲高清在线免费| 色www精品视频在线观看| 国产午夜精品全部视频播放| 日韩精品一级| 日韩 国产 一区| 日韩网站中文字幕| 国产一卡二卡3卡4卡四卡在线| 欧美日韩精品在线播放| 国产成人中文字幕| 在线精品观看| 国产黄色在线网站| 日韩专区视频网站| 国产视频二区| 不卡福利视频| 欧美日韩中文字幕日韩欧美| 日韩欧美999| 欧美日韩中文字幕视频| 一级日本免费的| 日韩精品资源二区在线| 日本а中文在线天堂| 亚洲大胆人体av| 国产欧美久久久久久久久| 中文字幕成人乱码在线电影| 99国产成 人 综合 亚洲欧美| 国产欧美日韩中文| 91精品国产调教在线观看| 亚洲高清在线免费| 精品久久久视频| 在线综合 亚洲 欧美中文字幕| 偷窥国产亚洲免费视频| 久久精品蜜桃| 欧美日韩国产综合久久| 亚洲人成欧美中文字幕| 国产激情在线播放| 正在播放日韩精品| av免费观看网站| 在线中文免费视频| 国内精品99| 欧美日韩中文字幕视频| 久久精品国产视频| 日韩欧美不卡视频| 在线观看一区| 国产性一级片| 中文字幕亚洲一区在线观看| 亚洲免费观看在线观看| 欧美日韩在线视频首页| 欧美 日韩 综合| 亚洲va中文字幕| 黄色在线播放网站| 亚洲福利精品在线| 欧美日韩国产一中文字不卡| 国产xxx在线| 日韩在线视频观看| 亚洲欧洲日韩在线| 日韩av综合在线观看| 精品三级久久| 国产成人一二三区| 中文字幕4区| 在线看欧美日韩| 91精品国产高清91久久久久久| 精品国产99| 中文字幕一区二区三区精品| 天堂精品高清1区2区3区| 国产黄色一级片| 国产三级视频在线| 精品欧美日韩在线| 亚洲狠狠婷婷综合久久久久图片| 久久婷婷中文字幕| 在线观看中文字幕一区| 91精品国产91久久久久青草| 亚洲一区视频在线观看视频| 亚洲永久字幕| 欧美日韩亚洲国内综合网| 欧美日韩中文字幕日韩欧美|