免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > windows > 强删与防删文件的技术(3)

强删与防删文件的技术(3)

时间:2011-12-17 17:42来源:未知 整理:寂涯网络 点击:


行中的文件或者加载的dll,系统会调用MmFlushImageSection检测文件是否在运行。删除这
样的文件,我们可以自己构造IRP发送给FSD。也可以HOOK MmFlushImageSection来PASS掉目
标文件。我选择构造IRP发送给FSD,因为介绍hardlink硬链接的时候,还是要用到这部分知
识。
具体步骤:
发送IRM_MJ_SET_INFORMATION去掉文件的只读属性(在删除文件的时候,会检测文件属性是
否为只读),再发送IRP_MJ_SET_INFORMATION设置DELETE来删除文件。
首先要获取卷对应的device_object。(直接从ntfs.sys创建的driver.device获取是不对的。
因为NTFS文件系统会创建一个CDO(CONTROL_DEVICE_OBJECT),和几个DO(每个卷对应一个
DO)。可以用下面的方法获取C盘对应DO的设备栈顶端的设备(NTFS创建的DO有可能被attach
了)。

[code](附件中的deletefile工程)
RtlInitUnicodeString(&filename,L"\\??\\c:\\my.exe");
 //以FILE_READ_ATTRIBUTES权限打开c:\my.exe文件。
 InitializeObjectAttributes(&objectattribute,&filename,OBJ_KERNEL_HANDLE
| OBJ_CASE_INSENSITIVE,0,0);
 status=IoCreateFile(&hfile,
FILE_READ_ATTRIBUTES,
      &objectattribute,
      &iostatus,
      0,
      FILE_ATTRIBUTE_NORMAL,
      FILE_SHARE_DELETE,
      FILE_OPEN,
      0,
 0,  

0,
      0,
      0,
      IO_NO_PARAMETER_CHECKING);
  if(!NT_SUCCESS(status))
 {
  DbgPrint("Open file error\n");
   return STATUS_SUCCESS;
 }
//获取my.exe的file_object结构体指针
 status=ObReferenceObjectByHandle(hfile,FILE_ALL_ACCESS,*IoFileObjectTyp
e,KernelMode,&fileobject,0);
  if(!NT_SUCCESS(status))
 {
  DbgPrint("get fileobject is error\n");
  ZwClose(hfile);

   return STATUS_SUCCESS;
 }
 ObDereferenceObject(fileobject);
 deviceobject=IoGetRelatedDeviceObject(fileobject);  //得到设备
[/code]
下面就是构造IRP并且发送来去掉只读属性。
[code]
irp=IoAllocateIrp(deviceobject->StackSize,TRUE);  //申请下发IRP所需的
内存,device->stacksize表示设备栈中设备的个数。该内存空间需要自己free。
  if(!irp)   //申请内存失败
 {
  DbgPrint("allocate irp is error\n");
   return STATUS_SUCCESS;
 }
 KeInitializeEvent(&event1,SynchronizationEvent,FALSE);  //初始化
event
 memset(&fileinformation,0,sizeof(FILE_BASIC_INFORMATION));
//填充IRP。

 fileinformation.FileAttributes=FILE_ATTRIBUTE_NORMAL;  //设置
normal来去除只读属性
 irp->AssociatedIrp.SystemBuffer=&fileinformation;
 irp->UserEvent=&event1;
 irp->UserIosb=&iostatus;
 irp->Tail.Overlay.OriginalFileObject=fileobject;
 irp->Tail.Overlay.Thread=(PETHREAD)KeGetCurrentThread();
 irp->RequestorMode=KernelMode;
 irpsp=IoGetNextIrpStackLocation(irp);  

      
irpsp->MajorFunction=IRP_MJ_SET_INFORMATION;
 irpsp->DeviceObject=deviceobject;
 irpsp->FileObject=fileobject;
 irpsp->Parameters.SetFile.Length=sizeof(FILE_BASIC_INFORMATION);
 irpsp->Parameters.SetFile.FileInformationClass=FileBasicInformation;
   //设置文件属性
 irpsp->Parameters.SetFile.FileObject=fileobject;
//注册个回调函数,在该IRP完成时候,会调用SetInfromationComplete来回收刚才申
请的IRP内存空间。
 IoSetCompletionRoutine(irp,SetInformationComplete,&event1,TRUE,TRUE,TRU
E);
 IoCallDriver(deviceobject,irp);    //下发IRP
 KeWaitForSingleObject(&event1,Executive,KernelMode,TRUE,NULL);
[/code]

接着是构造IRP来删除文件了,和发送IRP去除只读属性大同小异。
[code]
KeInitializeEvent(&event2,SynchronizationEvent,FALSE);
 memset(&filedispotion,0,sizeof(FILE_DISPOSITION_INFORMATION));
 irp=IoAllocateIrp(deviceobject->StackSize,TRUE);

本页地址 http://www.jybase.net/windows/20111217721.html

百度搜索更多

谷歌搜索更多

顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com