从TCP设备对象读取

时间:2017-10-02 01:36:31

标签: c winapi tcp driver

我试图打开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;
}

但状态返回-1073741790,问题是为什么这不起作用?我在非管理员帐户上从usermode运行此命令。据我了解,只要我将ACCESS_MASK设置为FILE_READ_DATA,此操作就不需要管理员权限。

注意

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

那么问题是什么?

1 个答案:

答案 0 :(得分:1)

\ 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'

如果您不是 SYSTEM Administrators 哟只有FILE_READ_ATTRIBUTES|FILE_EXECUTE|SYNCHRONIZE|READ_CONTROL或此组合声明为FILE_GENERIC_EXECUTE WDM.H 。所以你没有FILE_READ_DATA访问权限,当你要求c00000022时必须FILE_READ_DATA

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

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