[英]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'
如果你没有SYSTEM
或Administrators
哟只有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.