久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2896|回復: 0
打印 上一主題 下一主題
收起左側

HOOK SSDT表的理解(1)

[復制鏈接]
跳轉到指定樓層
樓主
ID:71922 發表于 2015-1-10 23:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
**********************************************************************
剛開始時挺難理解SSDT 郁金香的視頻教程說的還是不夠詳細,后來自己實驗了,
多比較,多看就明白怎么回事了,現在寫下來方便以后自己查看。
**********************************************************************
SSDT 是一張表,里面存儲了所有Nt開頭的內核API內存地址。
每個內核API都有一個索引號。系統通過這個索引號得到相應的內核NtAPI的內存地址然后調用
可以把 SSDT 想象成一個LONG *SSDT 指針:
LONG *SSDT;
SSDT[0] 存儲著 NtAcceptConnectPort 所在的內存地址   0x805A565C
SSDT[1] 存儲著 NtAccessCheck 所在的內存地址         0x805F243E
...
SSDT[122] 存儲著 NtOpenProcess 所在的內存地址       0x805CC470  
其中數組元素
0 就是 NtAcceptConnectPort 索引號
1 就是 NtAccessCheck 索引號
122 就是 NtOpenProcess 索引號
如果要得到NtOpenProcess所在的內存地址 首先必須要知道 SSDT首地址 和 NtOpenProcess的索引號
【注意】不同的系統版本索引號也會不一樣 此處僅僅是為了解釋SSDT表。
現在根據實例來配合,現在要得到NtOpenProcess的內存地址
用 winDebug 得到 SSDT這個表的首地址是 0x80505480




進入這個地址看看里面的內容是什么



0: kd> dd poi[KeServiceDescriptorTable]
  地址       0        1        2        3  
80505480  805a565c 805f243e 805f5c74 805f2470
             4        5        6        7
80505490  805f5cae 805f24a6 805f5cf2 805f5d36
             8        9        10       11
805054a0  80616d1e 80617a60 805ed83c 805ed494
805054b0  805d5bae 805d5b5e 80617344 805b6fe2
805054c0  80616960 805a9ae6 805b15f6 805d7672
805054d0  8050289c 80617a52 80577b0a 80539c34
805054e0  8060ff2e 805bd55c 805f61ae 80624cf0
805054f0  805fa6c2 805a5d4a 80624f44 805a55fc

看到 0x80505480 這個地址存的第0個地址是 0x805A565C
Kerne Detective 這個工具看看這個是什么API




0個是NtAcceptConnectPort 這個API
可以看到 WinDebug 得到的數據 和 KD 一樣
用工具可以很容易找到SSDT的基地址 和 索引號以及NtAPI的內存地址
用編程實現  (精華):
要檢查 SSDT 指定的NtAPI有沒有被HOOK 就要先 獲取到現在的NtAPI地址、獲取原來的NtAPI的內存地址,然后將兩個地址相比較即可。
獲取現在NtAPI的內存地址的具體流程
首先應該得到SSDT的首地址 即 基址
然后將ServiceTableBase 的內存首地址+索引號*4 得到存儲著相應索引號內核NtAPI現在的內存地址的地址(ServiceTableBase的偏移地址)
讀取該地址得到現在的NtAPI內存地址
獲取原來的NtAPI的內存地址的具體流程
通過 MmGetSystemRoutineAddress 可以得到原來的NtAPI 地址
主要是 獲取現在的NtAPI比較費心思去理解,只要理解了這個流程,也就理解了SSDT表的結構了。
看看下面的代碼以及注釋就能理解SSDT表的結構了
左邊是用KD工具得到 NOtOpenProcess 內存地址 右邊是用WinDebug得到




下圖是通過編程得到 NtOpenProcess 內存地址:




