进程隐藏学习总结
怎么隱藏進程
工具/原料HideToolz
步驟/方法
1
在百度上面搜索HideToolz ,打開第一個搜索結(jié)果,點擊進入下載。把HideToolz 下載到你的電腦里面。
2
鼠標雙擊打開該壓縮包,再直接雙擊該軟件即可打開該軟件了。并且在軟件里面可以看見目前的進程數(shù)為多少個。
3
按Ctrl + Alt + . 【啟動任務(wù)管理器】,在 HideToolz 里面找到你想要隱藏的運行程序,鼠標單擊右鍵——選擇隱藏,然后在任務(wù)管理器里面就很清楚的看見你想隱藏的運行程序已經(jīng)不見了。
4
既然隱藏了運行程序,那么想顯示出來了又該怎么辦呢?在 HideToolz 里面找到你已經(jīng)隱藏了的運行程序,鼠標單擊右鍵——選擇顯示即可。
5
當然,運行 HideToolz 的時候最好也把 HideToolz 的托盤圖標也隱藏了。
END
注意事項
HideToolz 下載方式如下圖所示:
除了第三方軟件可以隱藏進程,還有使用其他的方法也可以隱藏進程,不過相比較第三方軟件去隱藏進程的步驟要復(fù)雜些。
========
進程隱藏工具
進程隱藏工具可以免費激活了,并增加定時提醒、定時關(guān)機和自動粘貼功能。進程隱藏工具集成了窗口隱藏老板鍵、文件隱藏軟件、進程隱藏軟件的主要功能,操作方便、功能實用。其獨有的開機自動隱藏功能可輕松實現(xiàn)BT、eMule、迅雷等工具自動隱藏下載。亦是上班族在上網(wǎng)、玩游戲、炒股時用來快速隱藏窗口及隱藏圖標的最佳工具。
中文名 進程隱藏工具 軟件大小 717 KB 軟件語言 簡體中文 軟件類別 國產(chǎn)軟件
目錄
1 軟件信息
2 軟件介紹
軟件信息
軟件大小:717 KB
軟件語言:簡體中文
軟件類別:國產(chǎn)軟件
應(yīng)用平臺:Win 7/Windows Vista/Win2003/WinXP/Win2000
軟件介紹
進程隱藏工具以強化隱私保護為核心設(shè)計理念,隱藏徹底且不露痕跡。 主要特點: 1、可使被指定為自動隱藏的程序以隱藏方式運行,即使用這些程序自身的快捷鍵也無法令其顯示。2、
可通過鍵盤或鼠標來迅速隱藏指定的程序。3、設(shè)置訪問口令以防止他人查看隱藏列表或更改您的設(shè)置。4、進程、文件、文件夾隱藏管理。5、快速隱藏時可自動關(guān)閉聲音。6、可設(shè)置窗口透
明度(半透明窗口在幾米之外很難察覺)7、可設(shè)置虛擬桌面,可以將不同的程序運行在不同的桌面下。8、可快速鎖定屏幕,使他人無法操作電腦。
========
進程隱藏的各種方法 以及分析比較以及實現(xiàn)鏈接
典型進程隱藏技術(shù)1 ?基于系統(tǒng)服務(wù)的進程隱藏技術(shù)
在 W I N 9X 系列操作系統(tǒng)中, 系統(tǒng)進程列表中不能看到任何系統(tǒng)服務(wù)進程, 因此只需要將指定進程注冊為系統(tǒng)服務(wù)就能夠使該進程從系統(tǒng)進程列表中隱形在win9x下用RegisterServiceProcess函數(shù)隱藏進程,NT架構(gòu)下用不了 即win2000 ?xp等什么的用不了此方法。
2 ?基于API HOOK的進程隱藏技術(shù)
API HOOK指的是通過特殊的編程手段截獲WINDOWS系統(tǒng)調(diào)用的API函數(shù),并將其丟棄或者進行替換。 通過APIHOOK編程方法,截獲系統(tǒng)遍歷進程函數(shù)并對其進行替換,可以實現(xiàn)對任意進程的隱藏
?
3 ?基于 DLL 的進程隱藏技術(shù):遠程注入Dll技術(shù)
DLL文件沒有程序邏輯,不能獨立運行,由進程加載并調(diào)用,所以在進程列表中不會出現(xiàn)DLL文件。如果是一個以DLL形式存在的程序,通過某個已有進程進行加載, 即可實現(xiàn)程序的進程隱藏。在windows系統(tǒng)中, 每個進程都有自己的私有地址空間, 進程不能創(chuàng)建屬于另一個進程的內(nèi)存指針
。而遠程線程技術(shù)正是通過特殊的內(nèi)核編程手段, 打破進程界限來訪問另一進程的地址空間, 以達到對自身 進行隱藏的目的。
遠程線程注入DLL技術(shù)指的是通過在某進程中創(chuàng)建遠程線程的方法進入該進程的內(nèi)存空間, 然后在其內(nèi)存空間中加載啟動DLL程序。
?
4 ?基于遠程線程注入代碼的進程隱藏技術(shù)
這種方法與遠程線程注入 DLL 的原理一樣,都是通過在某進程中創(chuàng)建遠程線程來共享該進程的內(nèi)存空間。所不同的是,遠程線程注入代碼通過直接拷貝程序代碼到某進程的內(nèi)存空間來達到注入的目的。因為程序代碼存在于內(nèi)存中, 不僅進程列表中無法檢測, 即使遍歷進程加載的內(nèi)存模塊也無法
找到被隱藏程序的蹤跡。
5 ?Rootkit方式
Intel CPU 有4 個特權(quán)級別: Ring 0, Ring 1, Ring 2, Ring 3。Windows 只使用了其中的 Ring ?0 和 ?Ring ?3 兩個級別。操作系統(tǒng)分為內(nèi)核和外殼兩部分:內(nèi)核運行在Ring0級,通常稱為核心態(tài)(或內(nèi)核態(tài)),用于實現(xiàn)最底層的管理功能,在內(nèi)核態(tài)
可以訪問系統(tǒng)數(shù)據(jù)和硬件,包括處理機調(diào)度、內(nèi)存管理、設(shè)備管理、文件管理等;外殼運行在 Ring 3 級,通常稱為用戶態(tài),
是基于內(nèi)核提供的交互功能而存在的界面,它負責指令傳遞和解釋。通常情況下,用戶態(tài)的應(yīng)用程序沒有權(quán)限訪問核心態(tài)的地址空間。
Rootkit 是攻擊者用來隱藏自己的蹤跡和保留 root 訪問權(quán)限的工具,它能使攻擊者一直保持對目標機器的訪問,以實施對目標計算機的控制[1]。從 Rootkit 運行的環(huán)境來看,可將
其分為用戶級 Rootkit 和內(nèi)核級 Rootkit。
用戶態(tài)下,應(yīng)用程序會調(diào)用 Wi n32 子系統(tǒng)動態(tài)庫(包括Kernel32.dll, User32.dll, Gdi32.dll等) 提供的Win32 API函數(shù),
它們是 ?Windows ?提供給應(yīng)用程序與操作系統(tǒng)的接口,運行在Ring ?3 級。用戶級 Rootkit 通常就是通過攔截 Win32 ?API,建立系統(tǒng)鉤子,插入自己的代碼,從而控制檢測工具對進程或服務(wù)的遍歷調(diào)用,實現(xiàn)隱藏功能。
內(nèi)核級 R o o t k it 是指利用驅(qū)動程序技術(shù)或其它相關(guān)技術(shù)進入Windows 操作系統(tǒng)內(nèi)核,通過對 Windows 操作系統(tǒng)內(nèi)核相關(guān)的數(shù)據(jù)結(jié)構(gòu)或?qū)ο筮M行篡改,以實現(xiàn)隱藏功能。
由于Rootkit 運行在 Ring ?0 級別,甚至進入內(nèi)核空間,因而可以對內(nèi)核指令進行修改,而用戶級檢測卻無法發(fā)現(xiàn)內(nèi)核操作被攔
截。
下面介紹兩種使用 Rootkit 技術(shù)來實現(xiàn)進程隱藏的方法。冊表來實現(xiàn)啟動,因而易于被檢測出來。顯然,要增強進程的隱蔽性,關(guān)鍵在于增強加載程序文件的隱藏性。
<1> ? SSDT Hook
參考本文最下面的鏈接
<2> DKOM (Direct Kernel Object Manipulation,直接內(nèi)核對象操作)
使用DKOM方法進行進程隱藏。在Windows操作系統(tǒng)中,系統(tǒng)會為每一個活動進程創(chuàng)建一個進程對象EPROCESS,為進程中的每一個線程創(chuàng)建一個線程對象 ETHREAD。
在 EPROCESS 進程結(jié)構(gòu)中有個雙向鏈表 LIST_ENTRY,LIST_ENTRY結(jié)構(gòu)中有FLINK 和BLINK 兩個成員指針,分別指向當前進程的前驅(qū)進程和后繼進程。
如果要隱藏當前進程,只需把當前進程的前驅(qū)進程的BLINK 修改為當前進程的BLINK,再把當前進程的后繼進程的FLINK修改為當前進程的FLINK。
?
進程隱藏方法 ? ?隱蔽性 健壯性 實現(xiàn)難度 加載方式 ?進程存在方式 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?操作系統(tǒng)
注冊系統(tǒng)服務(wù) ? ?較差 ? 很好 ? 簡單 ? ? 簡單 ? ? ?存在于系統(tǒng)服務(wù) ? ? ? ? ? ? ? ? ? ? ? ? ? win9x 系列
API HOOK ? ? ? ?很好 ? 很好 ? 較難 ? ? 簡單 ? ? ?仍以進程存在 ? ? ? ? ? ? ? ? ? ? ? ? ? ? win NT及以上
注冊表注入DLL ? 一般 ? 很差 ? 簡單 ? ? 簡單 ? ? ?以DLL形式存在于所有加載user32.dll的進程中 winNT及以上
Rundll32加載DLL 一般 ? 好 ? ? 簡單 ? ? 簡單 ? ? ?以DLL形式存在于Rundll32.exe進程中 ? ? ? ? winNT及以上
遠程線程注入DLL 較好 ? 很好 ? 較難 ? ? 較復(fù)雜 ? ?以DLL形式存在于任一進程中,包括系統(tǒng)進程 ? ?winNT及以上
遠程線程注入代碼很好 ? 較好 ? 很難 ? ? 很復(fù)雜 ? ?存在于任一進程的內(nèi)存空間中,包括系統(tǒng)進程 ? winNT及以上
========
進程隱藏與進程保護(SSDT Hook 實現(xiàn))(一)
http://www.cnblogs.com/BoyXiao/archive/2011/09/03/2164574.html文章目錄:
?
1. 引子 – Hook 技術(shù):
2. SSDT 簡介:
3. 應(yīng)用層調(diào)用 Win32 API 的完整執(zhí)行流程:
4. 詳解 SSDT:
5. SSDT ?Hook 原理:
6. 小結(jié):
?
1. 引子 – Hook 技術(shù):
?前面一篇博文呢介紹了代碼的注入技術(shù)(遠程線程實現(xiàn)),博文地址如下:
http://www.cnblogs.com/BoyXiao/archive/2011/08/11/2134367.html
雖然代碼注入是很老的技術(shù)了,但是這種技術(shù)也還是比較常見,
當然也比較好用的,比如在 Spy++ 中就使用了遠程線程注入技術(shù),
同時,如果有興趣的閱讀過 Spy++ 的源碼的朋友,當然也可以在其源碼中閱讀到關(guān)于遠程線程注入技術(shù)了。
(這篇博文雖然我會截斷分為兩篇博文撰寫,但是博文仍然會比較長,內(nèi)容其實是比較多的,覆蓋面也比較廣,
需要有一定耐心和基礎(chǔ)方可閱讀完,有興趣者請自備茶水以及零食,然后慢慢閱讀全文,
PS:這話引用自園子里某位園友)
(然后的話就是漫漫長夜,心情不佳,于是寫了篇博文,剛好又喝了點,所以估計會有些許疏漏之處,還請見諒 ~)
在這一篇博文中呢,介紹的是一種 Hook 技術(shù),對于 Hook 技術(shù),可以分為兩塊,
第一塊是在 Ring3 層的 Hook,俗稱應(yīng)用層 Hook 技術(shù),
而另外一塊自然是在 Ring0 層得 Hook,俗稱為內(nèi)核層 Hook 技術(shù),
而在 Ring3 層的 Hook 基本上可以分為兩種大的類型,
第一類即是 Windows 消息的 Hook,第二類則是 Windows API 的 Hook。
關(guān)于 Hook 的幾種類型呢,下面給出幾個簡潔的圖示:
image
image
image
關(guān)于 Windows 消息的 Hook,相信很多朋友都有接觸過的,因為一個 SetWindowsHookEx 即可以完成消息 Hook,
在這里簡要介紹一下消息 Hook,消息 Hook 是通過 SetWindowsHookEx 可以實現(xiàn)將自己的鉤子插入到鉤子鏈的最前端,
而對于發(fā)送給被 Hook 的窗口(也有可能是所有的窗口,即全局 Hook)的消息都會被我們的鉤子處理函數(shù)所捕獲到,
也就是我們可以優(yōu)先于窗體先捕獲到這些消息,Windows 消息 Hook 可以實現(xiàn)為進程內(nèi)消息 Hook 和全局消息 Hook,
對于進程內(nèi)消息 Hook,則可以簡單的將 Hook 處理函數(shù)直接寫在這個進程內(nèi),即是自己 Hook 自己,
而對于用途更為廣泛的全局消息 Hook,則需要將 Hook 處理函數(shù)寫在一個 DLL 中,
這樣才可以讓你的處理函數(shù)被所有的進程所加載(進程自動加載包含 Hook 消息處理函數(shù)的 DLL)。
對于 Windows 消息 Hook 呢,可以有個簡單的邪惡應(yīng)用,就是記錄鍵盤按鍵消息,
從而達到監(jiān)視用戶輸入的鍵值信息的目的,這樣,對于一些簡單的用戶通過鍵盤輸入的密碼就可以被 Hook 獲取到,
因為沒當用戶按下一個鍵時,Windows 都會產(chǎn)生一個按鍵消息(當然有按下,彈起等消息的區(qū)分),
然后我們可以 Hook 到這個按鍵消息,這樣就可以在 Hook 的消息處理函數(shù)中獲取到用戶按下的是什么鍵了。
? ? ? ? ? ? ? ??
當然關(guān)于消息 Hook 的話,其不是這篇博文的重點,
這篇博文主要介紹的是 SSDT Hook 技術(shù),即內(nèi)核 Hook 技術(shù)的一種,
這種技術(shù)呢,也是比較老的技術(shù)了,貌似是當年 Rootkit 起火的時候出來的,
但是 SSDT Hook 現(xiàn)在也還比較流行,比如在很多的殺毒軟件或者安全軟件里面也都會使用到 SSDT Hook 技術(shù)。
關(guān)于內(nèi)核 Hook 也有幾種類型,下面也給出一副圖示:
image
上面的幾種內(nèi)核級 Hook 技術(shù),在看雪啊,debugman,xfocus 上都有很多的介紹,
而我只不過是落后這些技術(shù)很多年的小輩后生,在這里也只是將自己的學(xué)習(xí)以及一些總結(jié)的經(jīng)驗給列出來而已,
如果有興趣想深入了解這些內(nèi)容的話,完全可以在看雪上找到資料 ~
2. SSDT 簡介:
以下介紹來自百度(PS:被百度文庫弄去了很多博文,這里也抄它一下):
SSDT 的全稱是 System Services Descriptor Table,系統(tǒng)服務(wù)描述符表。
這個表就是一個把 Ring3 的 Win32 API 和 Ring0 的內(nèi)核 API 聯(lián)系起來。
SSDT 并不僅僅只包含一個龐大的地址索引表,它還包含著一些其它有用的信息,諸如地址索引的基地址、服務(wù)函數(shù)個數(shù)等。
通過修改此表的函數(shù)地址可以對常用 Windows 函數(shù)及 API 進行 Hook,從而實現(xiàn)對一些關(guān)心的系統(tǒng)動作進行過濾、監(jiān)控的目的。
一些 HIPS、防毒軟件、系統(tǒng)監(jiān)控、注冊表監(jiān)控軟件往往會采用此接口來實現(xiàn)自己的監(jiān)控模塊。
? ?
在 NT 4.0 以上的 Windows 操作系統(tǒng)中,默認就存在兩個系統(tǒng)服務(wù)描述表,這兩個調(diào)度表對應(yīng)了兩類不同的系統(tǒng)服務(wù),
這兩個調(diào)度表為:KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow,
其中 KeServiceDescriptorTable 主要是處理來自 Ring3 層得 Kernel32.dll 中的系統(tǒng)調(diào)用,
而 KeServiceDescriptorTableShadow 則主要處理來自 User32.dll 和 GDI32.dll 中的系統(tǒng)調(diào)用,
并且 KeServiceDescriptorTable 在 ntoskrnl.exe(Windows 操作系統(tǒng)內(nèi)核文件,包括內(nèi)核和執(zhí)行體層)是導(dǎo)出的,
而 KeServiceDescriptorTableShadow 則是沒有被 Windows 操作系統(tǒng)所導(dǎo)出,
而關(guān)于 SSDT 的全部內(nèi)容則都是通過 KeServiceDescriptorTable 來完成的 ~
? ? ? ? ? ?
從下面的截圖可以看出 KeServiceDescriptorTable 在 ntoskrnl.exe 中被導(dǎo)出:
image
? ? ? ? ? ?
然后我們再來看看在 Windows 操作系統(tǒng)的源碼 WRK 中,KeServiceDescriptorTable 是怎么被定義的 ~
首先來看 KeServiceDescriptorTable 是如何被 Windows 操作系統(tǒng)源碼給導(dǎo)出的:
從下面的截圖可以看出,這個系統(tǒng)服務(wù)描述表是在 WRK 源碼中的某一個模塊劃分文件(.def)中所導(dǎo)出的。
關(guān)于 WRK 是什么東西 ? 則可以參閱我的另一篇博文《Windows 內(nèi)核(WRK)簡介》,博文地址如下:
http://www.cnblogs.com/BoyXiao/archive/2011/01/08/1930904.html
??
image
而在 Windows 源碼 WRK 中對于系統(tǒng)服務(wù)描述符表的代碼定義如下(KeServiceDecriptorTable 即由該結(jié)構(gòu)定義):
image
? ? ? ? ??
上面的這個結(jié)構(gòu)定義在成員變量的名稱上還看不出什么名堂,下面給出我們將在自己代碼中所使用的結(jié)構(gòu)體:
? ?1: ?typedef struct _KSYSTEM_SERVICE_TABLE
? ?2: ?{
? ?3: ? ? ?PULONG ?ServiceTableBase; ? ? ? ? ?// SSDT (System Service Dispatch Table)的基地址
? ?4: ? ? ?PULONG ?ServiceCounterTableBase; ? // 用于 checked builds, 包含 SSDT 中每個服務(wù)被調(diào)用的次數(shù)
? ?5: ? ? ?ULONG ? NumberOfService; ? ? ? ? ? // 服務(wù)函數(shù)的個數(shù), NumberOfService * 4 就是整個地址表的大小
? ?6: ? ? ?ULONG ? ParamTableBase; ? ? ? ? ? ?// SSPT(System Service Parameter Table)的基地址
? ?7: ??
? ?8: ?} KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;
? ?9: ??
? 10: ?typedef struct _KSERVICE_TABLE_DESCRIPTOR
? 11: ?{
? 12: ? ? ?KSYSTEM_SERVICE_TABLE ? ntoskrnl; ?// ntoskrnl.exe 的服務(wù)函數(shù)
? 13: ? ? ?KSYSTEM_SERVICE_TABLE ? win32k; ? ?// win32k.sys 的服務(wù)函數(shù)(GDI32.dll/User32.dll 的內(nèi)核支持)
? 14: ? ? ?KSYSTEM_SERVICE_TABLE ? notUsed1;
? 15: ? ? ?KSYSTEM_SERVICE_TABLE ? notUsed2;
? 16: ??
? 17: ?} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
? 18: ??
? 19: ?//導(dǎo)出由 ntoskrnl.exe 所導(dǎo)出的 SSDT
? 20: ?extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable;
? ? ? ? ? ? ??
有了上面的介紹后,我們可以簡單的將 KeServiceDescriptor 看做是一個數(shù)組了(其實質(zhì)也就是個數(shù)組),
在應(yīng)用層 ntdll.dll 中的 API 在這個系統(tǒng)服務(wù)描述表(SSDT)中都存在一個與之相對應(yīng)的服務(wù),
當我們的應(yīng)用程序調(diào)用 ntdll.dll 中的 API 時,最終會調(diào)用內(nèi)核中與之相對應(yīng)的系統(tǒng)服務(wù),
由于有了 SSDT,所以我們只需要告訴內(nèi)核需要調(diào)用的服務(wù)所在 SSDT 中的索引就 OK 了,
然后內(nèi)核根據(jù)這個索引值就可以在 SSDT 中找到相對應(yīng)的服務(wù)了,然后再由內(nèi)核調(diào)用服務(wù)完成應(yīng)用程序 API 的調(diào)用請求即可。
基本結(jié)構(gòu)可以參考下圖:
image
? ? ? ? ??
3. 應(yīng)用層調(diào)用 Win32 API 的完整執(zhí)行流程:
? ??有了上面的 SSDT 基礎(chǔ)后,我們再來看一下在應(yīng)用層調(diào)用 Win32 API(這里主要指的是 ntdll.dll 中的 API)的完整流程,
這里我們主要是分析 ntdll.dll 中的 NtQuerySystemInformation 這個 API 的調(diào)用流程,
(PS:Windows 任務(wù)管理器即是通過這個 API 來獲取到系統(tǒng)的進程等等信息的)。
先給出一副圖示(先記住這里有四個類似的 API,但是必須得注意區(qū)分開來,弄混淆了就麻煩大了):
image
??
再給出這些個 API 的基本的調(diào)用流程(讓大伙有個印象,至少不會迷失):
image
? ? ? ? ? ? ? ? ??
首先,使用 PE 工具來打開 ntdll.dll 文件,可以看到 NtQuerySystemInformation,
image
除了 NtQuerySystemInformation 外,同時還可以看到 ZwQuerySystemInformation,
image
? ? ? ? ? ? ? ? ?
而實質(zhì)上,在 Windows 操作系統(tǒng)中,
Ntdll.dll 中的ZwQuerySystemInformation 和 NtQuerySystemInformation 是同一函數(shù),
可以通過下面的截圖看出,這兩個函數(shù)的入口地址指向同一區(qū)域,他們的函數(shù)入口地址都是一樣的 ~
很奇怪吧 ~ 其實我也覺得奇怪 ~ 何必多此一舉呢 ~
image
? ?
眾所周知 Ntdll.dll 中的 API 都只不過是一個簡單的包裝函數(shù)而已,
當 Kernel32.dll 中的 API 通過 Ntdll.dll 時,會完成參數(shù)的檢查,
再調(diào)用一個中斷(int 2Eh 或者 SysEnter 指令),從而實現(xiàn)從 Ring3 進入 Ring0 層,
并且將所要調(diào)用的服務(wù)號(也就是在 SSDT 數(shù)組中的索引值)存放到寄存器 EAX 中,
并且將參數(shù)地址放到指定的寄存器(EDX)中,再將參數(shù)復(fù)制到內(nèi)核地址空間中,
再根據(jù)存放在 EAX 中的索引值來在 SSDT 數(shù)組中調(diào)用指定的服務(wù) ~
經(jīng)過上面的步驟后,便由 Ring3 層進入了 Ring0 層,
我們再通過 PE 工具來查看 ntoskrnl.exe 中的 ZwQuerySystemInformation 和 NtQuerySystemInformation
?
image
? ?
image
先來看 ntoskrnl.exe 中的 ZwQuerySystemInformation:
??
image
??
在上面的這幅截圖中,可以看到在 Ring0 下的 ZwQuerySystemInformation 將 0ADh 放入了寄存器 eax 中,
然后調(diào)用了系統(tǒng)服務(wù)分發(fā)函數(shù) KiSystemService,而這個 KiSystemService 函數(shù)則是根據(jù) eax 寄存器中的索引值,
然后再 SSDT 數(shù)組中找到索引值為 eax 寄存器中存放的值得那個 SSDT 項,
最后就是根據(jù)這個 SSDT 項中所存放的系統(tǒng)服務(wù)的地址來調(diào)用這個系統(tǒng)服務(wù)了 ~
比如在這里就是調(diào)用 KeServiceDescriptorTable[0ADh] 處所保存的地址所對應(yīng)的系統(tǒng)服務(wù)了 ~
也就是調(diào)用 Ring0 下的 NtQuerySystemInformation 了 ~
至此,在應(yīng)用層中調(diào)用 NtQuerySystemInformation 的全部流程也就結(jié)束了 ~
最后,貼出一點在 Ring0 下的 NtQuerySystemInformation 的反匯編代碼:
image
??
4. 詳解 SSDT:
在這一節(jié)里面,我們將來看看 SSDT 到底是個什么東西 ~ 這里使用 WinDbg 來調(diào)試 XP SP2 系統(tǒng) ~
??
首先來看看 KeServiceDescriptorTable 是何物 ?
從下面的截圖中可以看到 KeServiceDesciptorTable 的首地址為 804e58a0,
然后查看分析這個地址,可以查看到第一個系統(tǒng)服務(wù)的入口地址為 80591bfb !
2011-08-18_012703
我們再來看看 80591bfb 這個地址對應(yīng)的究竟是何系統(tǒng)服務(wù) ?
從下面的截圖中,可以看到 SSDT 中第一個系統(tǒng)服務(wù)就是 NtAcceptConnectPort !!!
2011-08-18_013027
??
由于我們知道了 SSDT 的首地址,又知道了 Ring0 下 NtQuerySystemInformation 服務(wù)的索引號,
所以可以根據(jù) “SSDT 中系統(tǒng)服務(wù)地址所在的 Address = SSDT 首地址 + 4 * 索引號”,
推算出 NtQuerySystemInformation 服務(wù)的地址,
因此有 Address = 804e58a0 + 4 * 0adh = 804E5B54;
然后我們再來看 804E5B54 這個地址的信息,信息如下截圖:
從截圖中,我們可以看到 NtQuerySystemInformation 的起始地址為 80586ff1,
2011-08-18_020103
下面就來驗證一下地址 80586ff1 到底是不是 NtQuerySystemInformation 的首地址 ~
從下面的截圖中可以肯定 80586ff1 確實就是 NtQuerySystemInformation 的首地址,
這和我們上面對 SSDT 中指定索引號的服務(wù)的地址的計算公式計算出來的結(jié)果是統(tǒng)一的 !!!
2011-08-18_020231
從上面的介紹,可以看出,其實 SSDT 就是一個用來保存 Windows 系統(tǒng)服務(wù)地址的數(shù)組而已 !!!
? ?
5. SSDT ?Hook 原理:
有了上面的這部分基礎(chǔ)后,就可以來看 SSDT HOOK 的原理了,
其實 SSDT Hook 的原理是很簡單的,從上面的分析中,
我們可以知道在 SSDT 這個數(shù)組中呢,保存了系統(tǒng)服務(wù)的地址,
比如對于 Ring0 下的 NtQuerySystemInformation 這個系統(tǒng)服務(wù)的地址,
就保存在 KeServiceDescriptorTable[0ADh] 中,
既然是 Hook 的話,我們就可以將這個 KeServiceDescriptorTable[0ADh] 下保存的服務(wù)地址替換掉,
將我們自己的 Hook 處理函數(shù)的地址來替換掉原來的地址,
這樣當每次調(diào)用 KeServiceDescriptorTable[0ADh]時就會調(diào)用我們自己的這個 Hook 處理函數(shù)了。
下面用幾幅截圖來表示:
image
下面的截圖則是 SSDT Hook 之后了,可以看到將 SSDT 中的服務(wù)地址修改為 MyHookNtQuerySystemInformation 了,
這樣的話,每次系統(tǒng)調(diào)用 NtQuerySystemInformation 這個系統(tǒng)服務(wù)時,
實質(zhì)上調(diào)用的就是 MyHookNtQuerySystemInformation 了,而我們?yōu)榱吮WC系統(tǒng)的穩(wěn)定性(至少不讓其崩潰),
一般會在 MyHookNtQuerySystemInformation 中調(diào)用系統(tǒng)中原來的服務(wù),也就是 NtQuerySystemInformation。
image
6. 小結(jié):
本篇博文呢尚還只是介紹了 SSDT 到底是個什么東西,而還沒有給出具體的 SSDT Hook 的實現(xiàn),
對于 SSDT Hook 的實現(xiàn)以及 Demo 我都放到(二)中完成,也就是本篇博文未完 , 待續(xù) ……
關(guān)于 SSDT 的話,在看雪上有很多的文章,由于我也是前陣子對這東西突然感興趣了,
所以我也算是初次了解,自然也看過了很多的文章,SSDT 在 Google 一搜索可以出來一大堆,
但是要說介紹 SSDT 最詳細的話,我想還是我的這篇文章介紹的比較詳細,
因為網(wǎng)上很多介紹 SSDT 的都只是將 SSDT 原理做了簡單的介紹,然后在網(wǎng)上 down 一個 Demo,
把代碼貼出來就完事了,甚至是代碼都還無法完整編譯通過的,
所以如果讀者想對 SSDT 有所了解的話,可以好好看一看這篇文章的 ~
? ?
順便這里還帶出一個問題,是我這陣子腦子里突然冒出來的一個疑問,
但是由于時間或者說是個人狀態(tài)問題,一直沒有去研究 ~ 不曉得園子里有木有對這個有研究的 ~
眾所周知,在 Windows 操作系統(tǒng)中,System 進程的進程 PID 為 4,
我想問的就是:System 進程的 PID 為何是 4 ?
歡迎大家對這個問題討論啊 ~ 在這里先給點思路,
那就是可以通過 Windows 操作系統(tǒng)的啟動過程,然后結(jié)合 WRK 源碼進行研究 ~
========
總結(jié)
- 上一篇: 虚拟机+CentOS内核hack7、8、
- 下一篇: 图解命令行http工具curl使用初步