ZwQueryDirectoryFile 缓冲区溢出
ZwQueryDirectoryFile Buffer Overflow
我正在尝试编写 Windows 驱动程序代码来扫描目录中的文件名:
HANDLE directory_handle;
FILE_BOTH_DIR_INFORMATION directory_information;
IO_STATUS_BLOCK io_status_block;
NTSTATUS status;
OBJECT_ATTRIBUTES directory_attributes;
InitializeObjectAttributes(&directory_attributes ,
&directory_name ,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
0 ,
0 );
status = ZwCreateFile(&directory_handle ,
FILE_LIST_DIRECTORY | SYNCHRONIZE ,
&directory_attributes ,
&io_status_block ,
0 ,
0 ,
FILE_SHARE_VALID_FLAGS ,
FILE_OPEN ,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE,
0 ,
0 );
status = ZwQueryDirectoryFile(directory_handle ,
NULL ,
0 ,
0 ,
&io_status_block ,
&directory_information ,
sizeof(directory_information),
FileBothDirectoryInformation ,
TRUE ,
NULL ,
FALSE );
status = ZwQueryDirectoryFile(directory_handle ,
NULL ,
0 ,
0 ,
&io_status_block ,
&directory_information ,
sizeof(directory_information),
FileBothDirectoryInformation ,
TRUE ,
NULL ,
FALSE );
第一次调用ZwQueryDirectoryFile()
returns一个STATUS_SUCCESS
(0x00000000
)的结果,但是第二次调用returns一个状态STATUS_BUFFER_OVERFLOW
(0x80000005
)。您知道什么可能导致此缓冲区溢出错误吗?
谢谢。
FILE_ID_BOTH_DIR_INFORMATION
是变长结构。
您将需要分配足够的 space 来接收结构末尾的路径字符串。
您需要将分配的缓冲区的大小传递给 ZwQueryDirectoryFile
而不是 sizeof(FILE_ID_BOTH_DIR_INFORMATION)
不知道为什么第一个有效。
STATUS_BUFFER_OVERFLOW 表示缓冲区不够大 return 完整文件名(但是我们知道缓冲区至少对于基本结构足够大,否则 STATUS_BUFFER_TOO_SMALL ).
这里发生的是第一个调用成功 return编辑了“.”条目(因为在基本结构中有用于单个字符文件名的空间),但第二次调用失败并显示 STATUS_BUFFER_OVERFLOW 因为缓冲区不够大,无法容纳“..”条目。
我正在尝试编写 Windows 驱动程序代码来扫描目录中的文件名:
HANDLE directory_handle;
FILE_BOTH_DIR_INFORMATION directory_information;
IO_STATUS_BLOCK io_status_block;
NTSTATUS status;
OBJECT_ATTRIBUTES directory_attributes;
InitializeObjectAttributes(&directory_attributes ,
&directory_name ,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
0 ,
0 );
status = ZwCreateFile(&directory_handle ,
FILE_LIST_DIRECTORY | SYNCHRONIZE ,
&directory_attributes ,
&io_status_block ,
0 ,
0 ,
FILE_SHARE_VALID_FLAGS ,
FILE_OPEN ,
FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE,
0 ,
0 );
status = ZwQueryDirectoryFile(directory_handle ,
NULL ,
0 ,
0 ,
&io_status_block ,
&directory_information ,
sizeof(directory_information),
FileBothDirectoryInformation ,
TRUE ,
NULL ,
FALSE );
status = ZwQueryDirectoryFile(directory_handle ,
NULL ,
0 ,
0 ,
&io_status_block ,
&directory_information ,
sizeof(directory_information),
FileBothDirectoryInformation ,
TRUE ,
NULL ,
FALSE );
第一次调用ZwQueryDirectoryFile()
returns一个STATUS_SUCCESS
(0x00000000
)的结果,但是第二次调用returns一个状态STATUS_BUFFER_OVERFLOW
(0x80000005
)。您知道什么可能导致此缓冲区溢出错误吗?
谢谢。
FILE_ID_BOTH_DIR_INFORMATION
是变长结构。
您将需要分配足够的 space 来接收结构末尾的路径字符串。
您需要将分配的缓冲区的大小传递给 ZwQueryDirectoryFile
而不是 sizeof(FILE_ID_BOTH_DIR_INFORMATION)
不知道为什么第一个有效。
STATUS_BUFFER_OVERFLOW 表示缓冲区不够大 return 完整文件名(但是我们知道缓冲区至少对于基本结构足够大,否则 STATUS_BUFFER_TOO_SMALL ).
这里发生的是第一个调用成功 return编辑了“.”条目(因为在基本结构中有用于单个字符文件名的空间),但第二次调用失败并显示 STATUS_BUFFER_OVERFLOW 因为缓冲区不够大,无法容纳“..”条目。