示例 5-2 給出了一個協(xié)議項的一般格式 。每一項包含相同個數(shù)的域,這些域采用分隔符隔開 。這樣分隔可以使程序很容易的解析它 。這些域按照如下的一組簡單的基本規(guī)則來構(gòu)建:
l 所有的數(shù)字都已十六進(jìn)制表示,沒有 0 前綴或常見的前綴“ 0x ”
l 函數(shù)的多個參數(shù)由逗號隔開
l 字符串參數(shù)將位于一對雙引號中
l 結(jié)構(gòu)體成員的值由“ . ”符號隔開
圖 5-6. 命令 dir c: 的示列協(xié)議
"%s=NtOpenFile(% ,%n,%o,%i,%n, %n) "
18:sO=NtOpenFile( 46C.18,nl00001,o"??C:",i0.1,n3,n4021)lBFEE5AE05B6710,278,2
"%s=NtClose(%-l)"
lB:sO=NtClose(-46C.18="??C:")lBFEE5AE05B6710,278,l
示列 5-1. 比較格式化字符串和協(xié)議項
<#> : =
示列 5-2. 協(xié)議項的一般格式
l 與句柄相關(guān)的對象名稱和句柄的值采用“ = ”進(jìn)行分割 。
l 日期 / 時間的 stamp 為 1601-01-01 至今逝去的毫秒數(shù),其格式依賴 Windows 2000 的基本時間格式,精度可達(dá)到 1/10 毫秒 。
l 線程 ID 是調(diào)用 API 函數(shù)的線程的唯一數(shù)字標(biāo)識 。
l 句柄計數(shù)的狀態(tài)表示當(dāng)前注冊到 Spy 設(shè)備句柄列表中的句柄的數(shù)量 。協(xié)議函數(shù)使用該列表查找與對象名稱相關(guān)的句柄 。
圖 5-7. 命令 type c:boot.ini 的示列協(xié)議
圖 5-7 是在控制臺中執(zhí)行: type c:boot.ini 命令產(chǎn)生的 API Spy 協(xié)議結(jié)果 。下面給出日志項中的某些列的含義:
l 在 0x31 行,調(diào)用了 NtCreateFile() 來打開 ??c:boot.ini 文件 。( o”??c:boot.ini” )該函數(shù)返回的 NTSTATUS 的值為 0 ( s0 ),即 STATUS_SUCCESS ,并分配了一個新的文件句柄,其值為 0 小 8 ,該句柄屬于進(jìn)程 0x46c (46C.18 ) 。因此,句柄計數(shù)從 1 增加到 2。
l 在 0x36 行,type 命令將文件 ??c:boot.ini 的前 512 個字節(jié)( n200 )讀入位于線性地址 0x0012F5B4 處的緩沖區(qū)中,并把從 NtCreateFile() 獲取的句柄解析給 NtReadFile() 函數(shù) 。系統(tǒng)成功的返回 512 字節(jié)( io.200 ) 。
l 在 0x39 行,將處理另一塊 512 個字節(jié)的文件塊 。這一次,將到達(dá)文件的末尾,因此 NtReadFile() 僅返回了 75 個字節(jié)( io.4B ) 。顯然,我的 boot.ini 文件的大小為: 512 75=587 字節(jié) 。
l 在 0x3C 行,NtClose() 成功的釋放了指向 ??c:boot.ini 的文件句柄( -46.18=”??c:boot.ini” ),因此,句柄計數(shù)將從 2 減少為 1。
現(xiàn)在,你應(yīng)該已經(jīng)明白 Spy 協(xié)議的 API 是如何構(gòu)建的了,這會幫助你掌握協(xié)議生成機制的細(xì)節(jié),接下來我們將討論這一機制 。在前面我曾提及過,用于日志記錄的主要 API 函數(shù)是 SpyHookProtocol()。列表 5-7 給出了該函數(shù),它將使用 SPY_CALL 結(jié)構(gòu)中的數(shù)據(jù)來為每個 API 函數(shù)生成一個協(xié)議記錄并將其寫入一個環(huán)形緩沖區(qū)中,這里的 SPY_CALL 結(jié)構(gòu)由 Hook Dispatcher 傳入 。一個 Spy 設(shè)備的客戶端可以通過 IOCTL 調(diào)用來讀去這一協(xié)議 。每個記錄項都是一行文本,每行都由單個行結(jié)束符(即 C 語言中的 ”n” )表示行的結(jié)束 。通過使用內(nèi)核的 Mutext KMUTEX kmProtcol 來實現(xiàn)串行讀去協(xié)議緩沖區(qū),kmProtocol 位于 Spy 設(shè)備的全局結(jié)構(gòu) DEVICE_CONTEXT 中 。列表 5-7 中的 SpyHookWait() 和 SpyHookRelease() 函數(shù)用于請求和釋放此 Mutext 對象 。所有對協(xié)議緩沖區(qū)的訪問都必須由 SpyHookWait() 預(yù)處理并在結(jié)束時由 SpyHookRelease() 處理,SpyHookProtocol() 函數(shù)展示了這種行為 。
NTSTATUS SpyHookWait (void)
{
return MUTEX_WAIT (gpDeviceContext->kmProtocol);
}
// -----------------------------------------------------------------
LONG SpyHookRelease (void)
{
return MUTEX_RELEASE (gpDeviceContext->kmProtocol);
}
// -----------------------------------------------------------------
// <#>:=
void SpyHookProtocol (PSPY_CALL psc)
推薦閱讀
- 為Windows請個“系統(tǒng)醫(yī)生”
- Windows 2000桌面也美麗
- 荒野行動送快遞是什么梗
- windows 2000是怎樣引導(dǎo)的
- 三倍工資的節(jié)日有哪些
- Windows2000下用戶模式的內(nèi)存掃描
- 3 《Undocumented Windows 2000 Secrets》翻譯 --- 第三章
- 暗戀橘生淮南是在哪拍的
- 9 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章
- 奶酪陷阱大結(jié)局是什么
