《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 業界動態 > 網絡安全編程: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。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
老**午夜毛片一区二区三区| 一二三区精品| 欧美高清你懂得| 亚洲精品乱码久久久久久按摩观| 亚洲国产精品成人| 欧美视频一区二区三区…| 亚洲欧美日本国产有色| 亚洲欧美日韩爽爽影院| 好看不卡的中文字幕| 欧美成人精品激情在线观看| 99精品热视频| 亚洲一区二区视频| 国产亚洲欧美日韩日本| 欧美**人妖| 亚洲午夜黄色| 欧美一区二区私人影院日本| 亚洲国产欧美久久| 欧美午夜精品久久久久久孕妇| 久久xxxx| 亚洲美女中出| 亚洲制服av| 在线看视频不卡| 国产精品久久二区二区| 麻豆九一精品爱看视频在线观看免费| 99在线精品观看| 亚洲毛片在线| 一本色道久久综合亚洲精品高清| av成人免费| 亚洲一区国产视频| 亚洲二区免费| 亚洲一区二区三区在线视频| 亚洲欧美日韩高清| 久久不射2019中文字幕| 一本久久a久久免费精品不卡| 国产视频久久网| 欧美日产在线观看| 久久久另类综合| 亚洲欧美日韩中文视频| 亚洲精品综合在线| 99视频精品全部免费在线| 亚洲网站在线| 久久9热精品视频| 久热国产精品| 欧美日韩成人网| 久久综合五月| 欧美黄色aa电影| 欧美日韩在线一区| 欧美激情第三页| 欧美日韩一区二区三区四区在线观看 | 久久久久久久久久久一区| 蜜桃av一区| 欧美午夜美女看片| 国模一区二区三区| 国产精品swag| 国产一区二区福利| 亚洲人成网在线播放| 国模精品一区二区三区| 亚洲国产精品第一区二区三区| 99在线观看免费视频精品观看| 亚洲女同在线| 亚洲精品在线三区| 欧美一区二区三区在线视频| 亚洲伊人伊色伊影伊综合网| 欧美专区福利在线| 欧美激情国产日韩精品一区18| 国产精品毛片a∨一区二区三区| 欧美日韩日日夜夜| 国产精品视频大全| 国产精品v欧美精品v日本精品动漫 | 亚洲精品日本| 在线观看三级视频欧美| 99一区二区| 久久精品亚洲国产奇米99| 欧美一级在线视频| 欧美国产日韩视频| 国产欧美91| 欧美激情第六页| 国产精品一卡二卡| 最新中文字幕亚洲| 香蕉久久夜色| 香蕉久久夜色| 中文网丁香综合网| 亚洲影院免费| 蜜臀a∨国产成人精品| 国产精品一区二区欧美| 亚洲欧洲日产国产综合网| 欧美亚洲三区| 亚洲制服av| 欧美日韩福利视频| 亚洲国产成人午夜在线一区 | 欧美在线观看网址综合| 亚洲一区精彩视频| 欧美精品久久久久久久| 欧美日韩成人一区二区三区| 国产一区二区三区在线观看免费 | 亚洲人成人一区二区三区| 欧美一区二区视频观看视频| 欧美日韩国产欧| 亚洲电影免费观看高清完整版| 午夜亚洲性色视频| 欧美伊人久久大香线蕉综合69| 亚洲一区亚洲二区| 欧美噜噜久久久xxx| 精品999在线播放| 亚洲欧洲日本mm| 亚洲国产导航| 久久精品麻豆| 欧美ed2k| 国内视频一区| 性色av一区二区三区红粉影视| 亚洲欧美日韩成人| 欧美日韩一区二区免费视频| 亚洲精品老司机| 亚洲精品免费一二三区| 免费观看日韩| 在线观看国产日韩| 久久精品五月| 99精品99| 欧美成人中文字幕| **网站欧美大片在线观看| 亚洲福利电影| 免费欧美日韩国产三级电影| 精品91久久久久| 亚洲国产精品久久久| 夜夜狂射影院欧美极品| 免费欧美电影| 亚洲人成网站在线播| 亚洲伦理在线观看| 欧美日韩a区| 一本到12不卡视频在线dvd| 亚洲一区久久久| 国产精品久久中文| 亚洲免费伊人电影在线观看av| 午夜电影亚洲| 国产欧美一区二区精品仙草咪| 亚洲欧美日韩综合| 久久精品毛片| **欧美日韩vr在线| 一区二区三区欧美成人| 欧美午夜性色大片在线观看| 亚洲性视频h| 久久国产主播| 伊人久久综合| 一区二区三区视频在线播放| 欧美视频在线一区| 亚洲欧美综合精品久久成人| 久久久久久久综合色一本| 影音先锋一区| 亚洲天堂网在线观看| 国产精品一区二区女厕厕| 亚洲电影一级黄| 欧美片在线观看| 亚洲一二区在线| 久久天堂成人| 国产精品系列在线播放| 午夜日韩av| 欧美成人三级在线| 亚洲最新在线视频| 久久精品综合一区| 亚洲国产成人久久| 亚洲欧美日韩视频一区| 国内精品视频一区| 一区二区精品在线| 国产视频在线观看一区二区三区| 亚洲风情在线资源站| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 国产精品99久久99久久久二8 | 亚洲视频成人| 亚洲精品欧美精品| 国产精品99免视看9| 欧美亚洲一区二区在线| 欧美成人嫩草网站| 亚洲一区二区三区免费在线观看 | 国产精品视频专区| 亚洲高清视频一区| 欧美体内she精视频| 欧美一区二区视频97| 欧美日韩高清一区| 欧美一区二区三区四区高清| 欧美激情亚洲自拍| 亚洲欧美怡红院| 欧美精品久久天天躁| 亚洲欧美日韩在线观看a三区| 欧美激情一二三区| 午夜天堂精品久久久久| 欧美日韩高清一区| 久久精品一级爱片| 国产精品福利片| 亚洲欧洲一区二区三区久久| 久久中文在线| 一区二区三区四区精品| 中文精品视频| 狠狠综合久久av一区二区小说| 亚洲一级免费视频| 一区视频在线看| 欧美一区二区三区的| 亚洲久久在线| 亚洲一区www| 在线看片一区| 久久久久久欧美|