《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 業界動態 > 網絡安全編程: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

  )

  {

  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

  )

  {

  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。
主站蜘蛛池模板: 初女破苞国语在线观看免费| 在线免费视频你懂的| 亚洲国产成人精品电影| 精品露脸国产偷人在视频| 国产男女插插一级| av在线手机播放| 无遮掩60分钟从头啪到尾| 亚洲国产成人九九综合| 精品久久人人做人人爽综合| 国产成人免费片在线观看| 97久久免费视频| 怡红院美国分院一区二区| 久久精品亚洲精品国产欧美| 欧美精品亚洲精品日韩1818| 午夜精品一区二区三区在线观看| 黄网免费在线观看| 国产精品无码久久av| igao视频在线| 成全视频在线观看免费看 | 久久久久久亚洲精品中文字幕| 欧美日韩一区视频| 伊人久久精品一区二区三区| 美日韩在线观看| 国产在热线精品视频| 美女网站色在线观看| 在线国产一区二区| 一区二区三区免费视频播放器| 无码国产成人午夜电影在线观看| 久久这里只有精品18| 欧美亚洲图片小说| 亚洲狠狠婷婷综合久久久久| 男生与女生差差| 卡一卡2卡3高清乱码网| 色综合一区二区三区| 国产在线精品一区在线观看| 亚洲香蕉久久一区二区| 国产香蕉视频在线| aa级黄色大片| 女人张腿让男桶免费视频网站| 中文字幕国语对白在线电影| 日本护士xxxx爽爽爽|