阅读:3149回复:14
HOOK ZwQueryDirectoryFile问题,给分我用 HOOK ZwQueryDirectoryFile来实现隐藏文件夹 如:隐藏文件夹test,所有卷下的test文件夹都被隐藏,我想实现指定:如 d:\test隐藏,处理盘符呢? 另外: 什么内核函数可对注册表进行读写? |
|
沙发#
发布于:2004-12-23 13:41
试试Hook系统服务函数,可以参考RegMon; 也可以参考filemon,采用过滤驱动来直接过滤IRP_MJ_Query_INFORMATION; 再就是多找找相关的帖子,有很多人讨论过的。 |
|
|
板凳#
发布于:2004-12-23 14:07
采用过滤驱动是处理 IRP_MJ_DIRECTORY_CONTRONL 吧?
|
|
地板#
发布于:2004-12-23 14:56
我是用HOOK NATIVE API ZwQueryDirectoryFile来实现隐藏文件夹的。
我用dbgprint出的 filename (ansi)不包括路径,而从注册表读入驱动的包括路径如 d:\test\test1 我该如何和ZwQueryDirectoryFile返回的 filename 进行比对呢? 我是新手,以前的帖子好象没有说明! |
|
地下室#
发布于:2004-12-23 18:23
郁闷。。。
|
|
5楼#
发布于:2004-12-23 19:53
使用ZwQueryDirectoryFile隐藏文件或文件夹最好不要使用盘符,因为在Win2k中,盘符是很有可能改变的,最好是通过卷序列号或设备名结合文件名来判断,这样一般是很准确的
|
|
6楼#
发布于:2004-12-23 21:12
能说具体点吗?
比如我设定隐藏“d:\test” 可存于注册表 驱动从注册表读取该值,然后和执行 ZwQueryDirectoryFile 返回的 filename 进行比较,如何判断filename中的 卷序列号或设备名 呢? 若不包含盘符是这样: if( RtlCompareMemory( ansiFileName.Buffer, aFilehide,strlen(aFilehide) ) == strlen(aFilehide)) ansiFileName为返回的 filename 的ansi名 |
|
7楼#
发布于:2004-12-24 17:29
对ZwQueryDirectoryFile参数中的HANDLE就是要查询的目录句柄,你可以使用ZwQueryObject得到其对应的名称,就是设备名+目录名;应用层在注册表中保存设备名+目录名,这样就可以比较了
|
|
8楼#
发布于:2004-12-24 18:29
ZwQueryObject ? 我在ddk里找不到这个函数,能提供一段示例代码 ? 我还象过圣诞呢? :D |
|
9楼#
发布于:2004-12-24 19:37
NTSYSAPI
NTSTATUS NTAPI ZwQueryObject( IN HANDLE ObjectHandle, IN OBJECT_INFORMATION_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLen, OUT PULONG ReturnLenght OPTIONAL); 推荐你看一下《Windows NT/2000本机API参考手册》,里面说得很详细的 [编辑 - 12/24/04 by aethercat] [编辑 - 12/24/04 by aethercat] |
|
10楼#
发布于:2004-12-24 21:52
多谢!
网上找了很多,都需要银子。 有这本书的 电子版 吗? lhzh114@yahoo.com.cn Merry Christmas To you ! |
|
11楼#
发布于:2004-12-27 10:47
在我的代码中加入ZwQueryObject后,
OBJECT_INFORMATION_CLASS ObjectInformationClass 这个又出了问题,能提供一份使用的相关代码吗?很急啊!拜托 |
|
12楼#
发布于:2004-12-30 17:54
对ZwQueryDirectoryFile参数中的HANDLE就是要查询的目录句柄,你可以使用ZwQueryObject得到其对应的名称,就是设备名+目录名;应用层在注册表中保存设备名+目录名,这样就可以比较了
============================================================ //我用ObQueryNameString 获得设备和目录 if NT_SUCCESS(rc) { status = ObReferenceObjectByHandle(hFile,0,NULL,KernelMode,(PVOID*)&pFileObject,NULL); if (!NT_SUCCESS(status)) { return status; } pFullPath = (UNICODE_STRING *)ExAllocatePool(PagedPool,1024); RtlZeroMemory(pFullPath,1024); pFullPath->MaximumLength = 1024; status = ObQueryNameString(pFileObject,pFullPath,1024,&reallength); if (!NT_SUCCESS(status)) { ExFreePool(pFullPath); ObDereferenceObject(pFileObject); return status; } DbgPrint(("query full dir = %wsn",pFullPath->Buffer)); // WCHAR udir[] = L"\Device\HarddiskVolume1\test"; if( RtlCompareMemory(pFullPath->Buffer, udir,strlen(udir) ) == strlen(udir)) { rc = 0x80000006; } 盘符下目录都隐藏了 ,为什么呢? 请指点! |
|
13楼#
发布于:2005-01-19 16:57
关注中。。。
|
|
|
14楼#
发布于:2005-06-03 16:38
ericlau:您好!
看了您04-12月末的文章,您能对我们6月3日在过滤器版及内核版关于使用IoVolumeDeviceToDosName或RtlVolumeDeviceToDosName例程取得盘符造成死机与蓝屏的问题给我们一些信息吗? 谢谢! |
|
|