示例 5-2 给出了一个协议项的一般格式 。每一项包含相同个数的域,这些域采用分隔符隔开 。这样分隔可以使程序很容易的解析它 。这些域按照如下的一组简单的基本规则来构建:
l 所有的数字都已十六进制表示,没有 0 前缀或常见的前缀“ 0x ”
l 函数的多个参数由逗号隔开
l 字符串参数将位于一对双引号中
l 结构体成员的值由“ . ”符号隔开
图 5-6. 命令 dir c: 的示列协议
"%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. 比较格式化字符串和协议项
<#> : =
示列 5-2. 协议项的一般格式
l 与句柄相关的对象名称和句柄的值采用“ = ”进行分割 。
l 日期 / 时间的 stamp 为 1601-01-01 至今逝去的毫秒数,其格式依赖 Windows 2000 的基本时间格式,精度可达到 1/10 毫秒 。
l 线程 ID 是调用 API 函数的线程的唯一数字标识 。
l 句柄计数的状态表示当前注册到 Spy 设备句柄列表中的句柄的数量 。协议函数使用该列表查找与对象名称相关的句柄 。
图 5-7. 命令 type c:boot.ini 的示列协议
图 5-7 是在控制台中执行: type c:boot.ini 命令产生的 API Spy 协议结果 。下面给出日志项中的某些列的含义:
l 在 0x31 行,调用了 NtCreateFile() 来打开 ??c:boot.ini 文件 。( o”??c:boot.ini” )该函数返回的 NTSTATUS 的值为 0 ( s0 ),即 STATUS_SUCCESS ,并分配了一个新的文件句柄,其值为 0 小 8 ,该句柄属于进程 0x46c (46C.18 ) 。因此,句柄计数从 1 增加到 2。
l 在 0x36 行,type 命令将文件 ??c:boot.ini 的前 512 个字节( n200 )读入位于线性地址 0x0012F5B4 处的缓冲区中,并把从 NtCreateFile() 获取的句柄解析给 NtReadFile() 函数 。系统成功的返回 512 字节( io.200 ) 。
l 在 0x39 行,将处理另一块 512 个字节的文件块 。这一次,将到达文件的末尾,因此 NtReadFile() 仅返回了 75 个字节( io.4B ) 。显然,我的 boot.ini 文件的大小为: 512 75=587 字节 。
l 在 0x3C 行,NtClose() 成功的释放了指向 ??c:boot.ini 的文件句柄( -46.18=”??c:boot.ini” ),因此,句柄计数将从 2 减少为 1。
现在,你应该已经明白 Spy 协议的 API 是如何构建的了,这会帮助你掌握协议生成机制的细节,接下来我们将讨论这一机制 。在前面我曾提及过,用于日志记录的主要 API 函数是 SpyHookProtocol()。列表 5-7 给出了该函数,它将使用 SPY_CALL 结构中的数据来为每个 API 函数生成一个协议记录并将其写入一个环形缓冲区中,这里的 SPY_CALL 结构由 Hook Dispatcher 传入 。一个 Spy 设备的客户端可以通过 IOCTL 调用来读去这一协议 。每个记录项都是一行文本,每行都由单个行结束符(即 C 语言中的 ”n” )表示行的结束 。通过使用内核的 Mutext KMUTEX kmProtcol 来实现串行读去协议缓冲区,kmProtocol 位于 Spy 设备的全局结构 DEVICE_CONTEXT 中 。列表 5-7 中的 SpyHookWait() 和 SpyHookRelease() 函数用于请求和释放此 Mutext 对象 。所有对协议缓冲区的访问都必须由 SpyHookWait() 预处理并在结束时由 SpyHookRelease() 处理,SpyHookProtocol() 函数展示了这种行为 。
NTSTATUS SpyHookWait (void)
{
return MUTEX_WAIT (gpDeviceContext->kmProtocol);
}
// -----------------------------------------------------------------
LONG SpyHookRelease (void)
{
return MUTEX_RELEASE (gpDeviceContext->kmProtocol);
}
// -----------------------------------------------------------------
// <#>:=
void SpyHookProtocol (PSPY_CALL psc)
推荐阅读
- 为Windows请个“系统医生”
- Windows 2000桌面也美丽
- 荒野行动送快递是什么梗
- windows 2000是怎样引导的
- 三倍工资的节日有哪些
- Windows2000下用户模式的内存扫描
- 3 《Undocumented Windows 2000 Secrets》翻译 --- 第三章
- 暗恋橘生淮南是在哪拍的
- 9 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
- 奶酪陷阱大结局是什么
