tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
阅读:15096回复:49

终于搞定隐藏文件、目录了,好高兴啊!!!!!哈哈

楼主#
更多 发布于:2004-01-09 16:48
可以过滤掉目录下的所有entry,不需要重新构造irp
NTSTATUS
DispatchDirectoryControl(
       IN PDEVICE_OBJECT DeviceObject,
       IN PIRP Irp
       )
{
       PDEVICE_EXTENSION devExt = DeviceObject->DeviceExtension;
       PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
       KEVENT waitEvent;
       NTSTATUS status;
       PWSTR fileNameBuffer;
       ULONG bufferLength;
       ULONG newLength;
       ULONG offset;
       ULONG currentPosition;
       PFILE_BOTH_DIR_INFORMATION dirInfo = NULL;
       PFILE_BOTH_DIR_INFORMATION preDirInfo = NULL;

       PAGED_CODE();

       if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject)) {

              Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
              Irp->IoStatus.Information = 0;
              IoCompleteRequest(Irp, IO_NO_INCREMENT);
              return STATUS_INVALID_DEVICE_REQUEST;
       }

       if (Irp->RequestorMode == KernelMode) {

              IoSkipCurrentIrpStackLocation(Irp);
              return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);
       }

       if (FileBothDirectoryInformation != irpSp->Parameters.QueryDirectory.FileInformationClass) {

              IoSkipCurrentIrpStackLocation(Irp);
              return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);
       }

       KeInitializeEvent(&waitEvent, NotificationEvent, FALSE);
      
       IoCopyCurrentIrpStackLocationToNext(Irp);

       IoSetCompletionRoutine(Irp,
              DirectoryControlCompletion,
              &waitEvent,        //context parameter
              TRUE,
              TRUE,
              TRUE
              );
      
       status = IoCallDriver(devExt->AttachedToDeviceObject, Irp);
      
       //
       //  Wait for the operation to complete
       //
       if (STATUS_PENDING == status) {
      
              status = KeWaitForSingleObject(&waitEvent,
                     Executive,
                     KernelMode,
                     FALSE,
                     NULL
                     );
              ASSERT(STATUS_SUCCESS == status);
       }

       if (!NT_SUCCESS(status) ||(0 == irpSp->Parameters.QueryFile.Length)) {

              IoCompleteRequest(Irp, IO_NO_INCREMENT);
              return status;
       }

       fileNameBuffer =(PWSTR) ExAllocatePoolWithTag(NonPagedPool, MAX_PATH * sizeof(WCHAR), POOL_TAG);
       if (!fileNameBuffer)
       {
              IoCompleteRequest(Irp, IO_NO_INCREMENT);
              return status;
       }

       RtlZeroMemory(fileNameBuffer, MAX_PATH * sizeof(WCHAR));

       if (!NT_SUCCESS(GetFileName(DeviceObject, irpSp->FileObject, fileNameBuffer))) {

              ExFreePoolWithTag(fileNameBuffer, POOL_TAG);
              IoCompleteRequest(Irp, IO_NO_INCREMENT);
              return status;
       }
      
       if (0 != _wcsicmp(fileNameBuffer, L"\\")) {

              ExFreePoolWithTag(fileNameBuffer, POOL_TAG);
              IoCompleteRequest(Irp, IO_NO_INCREMENT);
              return status;
       }
      
       while (TRUE) {

              bufferLength = irpSp->Parameters.QueryDirectory.Length;
              newLength = bufferLength;
              currentPosition = 0;
              dirInfo =(PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer;
              preDirInfo = dirInfo;

              if ((!dirInfo) ||(dirInfo->NextEntryOffset > bufferLength)) {

                     IoCompleteRequest(Irp, IO_NO_INCREMENT);
                     return status;
              }
              
              do {

                     offset = dirInfo->NextEntryOffset;
                     if ((dirInfo->FileNameLength > 0) &&
                            (_wcsnicmp(HIDDEN_DIRECTORY, dirInfo->FileName, dirInfo->FileNameLength / sizeof(WCHAR)) == 0)) {

                            if (0 == offset) { // the last one

                                   preDirInfo->NextEntryOffset = 0;
                                   newLength = currentPosition;

                            } else {

                                   if (preDirInfo != dirInfo) {

                                          preDirInfo->NextEntryOffset += dirInfo->NextEntryOffset;
                                          dirInfo = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) dirInfo + offset);
                                          
                                   } else {

                                          RtlMoveMemory((PUCHAR) dirInfo,(PUCHAR) dirInfo + offset, bufferLength - currentPosition - offset);
                                          newLength -= offset;

                                   }
                            }
                            
//                            break;
                     }
                     else
                     {
                            currentPosition += offset;
                            preDirInfo = dirInfo;
                            dirInfo =(PFILE_BOTH_DIR_INFORMATION)((PUCHAR) dirInfo + offset);
                     }

              } while(0 != offset);

              if (0 == newLength) {
                    
                     KeResetEvent(&waitEvent);
                    
                     IoCopyCurrentIrpStackLocationToNext(Irp);
                    
                     IoSetCompletionRoutine(Irp,
                            DirectoryControlCompletion,
                            &waitEvent,        //context parameter
                            TRUE,
                            TRUE,
                            TRUE
                            );
                    
                     status = IoCallDriver(devExt->AttachedToDeviceObject, Irp);
                    
                     //
                     //       Wait for the operation to complete
                     //
                     if (STATUS_PENDING == status) {
                    
                            status = KeWaitForSingleObject(&waitEvent,
                                   Executive,
                                   KernelMode,
                                   FALSE,
                                   NULL
                                   );
                            ASSERT(STATUS_SUCCESS == status);
                     }

                     if (!NT_SUCCESS(status) ||(0 == Irp->IoStatus.Information)) {
                            
                            break;
                     }

              } else {

                     Irp->IoStatus.Information = newLength;
                     break;
              }
       }

       ExFreePoolWithTag(fileNameBuffer, POOL_TAG);
      
       Irp->IoStatus.Information = newLength;
       IoCompleteRequest(Irp, IO_NO_INCREMENT);
       return status;
}

