识别服务器线程中的调用方
可以确定给定 RPC 调用的内容,即使你拥有的唯一信息是服务调用的服务器线程。
这非常有用 -- 例如,找出谁向 RPC 调用传递了无效参数。
根据此特定调用使用的协议序列,可以获取不同程度的详细信息。 某些协议 ((例如 NetBios) )根本没有此信息。
从服务器线程标识调用方
启动以服务器线程为目标的用户模式调试器。
使用 | (进程状态) 命令获取进程 ID:
0:001> | 0 id: 3d4 name: rtsvr.exe
使用 !rpcexts.getcallinfo 扩展获取此进程中的活动调用。 (有关语法的说明,请参阅参考页。) 需要提供0x3D4的进程 ID:
0:001> !rpcexts.getcallinfo 0 0 FFFF 3d4 Searching for call info ... PID CELL ID ST PNO IFSTART THRDCELL CALLFLAG CALLID LASTTIME CONN/CLN ---------------------------------------------------------------------------- 03d4 0000.0004 02 000 19bb5061 0000.0002 00000001 00000001 00a1aced 0000.0003
查找状态为 02 或 01 的呼叫 (已调度或活动) 。 在此示例中,进程只有一个调用。 如果有更多,则必须将 !rpcexts.getdbgcell 扩展与 THRDCELL 列中的单元格号一起使用。 这将允许你检查线程 ID,以便确定你感兴趣的调用。
知道你感兴趣的呼叫后,请查看 CONN/CLN 列中的单元格编号。 这是连接对象的单元格 ID。 在本例中,单元格编号为 0000.0003。 将此单元格号和进程 ID 传递给 !rpcexts.getdbgcell:
0:001> !rpcexts.getdbgcell 3d4 0.3 Getting cell info ... Connection Connection flags: Exclusive Authentication Level: Default Authentication Service: None Last Transmit Fragment Size: 24 (0x6F56D) Endpoint for the connection: 0x0.1 Last send time (in seconds since boot):10595.565 (0x2963.235) Last receive time (in seconds since boot):10595.565 (0x2963.235) Getting endpoint info ... Process object for caller is 0xFF9DF5F0
此扩展将显示有关此连接的客户端的所有信息。 实际信息的数量会有所不同,具体取决于所使用的传输。
在此示例中,本地命名管道用作传输,并显示调用方的进程对象地址。 如果附加内核调试器 (或启动本地内核调试器) ,则可以使用 !process 扩展来解释此进程地址。
如果使用 LRPC 作为传输,则会显示调用方的进程 ID 和线程 ID。
如果将 TCP 用作传输,则会显示调用方 IP 地址。
如果将远程命名管道用作传输,则不会提供任何信息。
注意 前面的示例演示了如果知道服务器线程,如何查找客户端线程。 有关反向技术的示例,请参阅 分析卡住呼叫问题。