2012-01-26 79 views
3

我寫了一個C工具來混淆一下windows內核。現在我們可以看到在「PAGE」部分有幾個函數,這意味着內核的這個函數可以被調出。我知道他們的地址,因爲我可以在內存中讀取Windows內核的PE頭。 (不可分頁以及主要.text部分)。Windows(64)內核驅動程序和pagable函數

所以這裏是我的問題:爲了調用windows內核的pagable函數(從我的驅動程序),我需要做些什麼。更確切地說,我必須做些什麼來確保函數當前被分頁和駐留爲可執行內存?當這些功能被分頁時偶爾會出現BSOD。有沒有一種方便的方法來實現這一目標? (而不是稱爲「PAGE」的內核文本部分的「MmProbeAndLockPages」)。

提示:我沒有使用Windows工具。我需要完成,在普通的老C(MinGW的工具鏈)

問候, 邁克爾


./bin/asmdiff.exe info -s /cygdrive/c/Windows/winsxs/amd64_microsoft-windows-os-kernel_31bf3856ad364e35_6.1.7601.17514_none_ca56670fcac29ca9/ntoskrnl.exe 

Trying to get Information for file: /cygdrive/c/Windows/winsxs/amd64_microsoft-windows- os-kernel_31bf3856ad364e35_6.1.7601.17514_none_ca56670fcac29ca9/ntoskrnl.exe... 

BinaryFormat: PE_64 

######### Dumping PE64-File sections: ######### 

Section 0: <.text> base:0x0000000140001000 len:1712881 
Section 1: <INITKDBG▒9> base:0x00000001401A4000 len:14768 
Section 2: <POOLMI> base:0x00000001401A8000 len:7197 
Section 3: <POOLCODE base:0x00000001401AA000 len:11803 
Section 4: <RWEXEC> base:0x00000001401AD000 len:4096 
Section 5: <.rdata> base:0x00000001401AE000 len:252272 
Section 6: <.data> base:0x00000001401EC000 len:603464 
Section 7: <.pdata> base:0x0000000140280000 len:196824 
Section 8: <ALMOSTRO▒> base:0x00000001402B1000 len:7664 
Section 9: <[email protected]> base:0x00000001402B3000 len:6464 
Section 10: <PAGELK> base:0x00000001402B5000 len:85739 
Section 11: <PAGE> base:0x00000001402CA000 len:2317806 
Section 12: <PAGEKD> base:0x0000000140500000 len:19442 
Section 13: <PAGEVRFY▒> base:0x0000000140505000 len:136619 
Section 14: <PAGEHDLS▒'> base:0x0000000140527000 len:10199 
Section 15: <PAGEBGFXLf> base:0x000000014052A000 len:26188 
Section 16: <PAGEVRFB> base:0x0000000140531000 len:13312 
Section 17: <.edata> base:0x0000000140535000 len:67960 
Section 18: <PAGEDATA> base:0x0000000140546000 len:56576 
Section 19: <PAGEVRFC)> base:0x0000000140554000 len:10526 
Section 20: <PAGEVRFDP> base:0x0000000140557000 len:4688 
Section 21: <INIT> base:0x0000000140559000 len:357788 
Section 22: <.rsrc> base:0x00000001405B1000 len:221024 
Section 23: <.reloc> base:0x00000001405E7000 len:8304 

回答

5

一般情況下,你不應該做任何事情來獲得分頁代碼 - 內存經理會照顧你的。

但是,如果代碼被標記爲可分頁的,這意味着只有在系統處於小於DISPATCH_LEVEL的IRQL時才能調用該函數。因此,您希望能夠在更高IRQL下運行的代碼不應被標記爲可分頁。

您可以使用MmLockPagableCodeSection()(請參閱http://msdn.microsoft.com/en-us/library/windows/hardware/ff554307.aspx)動態鎖定可分頁代碼,但我認爲該級別的控制可能只需要很少。

您可以將驅動程序驗證程序與「強制IRQL檢查」一起使用,以幫助您更確定地檢測何時可以在高IRQL中調用可分頁代碼。

+0

現在,內核seection的MmProbeAndLock爲我工作。我猜MmLockPagableCodeSection也是一種方法。我正在使用最低的IRQL。 但我仍然需要在oder的ProbeAndLock來獲取頁面。如果我不這樣做,系統有時會返回給我可讀的死空間。在VM或主機CPU內部進行內核分頁時,我還注意到了行爲的改變。 – willsteel