驅動保護中的ObjectType_Callback探索

最近學習驅動保護,有點小當心德與你們分享下。
當前環境:VM中的win7 32 保護程序是某遊戲的驅動保護。
具體現象是:在用PCHunter工具查看object鉤子時發現以下的信息:

 點擊圖片以查看大圖圖片名稱: 1.jpg查看次數: 1文件大小: 17.2 KB文件 ID : 84119

疑問點1:在HOOK列顯示的是ObjectType_Callback,之前只據說過ObjectType HOOK沒據說過這個呀,這個是什麼呢?

疑問點2:Object類型列顯示的是「Process」 查閱了《windows內核原理與實現》的55頁WRK中的全局類型對象變量,發現不是系統建立的類型,難道這個對象類型是本身建立的?或者說是PCHunter大牛對這類HOOK的一種描述?

疑問點3:就是這種類型的HOOK是怎麼註冊的呢,又應該怎麼卸載了。
帶着幾個疑問搜索了下ObjectType_Callback 沒有發現相關信息,因此決定本身探索一下。



首先來肯定疑問點2,這個思路是:對比有HOOK和無HOOK的狀況下 查看win7中的ObTypeIndexTable表,看元素是否有增長,若是是自創類型的,在這個表中,應該有增長一項。
這裏順便提一下ObTypeIndexTable表,是從WIN7(具體何時新增的我也不知道,總之XP沒有)開始新增長的,存放的是對象類型,能夠在windbg查看,具體信息原理能夠百度搜索「Win7 OBJECT_HEADER之TypeIndex解析」獲得解答。

當前有HOOK的狀況下WINDBG中顯示以下:

 名稱:  2.jpg查看次數: 0文件大小:  86.5 KB

其中爲了驗證,取第三項86a4e7c8來看,能夠發現的確是存放的對象類型,前兩項是無效。
而後我重啓WIN7 在沒有HOOK的狀況下顯示如圖:

 名稱:  3.jpg查看次數: 0文件大小:  46.4 KB

能夠看出數量是沒有變化的,從而能夠推斷疑問2這個HOOK不是新增長對象類型來完成的,只是軟件做者對其一種描述吧,那這個東西究竟是什麼呢?

從新運行遊戲之後,HOOK又出現了:

 點擊圖片以查看大圖圖片名稱: 4.jpg查看次數: 0文件大小: 29.2 KB文件 ID : 84122

接着解決疑問1,思路是:斷點其中的函數,看函數何時被調用,看看棧回溯,具體在分析下經歷過的函數。
首先反彙編下這兩個地址,第一個以下:

 名稱:  5.jpg查看次數: 0文件大小:  22.8 KB

第二個函數以下:

 點擊圖片以查看大圖圖片名稱: 6.png查看次數: 0文件大小: 7.9 KB文件 ID : 84124

第一個函數是空的,第二個函數有內容,斷點第二個函數,而後運行,很快斷下來了,查看棧回溯如圖:

 點擊圖片以查看大圖圖片名稱: 7.png查看次數: 0文件大小: 30.8 KB文件 ID : 84125

能夠看到調用NtOpenProcess的時候就會調用到他,這正起到了保護做用,其中最接近他的ObpCallPreOperationCallbacks函數和ObpPreInterceptHandleCreate函數在WRK中都沒有,只有ObpCreateHandle在WRK中能夠查到,這個函數解釋爲:This function creates a new handle to an existing object。至關於爲了引用一個對象,新建一個句柄,這個句柄就是這個對象的引用方式。至此咱們知道了,是引用一個對象的時候纔會觸發到這個保護函數,看來PCHunter大牛仍是很強大的,把它分到了object鉤子這類裏邊很精確。

因爲WRK(假想爲XP)中沒有這兩個函數,因此爲了弄清楚何時調用的他必需要反彙編以上兩個函數,因爲才入此道功力尚淺用WINDBG看着費力,因此改成IDA反彙編看,IDA打開內核文件ntkrnlpa.exe 在左側列表中搜索ObpPreInterceptHandleCreate函數反彙編如圖:

點擊圖片以查看大圖圖片名稱: 8.png查看次數: 0文件大小: 25.6 KB文件 ID : 84126 

引入眼簾的就是對象類型表ObTypeIndexTable,想象一下對象類型的HOOK,看來仍是還對象類型有關。再往下看記錄找到調用ObpCallPreOperationCallbacks函數的地方

 點擊圖片以查看大圖圖片名稱: 9.png查看次數: 0文件大小: 31.8 KB文件 ID : 84127

