Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

SMB2/Notify

Opcode 0x0f

此 SMB2 命令用于在特定文件或目录上设置通知监视。它可用于“监视”文件/目录本身或任何子目录的变化。

当用于设置 Notification 监视时,服务器会立即以 STATUS_PENDING(以及监视进程的 process id)响应,以指示该监视已激活。与所有返回 STATUS_PENDING 的 async 命令一样,此回复的 header 中也会将 P bit 设置为 1。

一旦被监视的项目发生更改,服务器会向客户端发送第二个响应,这次使用状态码 STATUS_NOTIFY_ENUM_DIR,并携带一些关于具体发生了哪些更改的信息。此 async 回复的 header 中会将 P bit 设置为 1,并且还会在 header 中指定与初始 STATUS_PENDING 回复相同的 PID 值。

如果客户端想取消一个活动监视,可以使用 SMB2/Cancel 命令,并将 Command Sequence Number 指定为 0,同时指定与其想要取消的 Notify 相同的 Process ID。客户端还必须在 header 中设置 P bit,以指示 PID 字段有效。随后,服务器会通过向该 notify 发送状态为 STATUS_CANCELLED、PID 与初始回复相同且 P bit 设置为 1 的响应,来确认该 Notify 已被取消。

SMB2/Notify Request

SMB2/Notify Request Packet Format

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Buffer Code | :T| |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| |+-+-+-+-+ +-+-+-+-+| FID |+-+-+-+-+ +-+-+-+-+| |+-+-+-+-+ +-+-+-+-+| |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| CompletionMask |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| BUG |+-+-+-+-+-+-+-+-+

T

此 bit 表示我们是否要监视整个树。

0: watch only this directory1: watch this directory and all subdirectories

FID

用于放置通知的目录的 SMB2/FID Identifier。

CompletionMask

SMB2/CompletionMask 是一个 bitmask,用于控制我们希望收到哪类更改的通知。

SMB2/Notify Response

SMB2/Notify Response Packet Format

If STATUS_PENDING+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Buffer Code | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| BUG |+-+-+-+-+-+-+-+-+If STATUS_CANCELLED+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Buffer Code | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| BUG |+-+-+-+-+-+-+-+-+If status STATUS_NOTIFY_ENUM_DIR+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Buffer Code | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Buffer Code

SMB2/BufferCode

BUG

此尾随的单个字节始终与请求中相同位置的字节(FID 的 byte #1)具有相同的值。这显然是 Vista 中的一个 bug,即

  • 它在复用 buffer 前没有清空 buffer
  • 对于这些状态码,它多发回了一个字节

NT Status Codes

讨论

CompletionMask 字段目前只是猜测。T bit 也是猜测。

这里也可能存在 Maximum amount of returned data(bytes 4-7),或者我一直觉得 SMB Notify 中缺失的内容:要监视的 subtree levels 最大数量。

导入自 https://wiki.wireshark.org/SMB2/Notify,时间为 2020-08-11 23:25:12 UTC

相关 Wireshark Wiki 页面

网络分析技术档案