{
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 协议函数 SpyHookProtocol()
如果你比较一下 列表 5-7 给出的 SpyHookProtocol() 函数的主要部分和 示列 5-2 给出的协议项的一般格式,将很容易找出那个语句生成了协议项中的哪一个域( fIEld ) 。这样一来一切就很清楚了为什么 列表 5-6 中的协议字符串没有说明整个数据项 --- 有些独立于功能的数据将由 SpyHookProtocol() 添加,而这将不需要格式字符串的帮助 。SpyHookProtocl() 的核心调用是 SpyWriteFormat() ,该函数生成 =
请注意,这些代码稍微有些危险 。这些代码编写与 1997 年是针对 Windows NT 4.0 的 。在移植到 Windows 2000 之后,当 hook 工作一段较长时间后会偶尔引发蓝屏 。更糟糕的是,有些特殊的操作将立即引发蓝屏,例如,在 My Favoriter 文本编辑器的 FileOpen 对话框中打开我的电脑时 。在分析过多过 crash dump 后,我发现是由于将 NULL 指针传递给了某些函数从而导致了系统崩溃 。一但 Spy 设备试图使用这些指针中的某个来记录该指针引用的数据时,系统就会崩溃 。典型的就是,指向 IO_STATUS_BLOCK 结构的指针,在 UNICODE_STRING 和 OBJECT_ATTRIBUTES 结构中存在无效的字符串指针 。我还发现某些有 Buffer 成员的 UNICODE_STRING 结构没有结束符 。因此,我再次强调你不应该假定所有的 UNICODE_STRING 结构都以结束 。在不能确定时,请使用 Length 成员,它总能正确地告诉你在 Buffer 中存放的有效的字节数 。
【3 《Undocumented Windows 2000 Secrets》翻译 --- 第五章】为了修正这一问题,我为所有使用客户指针的日志函数增加了指针有效性检查 。在结束时,我使用第四章讨论过的 SpyMemoryTestAddress() 函数来检验一个线性地址指针是否指向一个有效的页表项( PTE ) 。更详细的信息请参考 列表 4-22 和 列表 4-24。另一种可能的替代方案是使用结构化异常( __try/__except ) 。
推荐阅读
- 为Windows请个“系统医生”
- Windows 2000桌面也美丽
- 荒野行动送快递是什么梗
- windows 2000是怎样引导的
- 三倍工资的节日有哪些
- Windows2000下用户模式的内存扫描
- 3 《Undocumented Windows 2000 Secrets》翻译 --- 第三章
- 暗恋橘生淮南是在哪拍的
- 9 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- 奶酪陷阱大结局是什么