NTSTATUS
DirectoryControlCompletion(
       IN PDEVICE_OBJECT DeviceObject,
       IN PIRP Irp,
       IN PVOID Context
       )
{
       UNREFERENCED_PARAMETER(DeviceObject);
       UNREFERENCED_PARAMETER(Irp);

       KeSetEvent((PKEVENT) Context, IO_NO_INCREMENT, FALSE);

       return STATUS_MORE_PROCESSING_REQUIRED;
}

最新喜欢:

SamSunSamSun sijinsijin linshierlinshi... zhuwgzhuwg
freducn2002
驱动小牛
驱动小牛
  • 注册日期2002-06-26
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望29点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2004-01-09 17:29
能说具体一点吗
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2004-01-09 21:23
和以前HOOK 那个QUERYSYSTEMFILE的方法差不多吧,如果是要隐藏的,就把后面的东西,覆盖掉前面的,可能他用IFS做,更好点。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-01-09 22:36
不错,前面测试下确实可以。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-01-13 14:45
过滤掉目录中所有的entry也可以
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2005-04-04 15:09
有bug,在ntfs分区上,有时只是查询单一的文件目录,这个方法隐藏不了.. 大家需要讨论一下。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
6楼#
发布于:2005-04-04 15:46
 
if (0 == offset) // the last one
{
PreQueryBuffer->NextEntryOffset = 0;
newlen = pos;
}
 


这个隐藏不了最后的文件夹或ntfs上的某些文件夹

