我试图打开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时,它允许我在没有权限的情况下访问多播/单播地址!
那么问题是什么?
答案 0 :(得分:1)
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