《電子技術應用》
您所在的位置:首頁 > 通信与网络 > 业界动态 > 网络安全编程:HOOK SSDT

网络安全编程:HOOK SSDT

2021-07-31
來源:计算机与网络安全
關鍵詞: HOOKSSDT

  SSDT把用戶層的Win32 API與內核層的Native API做了一個關聯,而整個Native API都保存在SSDT中的一個函數指針數組中,只要修改函數指針數組中的某一項,就相當于HOOK了某個Native API函數。比如,修改SSDT中函數指針數組中的最后一個函數指針,就相當于HOOK了NtQueryPortInformationProcess()函數。

  下面HOOK一個比較熟悉的函數,即創建進程函數NtCreateProcessEx()。該函數在指針數組的第0x30項(該編號根據系統版本的不同而不同,是系統相關的)。通過編程獲取SSDT表,然后找到Native API的函數指針數組,再修改其中第0x30項的內容為自己的函數地址。為了不影響進程的正常創建,在函數中調用NtCreateProcessEx()函數。代碼如下:

  #include <ntddk.h>

  typedef struct _SERVICE_DESCRIPTOR_TABLE

  {

  PULONG ServiceTableBase;

  PULONG ServiceCounterTableBase;

  ULONG NumberOfServices;

  PUCHAR ParamTableBase;

  }SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;

  extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

  typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,

  HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG);

  // 保存 NtCreateProcessEx 函數的地址

  NTCREATEPROCESSEX ulNtCreateProcessEx = 0;

  // 在指針數組中 NtCreateProcessEx 的地址

  ULONG ulNtCreateProcessExAddr = 0;

  VOID UN_PROTECT()

  {

  __asm

  {

  push eax

  mov eax, CR0

  and eax, 0FFFEFFFFh

  mov CR0, eax

  pop eax

  }

  }

  VOID RE_PROTECT()

  {

  __asm

  {

  push eax

  mov eax, CR0

  or eax, 0FFFEFFFFh

  mov CR0, eax

  pop eax

  }

  }

  VOID DriverUnload(PDRIVER_OBJECT pDriverObject)

  {

  UN_PROTECT();

  // 替換 NtCreateProcessEx 的地址為 MyNtCreateProcessEx

  *(PULONG)ulNtCreateProcessExAddr = (ULONG)ulNtCreateProcessEx;

  RE_PROTECT();

  }

  NTSTATUS

  MyNtCreateProcessEx(

  __out PHANDLE ProcessHandle,

  __in ACCESS_MASK DesiredAccess,

  __in_opt POBJECT_ATTRIBUTES ObjectAttributes,

  __in HANDLE ParentProcess,

  __in ULONG Flags,

  __in_opt HANDLE SectionHandle,

  __in_opt HANDLE DebugPort,

  __in_opt HANDLE ExceptionPort,

  __in ULONG JobMemberLevel

 ?。?/p>

  {

  NTSTATUS Status = STATUS_SUCCESS;

  KdPrint((“Enter MyNtCreateProcessEx! \r\n”));

  Status = ulNtCreateProcessEx(ProcessHandle,

  DesiredAccess,

  ObjectAttributes,

  ParentProcess,

  Flags,

  SectionHandle,

  DebugPort,

  ExceptionPort,

  JobMemberLevel);

  return Status;

  }

  VOID HookCreateProcess()

  {

  ULONG ulSsdt = 0;

  // 保存 NtCreateProcess 的地址

  // 獲取 SSDT

  ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase;

  // 獲取 NtCreateProcessEx 地址的指針

  ulNtCreateProcessExAddr = ulSsdt + 0x30 * 4;

  // 備份 NtCreateProcessEx 的原始地址

  ulNtCreateProcessEx = (NTCREATEPROCESSEX) *(PULONG)ulNtCreateProcessExAddr;

  UN_PROTECT();

  // 替換 NtCreateProcessEx 的地址為 MyNtCreateProcessEx

  *(PULONG)ulNtCreateProcessExAddr = (ULONG)MyNtCreateProcessEx;

  RE_PROTECT();

  }

  NTSTATUS DriverEntry(

  PDRIVER_OBJECT pDriverObject,

  PUNICODE_STRING pRegistryPath

 ?。?/p>

  {

  NTSTATUS Status = STATUS_SUCCESS;

  pDriverObject->DriverUnload = DriverUnload;

  HookCreateProcess();

  return Status;

  }

  DriverEntry()中調用了HookCreateProcess()函數,該函數的作用是將指針數組中NtCreateProcessEx()函數的地址替換為MyNtCreateProcessEx()函數的地址。而MyNtCreateProcessEx()函數是用來取代NtCreateProcessEx()函數的函數,在這里的函數中調用了一條KdPrint()用于輸出代碼。整個HOOK的過程非常簡單,只要找到指針數組的位置,保存原地址后修改為新的地址即可。代碼中出現了兩個函數,分別是UN_PROTECT()和RE_PROTECT()。這兩個函數的作用是禁止和開啟CPU向標志為只讀的內存頁進行寫入的操作。執行UN_PROTECT后, CPU可以向標志為只讀的內存頁進行寫入操作。當寫入完成后,調用RE_PROTECT()函數恢復到原來的狀態。把它放到虛擬機中,打開DebugView,然后加載該驅動,加載成功后隨便運行一個可執行程序。可以看到,DebugView中顯示了在MyNtCreateProcessEx()中的輸出,如圖1所示,說明HOOK成功了。

  圖1  MyNtCreateProcessEx()函數的輸出




電子技術圖片.png

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 国产欧美一区二区三区在线看| 精品久久久久亚洲| 日韩视频在线观看视频| 久久99精品国产99久久| 青青青青在线视频| 午夜精品一区二区三区在线视频 | 久久久综合av| 欧美亚洲另类激情另类| 国产成人av一区二区三区| 国产精品日韩在线| 国产精品一区二区性色av| 国产中文字幕免费观看| 国产在线观看不卡| 国产精品综合网站| 国产偷久久久精品专区| 国产精品久久久久久久久久| 国产成人精品a视频一区www| 久久国产精品久久久久久久久久| 人妻久久久一区二区三区| 欧美 日韩 国产 激情| 欧美精品久久久| 久久人人爽人人爽人人片av高请| 久久中文精品视频| 国产中文字幕免费观看| 国产精品久久久久久婷婷天堂 | 国产精品一区二区在线观看| 狠狠色综合欧美激情| 国产日韩欧美另类| 国产精品久久久久久av福利| 国产精品我不卡| 五月天综合网| 麻豆av一区二区三区久久| 国产日韩专区在线| 91精品国产91久久久久| 日本一区二区三区在线播放| 欧美日韩免费观看一区| 久久精精品视频| 91九色精品视频| 欧美国产综合视频| 国产精品久久久久福利| 丝袜亚洲欧美日韩综合|