繁体   English   中英

从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;
}

但是Status返回-1073741790 ,问题是为什么这不起作用? 我正在以非管理员帐户从用户模式运行此文件。 据我了解,只要我将ACCESS_MASK设置为FILE_READ_DATA ,此操作就不需要管理员权限。

注意

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

那是什么问题呢?

\\ 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或该组合声明为FILE_GENERIC_EXECUTE WDM.H中 因此您没有FILE_READ_DATA访问权限,并且在要求FILE_READ_DATA时必须获得c00000022

关于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM