內核空間與內核模塊

Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.htmlhtml

1、內核空間分佈:數據結構

  在4GB內存的操做系統中,高2G的給內存空間操做系統使用,這部份內存空間全部進程共享。函數

  低2G的內存給各個進程使用,每一個進程佔有獨立的內存空間,相互進程其內存之間並不影響。工具

  

 

2、內核模塊spa

  內核模塊與通常應用層的模塊並無太大區別,其文件結構都遵照Windows的可執行文件結構規範(PE),本質是同樣的。操作系統

  

 

 3、DRIVER_OBJECT 結構體介紹3d

  每個內核模塊中都有一個DRIVER_OBJECT結構體,用來描述這個模塊在內核中的位置、大小、名稱等。指針

  使用 windbg 來查看該結構體code

        kd > dt _DRIVER_OBJECT
        nt!_DRIVER_OBJECT
        + 0x000 Type             : Int2B
        + 0x002 Size : Int2B
        + 0x004 DeviceObject : Ptr32 _DEVICE_OBJECT
        + 0x008 Flags : Uint4B
        + 0x00c DriverStart : Ptr32 Void    // 驅動程序開始的位置
        + 0x010 DriverSize : Uint4B       // 驅動的大小
        + 0x014 DriverSection : Ptr32 Void       // 指向 _LDR_DATA_TABLE_ENTRY,實驗二有介紹,咱們以前瞭解過。
        + 0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION
        + 0x01c DriverName : _UNICODE_STRING    // 在內核中名字是什麼
        + 0x024 HardwareDatabase : Ptr32 _UNICODE_STRING
        + 0x028 FastIoDispatch : Ptr32 _FAST_IO_DISPATCH
        + 0x02c DriverInit : Ptr32     long
        + 0x030 DriverStartIo : Ptr32     void
        + 0x034 DriverUnload : Ptr32     void
        + 0x038 MajorFunction : [28] Ptr32   longhtm

  咱們在進行驅動開發時,其DriverEntry驅動入口程序第一個參數就是傳入這個結構體的指針,咱們能夠打印出這個地址,而後在windbg中查看對應的數據結構(實驗一)

  NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
        // 驅動代碼
   }

  注意:咱們看不少內核結構體,有Driver,其能夠認爲內核模塊,二者並沒有太大區別,Driver是負責協調操做系統與硬件的。

 

 

實驗一:編寫驅動程序,輸出該驅動 DRIVER_OBJECT結構體指針,並在windbg中查看驗證。

  1)編寫驅動代碼,打印出diver地址,並生成 .sys 驅動文件,放入虛擬機驅動。

 1 #include <ntifs.h>
 2 
 3 //提供一個卸載函數,讓程序能卸載,若是沒有這個函數,驅動將不能卸載。
 4 VOID UnDriver(PDRIVER_OBJECT driver)
 5 {
 6     KdPrint(("卸載驅動成功"));
 7 }
 8 //入口函數,至關於main。
 9 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
10 {
11     __asm {
12         int 3
13         xor eax,eax
14         xor eax,eax
15     }
16     KdPrint(("%x..\r\n",driver));
17     driver->DriverUnload = UnDriver;
18     return STATUS_SUCCESS;
19 }

  2)利用 DebugView 工具查看驅動輸出的 driver 指針地址。

    

 

  3) 使用Windbg,「dt 結構體 地址」 指令,能夠將內存空間中的數據與結構體完美映射。            

 

    

  

 

 實驗二:經過DriverSection來遍歷其餘模塊地址

  DriverSection成員指向 _LDR_DATA_TABLE_ENTRY結構體,其表示一個進程模塊加載的入口地址,前三個成員是一個雙向鏈表。

  利用實驗一中介紹的 "dt 結構體 內存地址"的指令能夠將內存映射到結構體中查看詳細信息。

  更詳細的信息能夠參考之前的一篇博客:利用C++進行模塊隱藏(R3層斷鏈) https://www.cnblogs.com/onetrainee/p/11674211.html

   

相關文章
相關標籤/搜索