之後的幾篇blog都是關於inline hook的文章,也有可能引起其它一些列的戰鬥任務,也有可能一去不復返。 大俠請從新來過。html
1. 戰鬥一: 無進程木馬windows
所謂無進程木馬,就是利用技術手段隱藏進程的木馬,若是你破解不了它的隱藏技術,你就看不到它的進程。數據結構
1) 進程是如何隱藏的?函數
2)破解這種隱藏,又須要什麼樣的技術?操作系統
3) 隱藏進程的技術,一樣適用於隱藏DLL模塊程序、 隱藏驅動程序。orm
windows系統給咱們開發人員,提供了幾種列出系統全部進程、模塊、與驅動的方法。最多見也是最經常使用的方法是調用系統的API: CreateToolHelp32Snapshot、EnumProcess、EnumProcessModules等,他們是獲取進程列表的第一層手段,調用這個幾個函數,其實就是告訴系統,咱們須要進程列表,而後系統將列表反還給咱們。htm
而這個幾個API在接到請求後又作了什麼呢?blog
他們會調用ZwQuerySystemInformation、ZwQuerySystemInformation會調用KiSystemService切入R0權限,而後自SSDT表中查取得NtQuerySystemInformation 的地址,並調用其指向的實際代碼,而NtQuerySystemInformaion 的做用則是自系統的數據結構中取得相應的數據,再順原路返回去。進程
在中間任何一個環節進行攔截均可以實現隱藏的目的,這種攔截有一個名字叫:「Hook」,在切入R0權限前進行Hook,稱爲應用層Hook,而在以後進行的Hook則是內核Hook。內核hook則須要驅動才能實現。ip
什麼是hook? 什麼是SSDT ?
windows 操做系統就像一個爲咱們管理電腦的服務公司,而他的工做機制是逐級上報,各負其責,他派一個服務人員時刻跟着咱們,看咱們有什麼要求。當咱們想查看中都有什麼進程的時候,咱們會告訴服務員,咱們想了解當前都有哪些進程,那服務員就會把咱們的要求報上去,報給誰呢?他要先知道哪一個部門負責 哪一個工做才行,SSDT表就是作這個的,SSDT表就像是一個路標,指明瞭什麼樣的工做應該由哪個部門負責處理。經過查表得知負責的部門後,工做就被移 交到了那個部門,工做完成後,部門會把工做結果交回給服務員,服務員再交給咱們,而咱們也就獲得咱們想要的結果了。
應用層HOOK呢,就像是服務員被木馬偷偷的替換了,當咱們提出要求時呢,他會檢查是否對他有害,或將對他有害的信息去掉,好比咱們想查看進程,那他在將結果交給咱們時,卻把木馬的進程自結果中抹去了,這樣,咱們天然是看不到木馬進程了。
而 最多見的內核HOOK,則是HOOK-SSDT,上面說了SSDT就是一張表,標明瞭什麼工做應該由什麼部門負責。而SSDT HOOK也就是木馬將表上 的內容給改了,原本交給A部門負責的工做被改爲了交給由木馬負責,這樣,服務員在上報咱們的請求時,一查表發現查看進程的工做是由木馬負責的,他就把這請 求交給木馬了,而木馬呢?他但是知道表中原來的內容是什麼的呀,他只是對請求進行一下過濾,發現沒有對本身有害的,就直接轉交給原部門了,對本身有害的, 天然也就視狀況濾掉或塗改了。每個函數都實現了某一種功能,好比:結束進程是由NtTerminateProcess來完成的,若是HOOK了這個,那 麼在進程結束前,就有機會更改結果了,能夠拒絕被結束。當你試圖在任務管理器中結束某個進程時,系統會拒絕你的操做,其實這並非系統拒絕 的,而是進程本身,因爲進程本身的HOOK了SSDT,因此,結束進程的工做服務員都交給他去作了,他一旦發現結束的就是他本身,那他直接告訴服務員這個 進程不能結束,而後服務員就把這個結果給咱們了,其實咱們的這個請求並無真的到達應該送交的部門。
還有一種是「Inline-HOOK」,什麼是Inline-HOOK呢?
上 面說過了,SSDT就像是一個標明瞭什麼工做由哪一個部門來作的表,SSDT-HOOK就是更改了這個表的指向。而Inline-HOOK呢?他並無更改 表的指向,查找進程的工做在表中仍然指向了負責查找進程的部門。可是呢,木馬卻把那個部門中的人員替換了,這樣仍然能達到它的目的。 Inline- HOOK更加的複雜、更加的邪惡、也更加的不穩定,而應用範圍倒是更加的普遍,查找起來更加的困難 。要知道,對比SSDT表中的指向是否正確,是否指向了正確的部門,要簡單一些,不就是一張表,拿原來的表比對一下就知道了。但inline-Hook卻替換的是公司的人員,Windows就像一個大公司,有成千上百的人,天知道他替換的是哪個。。。
總:程序就像是爲了實現某一目的而定的計劃書;進程就是組織工人分配資源開始執行這份計劃,而Windows操做系統呢?就是一個爲咱們管理電腦也是管理這些執行計劃的工人的服務管理公司;而Windows操做系統呢?就是一個爲咱們管理電腦也是管理這些執行計劃的工人的服務管理公司。
原本想直接繞開SSDT hook,看來是不行,下載Hook Shadow SSDT 的源碼,進行分析一下。
戰鬥二: 伴隨着疑問前行,SSDT 和 Shadow SSDT 有什麼關係?
在看雪上找到了相似的問題: 既然hook了SSDT 再單獨hook SSDT Shadow 是幹什麼?
sudami 回答: 2 張不一樣的表,有些API函數是由win32k.sys導出的,這張表只有在SSDT shadow裏面找獲得。SSDT是ntoskrl,的東西,SSDT shadow 好像都是win32k.sys的東西。並且後者不常駐內存。在SSDT中的函數,在shadow ssdt中也存在,並且shadow ssdt中還有win32k.sys導出的函數,這些函數並不在SSDT中。
查找KeAddSystemServiceTable 這個函數來找到KeServiceDescriptorTableShadow的偏移,原理是這個函數含有對KeServiceDescriptorTableShadow的引用, lea ecx,nt!KeServiceDescriptorTableShadow (80554060)[eax];在 ntoskrnl中有導出,它函數的做用只是添加系統服務表,不是系統服務。因爲如今仍是菜鳥,功力不行,仍是暫時不反kd> uf KeAddSystemServiceTable 這個函數。 反這個函數的大俠的blog地址在: http://blog.sina.com.cn/s/blog_65a1d2800100qf7l.html (引用)。