(50)补充内容:SSDT HOOK 模板
生活随笔
收集整理的這篇文章主要介紹了
(50)补充内容:SSDT HOOK 模板
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼
下面的驅(qū)動代碼ssdt hook了NtOpenProcess函數(shù),可以監(jiān)視打開進程的操作。
#include <ntddk.h> #include <ntstatus.h>/************************************************************************/ /* 類型聲明 */ /************************************************************************/// 系統(tǒng)服務(wù)表 typedef struct _KSYSTEM_SERVICE_TABLE {PULONG ServiceTableBase; // 函數(shù)地址表(SSDT)PULONG ServiceCounterTableBase; // SSDT 函數(shù)被調(diào)用的次數(shù)ULONG NumberOfService; // 函數(shù)個數(shù)PULONG ParamTableBase; // 函數(shù)參數(shù)表(SSPT) } KSYSTEM_SERVICE_TABLE, *PKSYSTEM_SERVICE_TABLE;typedef struct _KSERVICE_TABLE_DESCRIPTOR {KSYSTEM_SERVICE_TABLE ntoskrnl; // 內(nèi)核函數(shù)KSYSTEM_SERVICE_TABLE win32k; // win32k.sys 函數(shù)KSYSTEM_SERVICE_TABLE unUsed1;KSYSTEM_SERVICE_TABLE unUsed2; } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;// NTOPENPROCESS typedef NTSTATUS (*NTOPENPROCESS) (PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId);/************************************************************************/ /* 函數(shù)聲明 */ /************************************************************************/VOID DriverUnload(PDRIVER_OBJECT pDriver); NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path); VOID PageProtectOff(); VOID PageProtectOn(); VOID HookNtOpenProcess(); VOID UnHookNtOpenProcess(); NTSTATUS HbgNtOpenProcess(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId);/************************************************************************/ /* 全局變量 */ /************************************************************************/extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable; // ntoskrnl.exe 導出的全局變量 ULONG uOldNtOpenProcess; // 舊的函數(shù)地址/************************************************************************/ /* 函數(shù)定義 */ /************************************************************************/// 驅(qū)動入口 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path) {// HOOKHookNtOpenProcess();pDriver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }// 卸載驅(qū)動 VOID DriverUnload(PDRIVER_OBJECT pDriver) {UnHookNtOpenProcess();DbgPrint("Driver unloaded.\n"); }// 關(guān)閉頁保護 VOID PageProtectOff() {__asm{cli; // 關(guān)閉中斷mov eax, cr0;and eax, not 0x10000; // WP位置0mov cr0, eax;} }// 開啟頁保護 VOID PageProtectOn() {__asm{mov eax, cr0;or eax, 0x10000; // WP位置1mov cr0, eax;sti; // 恢復中斷} }// HOOK NtOpenProcess VOID HookNtOpenProcess() {PageProtectOff();uOldNtOpenProcess = KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[0x7A];KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[0x7A] = (ULONG)HbgNtOpenProcess;PageProtectOn(); }// UnHOOK NtOpenProcess VOID UnHookNtOpenProcess() {PageProtectOff();KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[0x7A] = uOldNtOpenProcess;PageProtectOn(); }// 被修改的 NtOpenProcess 函數(shù),簡單打印參數(shù) NTSTATUS HbgNtOpenProcess(PHANDLE ProcessHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PCLIENT_ID ClientId) {DbgPrint("%x %x %x %x\n", ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);return ((NTOPENPROCESS)uOldNtOpenProcess)(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId); }運行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的(50)补充内容:SSDT HOOK 模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (49)逆向分析KiSystemServ
- 下一篇: (51)SSDT HOOK 实现进程保护