pshe->pbFormat, psc->adParameters, psc->dParameters)) { SpyWriteNumber (psp, 0,(psp->sh.dC。3 《Undocumented Windows 2000 Secrets》翻譯 --- 第五章( 四 )。" />

日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

3 《Undocumented Windows 2000 Secrets》翻譯 --- 第五章( 四 )


{
LARGE_INTEGER liTime;
PSPY_PROTOCOL psp = &gpDeviceContext->SpyProtocol;
KeQuerySystemTime (&liTime);
SpyHookWait ();
if (SpyWriteFilter (psp, psc->pshe->pbFormat,
psc->adParameters,
psc->dParameters))
{
SpyWriteNumber (psp, 0,(psp->sh.dCalls)); // <#>:
SpyWriteChar (psp, 0, ":");
// =
SpyWriteFormat (psp, psc->pshe->pbFormat, //
psc->adParameters); // ()
SpyWriteLarge (psp, 0, &liTime); // ,
SpyWriteChar (psp, 0, ",");
SpyWriteNumber (psp, 0, (DWord) psc->hThread); // ,
SpyWriteChar (psp, 0, ",");
SpyWriteNumber (psp, 0, psp->sh.dHandles); //
SpyWriteChar (psp, 0, "n");
}
SpyHookRelease ();
return;
}
列表 5-7. 主要的 Hook 協(xié)議函數(shù) SpyHookProtocol()
如果你比較一下 列表 5-7 給出的 SpyHookProtocol() 函數(shù)的主要部分和 示列 5-2 給出的協(xié)議項的一般格式,將很容易找出那個語句生成了協(xié)議項中的哪一個域( fIEld ) 。這樣一來一切就很清楚了為什么 列表 5-6 中的協(xié)議字符串沒有說明整個數(shù)據(jù)項 --- 有些獨立于功能的數(shù)據(jù)將由 SpyHookProtocol() 添加,而這將不需要格式字符串的幫助 。SpyHookProtocl() 的核心調(diào)用是 SpyWriteFormat() ,該函數(shù)生成 =[] 部分,這依賴于與要記錄的當前 API 函數(shù)相關的格式字符串 。請參考位于隨書光盤的 srcw2k_spy 目錄下的源文件 w2k_spy.c 和 w2k_spy.h ,以獲取 Spy 設備驅(qū)動程序中使用的 SpyWrite*() 函數(shù)的更多實現(xiàn)信息 。
請注意,這些代碼稍微有些危險 。這些代碼編寫與 1997 年是針對 Windows NT 4.0 的 。在移植到 Windows 2000 之后,當 hook 工作一段較長時間后會偶爾引發(fā)藍屏 。更糟糕的是,有些特殊的操作將立即引發(fā)藍屏,例如,在 My Favoriter 文本編輯器的 FileOpen 對話框中打開我的電腦時 。在分析過多過 crash dump 后,我發(fā)現(xiàn)是由于將 NULL 指針傳遞給了某些函數(shù)從而導致了系統(tǒng)崩潰 。一但 Spy 設備試圖使用這些指針中的某個來記錄該指針引用的數(shù)據(jù)時,系統(tǒng)就會崩潰 。典型的就是,指向 IO_STATUS_BLOCK 結(jié)構(gòu)的指針,在 UNICODE_STRING 和 OBJECT_ATTRIBUTES 結(jié)構(gòu)中存在無效的字符串指針 。我還發(fā)現(xiàn)某些有 Buffer 成員的 UNICODE_STRING 結(jié)構(gòu)沒有結(jié)束符 。因此,我再次強調(diào)你不應該假定所有的 UNICODE_STRING 結(jié)構(gòu)都以結(jié)束 。在不能確定時,請使用 Length 成員,它總能正確地告訴你在 Buffer 中存放的有效的字節(jié)數(shù) 。
【3 《Undocumented Windows 2000 Secrets》翻譯 --- 第五章】為了修正這一問題,我為所有使用客戶指針的日志函數(shù)增加了指針有效性檢查 。在結(jié)束時,我使用第四章討論過的 SpyMemoryTestAddress() 函數(shù)來檢驗一個線性地址指針是否指向一個有效的頁表項( PTE ) 。更詳細的信息請參考 列表 4-22 和 列表 4-24。另一種可能的替代方案是使用結(jié)構(gòu)化異常( __try/__except ) 。

推薦閱讀