从 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;
}
但是状态 returns -1073741790
,问题是为什么这不起作用?我正在 运行 从用户模式使用非管理员帐户执行此操作。据我了解,此操作不需要管理员权限,只要我将 ACCESS_MASK
设置为 FILE_READ_DATA
。
注意
返回的 Status
指向 ERROR_ACCESS_DENIED (5)
作为 Dos 错误。但是,如果我只请求读取权限,怎么会拒绝访问呢?但是,当我 运行 GetAdaptersAddresses 访问 Tcp 设备对象时,它允许我在没有权限的情况下访问 multicast/unicast 地址!
那么问题是什么?
\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
或这个组合在 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
我正在尝试打开 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;
}
但是状态 returns -1073741790
,问题是为什么这不起作用?我正在 运行 从用户模式使用非管理员帐户执行此操作。据我了解,此操作不需要管理员权限,只要我将 ACCESS_MASK
设置为 FILE_READ_DATA
。
注意
返回的 Status
指向 ERROR_ACCESS_DENIED (5)
作为 Dos 错误。但是,如果我只请求读取权限,怎么会拒绝访问呢?但是,当我 运行 GetAdaptersAddresses 访问 Tcp 设备对象时,它允许我在没有权限的情况下访问 multicast/unicast 地址!
那么问题是什么?
\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
或这个组合在 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