1. 程式人生 > >讀出SSDT表當前函式地址

讀出SSDT表當前函式地址

        A、引用KeServiceDescriptorTable表

        B、通過ServiceTableBase+偏移讀出當前函式地址

        C、用windbg測試讀取的值

系統服務描述符表 在ntoskrnl.exe匯出KeServiceDescriptorTable 這個表

typedef struct _ServiceDescriptorTable {

         PVOID ServiceTableBase; //System Service Dispatch Table 的基地址 

         PVOID ServiceCounterTable

;

         //包含著 SSDT 中每個服務被呼叫次數的計數器。這個計數器一般由sysenter 更新。

         unsigned int NumberOfServices;// ServiceTableBase 描述的服務的數目。 

         PVOID ParamTableBase; //包含每個系統服務引數位元組數表的基地址-系統服務引數表

}*PServiceDescriptorTable

//SSDT索引號獲取當前函式地址 

//NtOpenProcess  [[KeServiceDescriptorTable]+0x7A*4] 

extern PServiceDescriptorTable

KeServiceDescriptorTable;

方法1 純彙編讀取

ULONG SSDT_NtOpenProcess_Addr;

         //[[KeServiceDescriptorTable]+0x7A*4]

         __asm

         {

     push eax   

          //

          mov eax,KeServiceDescriptorTable

          mov eax,[eax] // //System Service Dispatch Table 的基地址

          imul eax,eax

,0x7a

          shl eax,2 //[KeServiceDescriptorTable]+0x7A*4

          mov eax,[eax] //[[KeServiceDescriptorTable]+0x7A*4]

          mov SSDT_NtOpenProcess_Addr,eax

          //      

          pop  eax

         }

         KdPrint(("讀取SSDT_NtOpenProcess_Addr=%x +++++++\n",SSDT_NtOpenProcess_Addr));

    //讀取SSDT_NtOpenProcess_Addr=8058270a +++++++

    //SSDT_NtOpenProcess_Cur_Addr=8058270a

方法2:用指標讀取

LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;

         KdPrint(("驅動成功被載入中.............................\n"));

         //讀取SSDT表中索引值為0x7A的函式

         //poi(poi(KeServiceDescriptorTable)+0x7a*4)

         t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;

         KdPrint(("當前ServiceTableBase地址為%x \n",t_addr));

         SSDT_Adr=(PLONG)(t_addr+0x7A*4);

         KdPrint(("當前t_addr+0x7A*4=%x \n",SSDT_Adr));

         SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;    

         KdPrint(("當前SSDT_NtOpenProcess_Cur_Addr地址為%x \n",SSDT_NtOpenProcess_Cur_Addr));

當前ServiceTableBase地址為804e58a0

當前t_addr+0x7A*4=804e5a88

當前SSDT_NtOpenProcess_Cur_Addr地址為8058270a