2016-07-29 170 views
1

本質上我正在尋找一種可以爲內核模式做什麼的函數,VirtualProtect對用戶模式有什麼作用。如何在Windows 7下的內核模式下設置內存區域的保護

我使用以下簡化代碼示例的邏輯分配內存。

PMDL mdl = MmAllocatePagesForMdl  
    (
     LowAddress, 
     HighAddress, 
     SkipAddress, 
     size 
    ); 

    ULONG flags = NormalPagePriority | MdlMappingNoExecute | MdlMappingNoWrite; 
    PVOID ptr = MmGetSystemAddressForMdlSafe 
    (
     mdl, 
     flags 
    ); 

MdlMappingNoExecuteMdlMappingNoWrite標誌只會對Win8的+效果。
此外,僅使用MmGetSystemAddressForMdlSafe我不能指定例如NoAccess保護內存區域。

是否有任何額外的或替代的API-s我可以使用,以便我可以修改分配的內存的頁面保護?
由於目前這種功能在生產代碼中不會被使用,因此攻擊者也會這樣做。

回答

0

我目前使用的代碼如下。
所有使用的API都是官方的。
這裏我創建另一個mdl子範圍分配的內存和更改保護該子範圍。

如果你絆倒內存,下面則此方法保護:

  • IRQL < DISPATCH_LEVEL你會得到PAGE_FAULT_IN_NONPAGED_AREA故障(無效的系統內存被引用這不能被保護的嘗試 - 除了, 它必須是。通過探針保護。通常該地址是隻是普通的錯誤或它 在釋放的內存指向。)
  • IRQL == DISPATCH_LEVEL你會得到 DRIVER_IRQL_NOT_LESS_OR_EQUAL故障(嘗試在 中斷請求級別(IRQL)上訪問可分頁(或完全無效)的地址,該地址過高。這通常是 因使用不當地址的驅動程序。)

注意,如果子範圍頁面分配的一部分,改變保護可能會失敗。那麼status將可能是STATUS_NOT_SUPPORTED
頁分配可能發生,如果最初分配的內存區域的大小和對齊方式(這取決於SkipAddress變量的問題)是合適的,其他一些先決條件得到滿足與我不熟悉的(可能是從某個開始OS版本)。

 PMDL guard_mdl = IoAllocateMdl 
     (
      NULL, 
      PAGE_SIZE * guardPageCount, 
      FALSE,   
      FALSE, 
      NULL   
     ); 

     if (guard_mdl) 
     { 
      IoBuildPartialMdl 
      (
       mdl,  
       guard_mdl, 
       (PVOID)(0), // **offset** from the beginning of allocated memory ptr 
       PAGE_SIZE * guardPageCount 
      ); 

      status = MmProtectMdlSystemAddress 
      (
       guard_mdl, 
       PAGE_NOACCESS 
      ); 
     } 
1
C:\Windows\System32>dumpbin /exports ntdll.dll | find "Protect" 
     391 17E 0004C030 NtProtectVirtualMemory 
     1077 42C 000CE8F0 RtlProtectHeap 
     1638 65D 0004C030 ZwProtectVirtualMemory 

我想你可以調用從內核模式Zw功能和ARG遊戲大致相同爲相應Nt功能。雖然ZwProtectVirtualMemory沒有記錄,但有一個記錄的ZwAllocateVirtualMemory接受保護標誌。

另一種方法是在用戶模式下分配和保護虛擬內存,將緩衝區傳遞給驅動程序,然後在那裏創建相應的MDL。

+0

謝謝。你碰巧知道嗎,這些API可以應用於非分頁和系統(不與進程關聯)的內存嗎? –

+0

* ZwAllocateVirtualMemory例程在指定進程的用戶模式虛擬地址空間內保留,提交或提供這兩個頁面的區域* - https://msdn.microsoft.com/zh-cn/library/windows/硬件/ ff566416%28v = vs.85%29.aspx 儘管您的答案仍然有用,但由於'MmAllocatePagesForMdl'生成非分頁內存分配 - https://msdn.microsoft,因此目前該問題隱含地要求解決非分頁內存問題。 com/en-us/library/windows/hardware/ff554482(v = vs.85).aspx –

+0

知道未公開的'ZwProtectVirtualMemory' API是否能夠在非分頁內存上工作,以及它與' MmProtectMdlSystemAddress'?我想我明白'NtProtectVirtualMemory'是用於用戶模式的內存,並且會失敗,並且參數指向系統內存範圍。 'Zw'和'Mm' API之間的區別很有趣,因爲在互聯網上可以找到各種詭計來調用'ZwProtectVirtualMemory' API。如果不是因爲某些優勢......那麼我認爲這些黑客不會被製造出來? –