日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

抒寫Linux 2.6.x下內核級后門程序

Author:;wzt
EMail:;wzt@xsec.org
Site:;http://www.xsec.org;&;hhtp://hi.baidu.com/wzt85
Date:;2008-8-29

一.;內核后門簡介
二.;內核中系統(tǒng)調用
三.;使用kernel;mode;socket函數(shù)
四.;如何擴展后門
五.;參考資料
六.;相關源代碼

一.;內核后門簡介

所謂內核后門 , ;當然指的是在內核空間中給hacker提供的可遠程控制的shell模塊嘍 , ;性質跟ring3下的后門一樣 , 只是所有功能都在內核空間實現(xiàn)了而已 。其實它跟rootkit的定義基本已經(jīng)混淆了 。有的內核后門不能提供隱藏行為的功;能 , 有的rookit沒有提供遠程shell的功能 。只有兩者互補才能組合成一個功能強的’root-kit’.
本文只介紹2種實現(xiàn)內核后門的基本方法 , 如果您有更好的方法 , 還請多多指教 。

二.;內核中系統(tǒng)調用

Unix世界中一切皆文件的思想將socket通信變的簡單的多 , ;通常我們直接可以用read , write等api函數(shù)作為socket通信的方法 , 這些api函數(shù)最終都會調用kernel提供的sys_XXX系列函;數(shù) 。平時用到的read等函數(shù)早以在c庫中封裝好了 。其實我們可以自己直接向系統(tǒng)發(fā)送軟中斷int;0x80來執(zhí)行sys_read函數(shù) , 如:

int;my_read(int;fd,;char;*;buf,;off_t;count)
{
long;__res;

__asm__;volatile;("push;%離;;int;$0x80;;pop;%離"

:;"=a";(__res)
:;"0";(__NR_read),;"ri";((long)(fd),;;;;;"c"((long)(buf),
"d";((long)(count));:"memory");

return;(int)(__res);
}

這里用到了at&t的內嵌匯編程序來實現(xiàn),;其實就是向eax寄存器中存入具體的系統(tǒng)調用號 , ebx , ecx , edx依次存入read函數(shù)的參數(shù) 。最后執(zhí)行一個int;$0x80陷入內核去執(zhí)行sys_read.要想在內核空間中實現(xiàn)后門的功能 , ;就必須調用某些函數(shù)來進行socket通信 。;本節(jié)介紹直接在內核中使用系統(tǒng)調用的方式來和遠程用戶進行通訊,下一節(jié)則介紹直接使用內核socket函數(shù)進行通訊 。

通過上面的例子 , 我們明白了如何在用戶空間下來使用系統(tǒng)調用 。那么上述方法也可以用在內核空間中 , 這樣在內核空間執(zhí)行系統(tǒng)調用感覺效率會很低 , 但是對我們來說 , 編寫程序將會非常的方便 。著名的sk;rookti就是用這種方式來進行通訊的 。

linux內核提供了很多個不同的系統(tǒng)調用 , 我們需要編寫幾個宏來方便的使用這些系統(tǒng)調用 。比如下面這幾個宏:

#define;my__syscall_return(type,;res);/
do;{;/
if;((unsigned;long)(res);>=;(unsigned;long)(-(128; ;1)));{;/
errno;=;-(res);;/
res;=;-1;;/
};/
return;(type);(res);;/
};while;(0)

#define;my_syscall3(type,name,type1,arg1,type2,arg2,type3,arg3);/
type;name(type1;arg1,type2;arg2,type3;arg3);/
{;/
long;__res;;/
__asm__;volatile;("push;%離;;;int;$0x80;;;pop;%離";/
:;"=a";(__res);/
:;"0";(__NR_##name),"ri";((long)(arg1)),"c";((long)(arg2)),;/
"d";((long)(arg3));:;"memory");;/
my__syscall_return(type,__res);;/
}

my_syscall3代表這個系統(tǒng)調用有3個參數(shù) , 以read系統(tǒng)調用為例 , 我們可以在內核空間中這樣使用它:
static;inline;my_syscall3(int,;read,;int,;fd,;char;*,;buf,;off_t,;count);

編譯的時候就會被展開成:

int;read(int;fd,;char;*;buf,;off_t;count);;;;/
{;;;;/
long;__res;;;;;;;/

__asm__;volatile;("push;%離;;int;$0x80;;pop;%離"/

:;"=a";(__res);/
:;"0";(__NR_read),;"ri";((long)(fd),;"c"((long)(buf),;/
"d";((long)(count));:"memory");;/

return;(int)(__res);/
}

本文后面將會給出比較全面的宏 , 通過這些宏 , 可以在內核中隨意的使用系統(tǒng)調用 。

好了 , 現(xiàn)在可以使用read,;write,;select等系統(tǒng)調用在內核空間收發(fā)信息了 。;但是怎么在內核中使用平時在用戶空間下用到的那些socket函數(shù)呢?其實這些socket函數(shù)都是通過執(zhí)行sys_socketall系統(tǒng)調用來實現(xiàn)的:

推薦閱讀