讀出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
方法1 純彙編讀取
ULONG SSDT_NtOpenProcess_Addr;
//[[KeServiceDescriptorTable]+0x7A*4]
__asm
{
push eax
//
mov eax,KeServiceDescriptorTable
mov eax,[eax] // //System Service Dispatch Table 的基地址
imul eax,eax
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