ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:3149回复:14

HOOK ZwQueryDirectoryFile问题,给分

楼主#
更多 发布于:2004-12-23 12:29

我用 HOOK ZwQueryDirectoryFile来实现隐藏文件夹
如:隐藏文件夹test,所有卷下的test文件夹都被隐藏,我想实现指定:如 d:\test隐藏,处理盘符呢?

另外:
什么内核函数可对注册表进行读写?
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-23 13:41

我用 HOOK ZwQueryDirectoryFile来实现隐藏文件夹
如:隐藏文件夹test,所有卷下的test文件夹都被隐藏,我想实现指定:如 d:test隐藏,处理盘符呢?

试试Hook系统服务函数,可以参考RegMon;
也可以参考filemon,采用过滤驱动来直接过滤IRP_MJ_Query_INFORMATION;
再就是多找找相关的帖子,有很多人讨论过的。
在交流中学习。。。
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-23 14:07
采用过滤驱动是处理 IRP_MJ_DIRECTORY_CONTRONL 吧?
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-23 14:56
我是用HOOK NATIVE API  ZwQueryDirectoryFile来实现隐藏文件夹的。
我用dbgprint出的 filename (ansi)不包括路径,而从注册表读入驱动的包括路径如 d:\test\test1

我该如何和ZwQueryDirectoryFile返回的 filename 进行比对呢?

我是新手,以前的帖子好象没有说明!
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-23 18:23
郁闷。。。
aethercat
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2005-06-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-23 19:53
使用ZwQueryDirectoryFile隐藏文件或文件夹最好不要使用盘符,因为在Win2k中,盘符是很有可能改变的,最好是通过卷序列号或设备名结合文件名来判断,这样一般是很准确的
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-23 21:12
能说具体点吗?
比如我设定隐藏“d:\test” 可存于注册表

驱动从注册表读取该值,然后和执行 ZwQueryDirectoryFile 返回的 filename 进行比较,如何判断filename中的 卷序列号或设备名 呢?

若不包含盘符是这样:

 if( RtlCompareMemory( ansiFileName.Buffer, aFilehide,strlen(aFilehide) ) == strlen(aFilehide))
ansiFileName为返回的 filename 的ansi名
aethercat
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2005-06-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-24 17:29
对ZwQueryDirectoryFile参数中的HANDLE就是要查询的目录句柄,你可以使用ZwQueryObject得到其对应的名称,就是设备名+目录名;应用层在注册表中保存设备名+目录名,这样就可以比较了
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-24 18:29

ZwQueryObject  ?
我在ddk里找不到这个函数,能提供一段示例代码 ?

我还象过圣诞呢? :D
aethercat
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2005-06-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-24 21:52
多谢!
 网上找了很多,都需要银子。
 有这本书的 电子版 吗?
 lhzh114@yahoo.com.cn

 Merry Christmas To you !
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-27 10:47
在我的代码中加入ZwQueryObject后,
OBJECT_INFORMATION_CLASS ObjectInformationClass
这个又出了问题,能提供一份使用的相关代码吗?很急啊!拜托
ericlau
驱动牛犊
驱动牛犊
  • 注册日期2004-12-17
  • 最后登录2006-03-16
  • 粉丝0
  • 关注0
  • 积分56分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
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;

            }


盘符下目录都隐藏了 ,为什么呢?

请指点!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-01-19 16:57
关注中。。。
Ideas for life!
lgh41
驱动小牛
驱动小牛
  • 注册日期2004-12-14
  • 最后登录2006-09-24
  • 粉丝0
  • 关注0
  • 积分203分
  • 威望28点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-06-03 16:38
ericlau:您好!
看了您04-12月末的文章,您能对我们6月3日在过滤器版及内核版关于使用IoVolumeDeviceToDosName或RtlVolumeDeviceToDosName例程取得盘符造成死机与蓝屏的问题给我们一些信息吗?
谢谢!
lgh41
游客

返回顶部