代碼:
ypedef struct _ServiceDescriptorTable {
     PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
     PVOID ServiceCounterTable;
     //包含著SSDT 中每個服務被調用次數的計數器。這個計數器一般由sysenter 更新。
     unsigned int NumberOfServices;//由ServiceTableBase 描述的服務的數目。
     PVOID ParamTableBase; //包含每個系統服務參數字節數表的基地址-系統服務參數表
}*PServiceDescriptorTable;  
extern PServiceDescriptorTable KeServiceDescriptorTable;
ULONG GetNt_CurAddr() //獲取當前SSDT_NtOpenProcess的現在地址
{
LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr;      
KdPrint(("驅動成功被加載中.............................\n\n"));
KdPrint(("********************** 計算現在的地址**********************\n\n"));
//讀取SSDT表中索引值為x7A的函數
//poi(poi(KeServiceDescriptorTable)+0x7a*4)
t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;     // 得到ServiceTableBase 的地址
KdPrint(("[得到ServiceTableBase 的基址] \n當前ServiceTableBase地址為0x%X \n\n",t_addr));
// 將該地址里面的內容+ 索引號* 4  就能得到相應索引號內核NtAPI現在的內存地址0x7A為NtOpenProcess在SSDT的索引
SSDT_Adr=(PLONG)(t_addr+0x7A*4);
KdPrint(("[將ServiceTableBase 的內存首地址+索引號*4 \n得到存儲著相應索引號內核NtAPI現在的內存地址的地址(ServiceTableBase的偏移地址)]\n"));
KdPrint(("SSDT首地址0x%X + 0x7A * 4= 0x%X  這個地址0x%X 存儲著索引號為0x7A 的NtOpenProcess內存地址\n\n", t_addr, SSDT_Adr, SSDT_Adr));
SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;                       
KdPrint(("[讀取0x%X 得到NtOpenProcess 函數現在的內存地址] 現在的NtOpenProcess 內存地址為0x%X \n\n",SSDT_Adr, SSDT_NtOpenProcess_Cur_Addr));
KdPrint(("********************** 計算完畢***************************\n\n"));
// 匯編
/*
__asm
{    int 3
push ebx
push eax
  mov ebx,KeServiceDescriptorTable
  mov ebx,[ebx] //表的基地址 取 KeServiceDescriptorTable 的地址  t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
  mov eax,0x7a
  shl eax,2//0x7A*4 //imul eax,eax,4//shl eax,2
  add ebx,eax//[KeServiceDescriptorTable]+0x7A*4
  mov ebx,[ebx] // SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;    // 取出該地址中存儲的NtOpenProcess 函數的地址      
        mov SSDT_NtOpenProcess_Cur_Addr,ebx
pop  eax
pop  ebx
}
*/
return SSDT_NtOpenProcess_Cur_Addr;                              // 將獲得的地址返回
}
ULONG GetNt_OldAddr()
{
     UNICODE_STRING Old_NtOpenProcess;
    ULONG Old_Addr;
     KdPrint(("********************** 計算原來的地址**********************\n\n"));
     RtlInitUnicodeString(&Old_NtOpenProcess,L"NtOpenProcess");
     Old_Addr=(ULONG)MmGetSystemRoutineAddress(&Old_NtOpenProcess);//取得NtOpenProcess的地址
     KdPrint(("用MmGetSystemRoutineAddress 取得原來NtOpenProcess 的地址為0x%X\n\n",Old_Addr));
     KdPrint(("********************** 計算完畢****************************\n\n"));
     return Old_Addr;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B) //TYPEDEF LONG NTSTATUS
{  
     ULONG cur,old;
     cur=GetNt_CurAddr();// 得到現在的NtAPI 地址
     old=GetNt_OldAddr();// 得到原來的NtAPI 地址
     if (cur!=old)
         KdPrint(("NtOpenProcess被HOOK了"));
     else
         KdPrint(("NtOpenProcess 沒有被HOOK"));


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久黄视频 | 欧产日产国产精品视频 | 欧美一区二区视频 | 欧美视频在线观看 | 国产精品久久久久久久 | 国产精品视频免费看 | 欧美11一13sex性hd| 亚洲国产高清在线观看 | 国产黄色大片在线免费观看 | 国产欧美日韩在线播放 | 精品一区二区电影 | 人人看人人爽 | 久久av一区二区三区 | www.4虎影院 国产999精品久久久影片官网 | 成人性视频免费网站 | 欧美在线视频网 | 亚洲综合伊人 | 91久久久久久久久久久久久 | 国产高清在线精品 | 97在线播放 | 日日天天 | 久久精品视频亚洲 | 国产精品一二三区 | 男女又爽又黄视频 | av一区二区三区 | 久久久精品 | 免费观看一级特黄欧美大片 | 亚洲视频中文字幕 | 伊人网综合在线 | 狠狠热视频| 亚洲国产一区二区视频 | 亚洲欧洲精品在线 | 国产精品久久久久久妇女 | 午夜日韩精品 | 欧美国产视频 | 欧美三区 | 欧美国产日韩精品 | av免费成人| 中文字幕第十页 | 欧美成人一区二免费视频软件 | 五月婷婷色 |