【问题标题】:Reading from TCP device object从 TCP 设备对象读取
【发布时间】:2017-10-02 01:36:30
【问题描述】:

我正在尝试打开 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,问题是为什么这不起作用?我在非管理员帐户上从用户模式运行它。据我了解,只要我将ACCESS_MASK 设置为FILE_READ_DATA,此操作不需要管理员权限。

注意

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

那么问题出在哪里?

【问题讨论】:

  • @HarryJohnston 你是什么意思? SYNCHRONIZE 通常包含在 FILE_READ_DATA 中 - 为什么会出现问题?
  • AFAIK 没有规定,如果您被授予 SYNCHRONIZE,则必须授予您 SYNCHRONIZE,以便 可能 成为问题。事实证明它不是,但它可能是。 :-)

标签: c winapi tcp driver


【解决方案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'

如果您不是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 2016-10-28
    • 2013-11-24
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2013-08-21
    相关资源
    最近更新 更多