程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SSDT表詳解,ssdt詳解

SSDT表詳解,ssdt詳解

編輯:C++入門知識

SSDT表詳解,ssdt詳解


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》,黑客防線驅動教程。

大家如果要詳細了解,就看上面的東東吧,基本都可以在網上搜到

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved