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

 ?。?/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,然后加載該驅動,加載成功后隨便運行一個可執行程序??梢钥吹剑珼ebugView中顯示了在MyNtCreateProcessEx()中的輸出,如圖1所示,說明HOOK成功了。

  圖1  MyNtCreateProcessEx()函數的輸出




電子技術圖片.png

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 欧美激情视频在线观看一区二区三区 | 亚洲精品久久久久久久久久久网站 | 中文字幕99在线精品视频免费看 | 日韩精品三级 | 日本韩国一级 | 欧美片a | a毛片免费 | 国产一区免费在线观看 | 日本亚州在线播放精品 | 热re91久久精品国产91热 | 日韩欧美中文字幕在线视频 | 亚洲国产99在线精品一区二区 | 亚洲网站免费看 | 日本在线观看免费看片 | 国产成人久久久精品一区二区三区 | 亚洲成人免费视频 | 国产精品视频男人的天堂 | 国产成人爱片免费观看视频 | 精品国产一区二区三区免费看 | 久久99亚洲精品一区二区 | 一级绝黄 | 久草视频在线网 | 蘑菇午夜三级 | 久久中文字幕免费视频 | 免费一级特黄欧美大片久久网 | 一级毛片免费观看不卡视频 | 国产大片在线看 | 特级欧美午夜aa毛片 | 久久久久久国产精品免费免费 | 亚洲精品韩国美女在线 | 日韩精品久久久毛片一区二区 | 国产精品自拍一区 | 玖草 | 日韩美香港a一级毛片 | 亚洲a人| 欧亚毛片 | 国产伦精品一区二区三区精品 | 欧美大狠狠大臿蕉香蕉大视频 | 香蕉视频在线观看黄 | 成人在线观看国产 | 在线观看片成人免费视频 |