从 TCP 设备对象读取

Reading from TCP device object

我正在尝试打开 TCP 对象设备驱动程序的句柄。

这是我的代码:

NTSTATUS OpenTcpDeviceObject(PHANDLE tcpFile, ACCESS_MASK DesiredAccess) {
    UNICODE_STRING fileName;
    OBJECT_ATTRIBUTES objectAttributes;
    IO_STATUS_BLOCK IOBlock;

    RtlInitUnicodeString(&fileName, TEXT("\Device\Tcp"));

    InitializeObjectAttributes(
        &objectAttributes, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL);

    NTSTATUS Status = NtOpenFile(
        tcpFile, DesiredAccess | SYNCHRONIZE, &objectAttributes, &IOBlock,
        FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);

    if (!NT_SUCCESS(Status))
        *tcpFile = INVALID_HANDLE_VALUE;
    return Status;
}

但是状态 returns -1073741790,问题是为什么这不起作用?我正在 运行 从用户模式使用非管理员帐户执行此操作。据我了解,此操作不需要管理员权限,只要我将 ACCESS_MASK 设置为 FILE_READ_DATA

注意

返回的 Status 指向 ERROR_ACCESS_DENIED (5) 作为 Dos 错误。但是,如果我只请求读取权限,怎么会拒绝访问呢?但是,当我 运行 GetAdaptersAddresses 访问 Tcp 设备对象时,它允许我在没有权限的情况下访问 multicast/unicast 地址!

那么问题是什么?

\Device\Tcp有下一个DACL

T FL AcessMsK Sid
A 00 001200A0 S-1-1-0 'Everyone'
A 00 001F01FF S-1-5-18 'SYSTEM'
A 00 001F01FF S-1-5-32-544 'Administrators'
A 00 001200A0 S-1-5-12 'RESTRICTED'

如果你没有SYSTEMAdministrators你只有FILE_READ_ATTRIBUTES|FILE_EXECUTE|SYNCHRONIZE|READ_CONTROL或这个组合在 wdm.h 中声明为 FILE_GENERIC_EXECUTE。所以你没有 FILE_READ_DATA 访问权限,当你请求 FILE_READ_DATA

时必须得到 c00000022

关于 GetAdaptersAddresses - 它不能用 FILE_READ_DATA 打开 tcp 设备。他只问 FILE_READ_ATTRIBUTES|SYNCHRONIZE。你永远不会在 tcp 设备上调用 ZwReadFile。我们通过 ZwDeviceIoControlFile 从中获取信息。所需的访问权限在每个 IOCTL 代码和大多数 IOCTL 代码中编码为 FILE_ANY_ACCESS - 这意味着文件句柄 any 访问正常。例如 IOCTL_TCP_QUERY_INFORMATION_EX 定义为 CTL_CODE(FILE_DEVICE_NETWORK, METHOD_NEITHER, FILE_ANY_ACCESS) - 因此您不需要读取文件的数据访问权限。仅使用 SYNCHRONIZE 访问权限打开文件 - 这就足够了。

并且注意 GetAdaptersAddresses 在最新的 windows 版本上使用 \Device\Nsi