能夠看到在開頭不遠處,發現這個函數代碼量也很小,繼續跟進這個函數,定位CALL相關的代碼,尋找保護函數調用點,一直往下都是系統調用直到這裏:

 點擊圖片以查看大圖圖片名稱: 10.png查看次數: 0文件大小: 14.8 KB文件 ID : 84128

在WINDBG中棧回溯顯示的是
9d158758 840df832 xxxx!SampleDouble+0xcdf8
9d1587a0 840dfa1f nt!ObpCallPreOperationCallbacks+0x163
9d1587e8 8402dbfb nt!ObpPreInterceptHandleCreate+0x6f
對比下代碼看看是否是這個地方,也能夠計算下位置看看是否是這個地方,我比較懶就直接對比下吧,如圖:

 點擊圖片以查看大圖圖片名稱: 11.png查看次數: 0文件大小: 8.4 KB文件 ID : 84129

看來應該這就是調用點,再從CALL EAX中的EAX反推回去,看看怎麼來的。經過IDA的鼠標點擊變量寄存器變色能夠輕鬆定位出如下過程EAX-》
006D581F                 mov     eax, [edi+18h]-》
006D572C                 mov     edi, [eax]-》
006D5729                 mov     eax, [ebp+var_C]-》
006D56E7                 mov     [ebp+var_C], eax-》
006D56DF                 lea     eax, [edi+80h]-》
006D56DD                 mov     edi, eax
說明在這個函數調用時 EAX就是關鍵所在了,分析上一個函數入調用點
經過前邊的截圖能夠看到 EAX-》
006D5A12                 mov     eax, edx-》
006D59C0                 mov     edx, _ObTypeIndexTable[eax*4]
看來一切緣由都來自於對象類型。
006D5A12位置的EAX是一個_OBJECT_TYPE WINDBG中看看WIN7中的結構成員

 名稱:  12.png查看次數: 0文件大小:  9.0 KB

能夠推測006D56DF中的EAX就是一個CallbackList了,看看這個名字再看看PCHunter中的ObjectType_Callback真是徹底同樣啊,回想先前也看了下_OBJECT_TYPE結構可是沒注意到這個成員,想必必定是他保存了回調,這是一個雙鏈表。如今就來看看這個對象類型裏邊的具體內容,想必就應該能夠找到保護函數的地址了。

經過前邊的分析能夠知道再調用ObpCallPreOperationCallbacks函數時的EAX就是當前對象類型的地址,因此在這裏設置斷點,固然也有多是其它的函數調用它,雖然知道不正確可是也只有賭一把了,具體操做以下:

 名稱:  13.png查看次數: 0文件大小:  13.5 KB

能夠看到名稱是Process這和工具裏邊顯示的是同樣,感受應該就是它了,在具體查看一下CallbackList 看看鏈表的內容
 名稱:  14.png查看次數: 0文件大小:  11.6 KB
第一項鍊表頭節點指向首節點a83175f8,首節點也指向首節點86ad3f30,看來只有雙向鏈表中只有一項,查看內容發現紅框處就是保護函數的地址,雙鏈表結構也說明還能夠增長其餘的callback函數。

總體回顧一下 當NtOpenProcess被調用時就會調用到保護函數,這個函數是放在進程對象類型中的CallbackList中的,系統會調用它,且這個結構是雙鏈表,還能夠增長其餘函數,至此疑問1基本就解決了。

接着來看疑問3,既然知道系統有這麼一個機制,確定應該有相應的系統函數吧,總不可能手工來添加刪除吧,既然知道了這個新成員名稱就應該搜索下,看看有什麼信息 GOOGLE搜索下發現有如下內容 

點擊圖片以查看大圖圖片名稱: 15.png查看次數: 0文件大小: 72.9 KB文件 ID : 84133

再翻譯了下大體就是說ObRegisterCallbacks函數來註冊的回調,MSDN搜索發現有這樣的解釋:The ObRegisterCallbacks routine registers a list of callback routines for thread and process handle operations.
這和咱們遇到的狀況同樣,看來保護函數就是用這個函數來添加的了,怎麼卸載呢?看看MSDN的左側欄

 名稱:  16.png查看次數: 0文件大小:  4.6 KB

發現一個對應的UN函數 點擊查看解釋:The ObUnRegisterCallbacks routine unregisters a set of callback routines that were registered with the ObRegisterCallbacks routine.
看來就是它了,兩個函數的參數和進程建立卸載的系統回調差很少,具體能夠參考《教你在64位Win7系統下使用ObRegisterCallbacks內核函數來實現進程保護》http://bbs.pediy.com/showthread.php?t=168023

到此這幾個疑問就解決了,至於後邊的是刪除仍是修改保護函數就看到本身的想法了。
 
 

jpg 轉 rar php

相關文章
相關標籤/搜索