SSDT(system service dispatch table) 系統服務分派表
SSPT(system service parameter table) 系統服務參數表
#pragma pack(1) //SSDT表的結構
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
函數調用過程分析:
(1)用戶調用kenel32.dll中的ReadFile,kenel32.dll中都是包裝函數,kenel32.dll會用這些包裝函數完成參數的有效性檢查,將所有東西轉換為unicode,接著鎖定NTDLL.dll中的NtReadFile函數。
(2)NTDLL.dll中的都是服務的包裝函數,當調用其中的NtReadFile時,這些服務包裝函數將所需的Servcie ID送入EAX寄存器,將參數堆棧幀的指針送入EDX寄存器,然後發出INT 2e中斷。這條指令會將處理器切換到內核模式。INT 2e對應的處理程序是由windows NT 的 executive(估計是內核)建立的,它將參數從用戶模式的堆棧拷貝到內核模式的堆棧。堆棧幀的基址為EDX寄存器的值。而這個中斷程序被稱為KiSystemService()
(3)接著進入內核態,NTOSKRNL.exe開始工作,由它進行系統服務的最終調用,它的系統服務的用戶接口是以包裝函數(wrapper functions)的形式提供的。這些函數都在一個叫做NTDLL.DLL的dll裡。NTOSKNL.EXE先初始化,初始化的過程中,先為NTOSKRNL提供的不同服務創建一個函數表即SSDT,表中的每一項都指定了Service ID所需函數的地址,每個函數代碼都位於內核之中。類似的,SSPT也開始創建。
圖解如下:
下面是兩個表的結構:
SSDT HOOK講解:SSDT HOOK就是通過修改SSDT表的函數地址來實現的,以下是三個相關操作的宏,直接使用
//取函數在SSDT中的位置,下面的為固定計算方法
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
//取函數的索引,固定模式
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
//修改函數的地址
#define HOOK_SYSCALL(_Function, _Hook, _Orig ) _Orig = (PVOID) InterlockedExchange( (PLONG) &m_Mapped[SYSCALL_INDEX(_Function)], (LONG) _Hook)
其他操作就是驅動編寫了,原理就是通過修改SSDT表,用自己的函數代替原有函數以實現進程保護或其他目的
參考:《Undocumented Windows NT》,《黑客防線雜志2010.9》,黑客防線驅動教程。
大家如果要詳細了解,就看上面的東東吧,基本都可以在網上搜到