特别是ntfs,骗不过去:(
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
wangsongshan
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2011-10-12
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-10 16:15
能否把代码发给我一份 ,谢谢!wang_song_shan@sohu.com
cardmagic
驱动中牛
驱动中牛
  • 注册日期2005-03-15
  • 最后登录2010-01-14
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望317点
  • 贡献值0点
  • 好评度312点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-07-10 23:27
这个代码bug不小,如果查询的是当前第一个目录的话,那么后面的目录隐藏就会有问题。
隐藏超过两个文件有问题。。

检查了一下 关键是里面的querybuffer有问题,隐藏后应该重新决断是否改变。。
牌术千术IT cardmagic.bokee.com
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-07-11 16:07
我一直都用这种方法,没有发现任何问题
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
10楼#
发布于:2005-07-12 16:19
后来仔细看了一下,已经没有bug了:)  此代码没问题:)
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
afengsoft
驱动牛犊
驱动牛犊
  • 注册日期2004-08-14
  • 最后登录2012-07-14
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望23点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-07-14 19:40
可以的话也给我发一份代码学习学习,谢谢afengsoft@163.com
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-07-15 12:27
恭喜亚,恭喜亚
[b]万水千山总是情,回个帖子行不行?[/b]
cardmagic
驱动中牛
驱动中牛
  • 注册日期2005-03-15
  • 最后登录2010-01-14
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望317点
  • 贡献值0点
  • 好评度312点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-07-16 00:38
下面是引用tooflat于2005-07-11 16:07发表的:
我一直都用这种方法,没有发现任何问题

过滤一个文件就break问题不大,但是如果利用这个隐藏一次查询中得若干文件得话,就有麻烦.

pos += offset;
PreQueryBuffer = QueryBuffer;
QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) QueryBuffer + offset);

这段代码要修改一下.
pos += offset;
if(!bMiddleFilter)
  PreQueryBuffer = QueryBuffer;
else
  bMiddleFilter = FALSE;
if(!bFirstFilter)
QueryBuffer = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) QueryBuffer + offset);
else
  bFirstFilter = FALSE;

如果已经隐藏的是中间文件的话,PreQueryBuffer不变
如果已经隐藏的是第一个文件的话,QueryBuffer不变.

如果不这么做的话,在隐藏多文件时,可能会出现奇怪的问题,比如只能隐藏第一个文件,或者意外隐藏了别的文件.
牌术千术IT cardmagic.bokee.com
unionize
驱动牛犊
驱动牛犊
  • 注册日期2005-07-17
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-07-17 01:53
搂主和各位老大好,我是驱动开发文盲,一直没有涉足系统底层的开发,最近有一个项目要求很高,必须隐藏文件于无声无息之中,搂主给的两个函数对于我来说太高深了,能给一段调用这两个函数的具体代码吗?不胜感激!再次感谢搂主和各位老大的无私奉献!
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-07-18 09:48
下面是引用cardmagic于2005-07-16 00:38发表的:

过滤一个文件就break问题不大,但是如果利用这个隐藏一次查询中得若干文件得话,就有麻烦.

pos += offset;
PreQueryBuffer = QueryBuffer;
.......


兄台所言极是
unionize
驱动牛犊
驱动牛犊
  • 注册日期2005-07-17
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-07-19 11:00
斑竹怎么可以对我的话不闻不问呢?太伤心了
intermezzo
驱动牛犊
驱动牛犊
  • 注册日期2005-06-29
  • 最后登录2006-01-24
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-08-02 16:24
tooflat 大,有几个问题想请教你..
1. 这段码可直接加入到sfilter的sample code,指定HIDDEN_DIRECTORY,就可以work了吗?
2. 如果是,那GetFileName在码里的作用跟SfGetFileName一样吗? 因为两者参数不太一样..

小弟想学习IFS的部分....希望大大不吝赐教
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-08-02 18:08
这种很烂的隐藏技术有人用吗?用很多windows的软件都能找到隐藏的文件的,比如Winhex
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-08-02 20:48
下面是引用yuanyuan于2005-08-02 18:08发表的:
这种很烂的隐藏技术有人用吗?用很多windows的软件都能找到隐藏的文件的,比如Winhex


那你告诉我们一个好的技术
上一页
游客

返回顶部