首页
社区
课程
招聘
[原创]inline MmFlushImageSection实现文件的强制删除
发表于: 2010-10-10 22:46 8805

[原创]inline MmFlushImageSection实现文件的强制删除

2010-10-10 22:46
8805

说明下,技术比较古老,适合我等小菜...
中秋的时候看了关于内核对象的内容, 为了加深理解, 就想试下文件的强制删除,只要把文件对象的引用计数改为0就可以了嘛... 不过郁闷的是根本就找不到那个文件对象, 那个囧啊,然后就去网上找资料,怎么才能实现文件的强制删除呢?MJ说有两种方法
1.你可以使用自己给fsd发送irp请求来删除文件,或者用HOOK MmFlushImageSection等方法,详细见xikug等人逆向的360FileKill的驱动代码
2.使用DeviceIoControl调用驱动文件,或使用事件、共享内存等方法亦可
然后就去看文件过滤驱动,也就是想给文件系统发IRP实现,看那个寒江独钓,好不容易看懂了,不过纠结的是他没有提供读写的源码,郁闷ing... 接下来就是HOOK MmFlushImageSection函数了,终于找到了一篇代码了,使用hook MmFlushImageSection实现文件保护... 作者liuke_blue,非常感谢,O(∩_∩)O哈哈~
于是开始编写自己的文件强制删除机...

//自己的处理函数
BOOLEAN NTAPI  Fake_MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer,IN MMFLUSH_TYPE FlushType)
{
  PFILE_OBJECT pfile;
  WCHAR *pwsz=NULL;
  
  if (FlushType == MmFlushForDelete)
  {
    if(SectionObjectPointer->DataSectionObject!=NULL)
	{
//这里取得文件对象
	   pfile=(PFILE_OBJECT)( *(ULONG*)((ULONG)SectionObjectPointer->DataSectionObject + 0x24) );
	   __try
	   {
         pwsz=wcsrchr(pfile->FileName.Buffer,L'\\');
	     if (pwsz!=NULL)
		 {
	      pwsz++;
		 }
//比较文件名是否相同,如果是,则删除
         if (strcmp(outBuf.Buffer, pwsz) == 0)
         {
			DbgPrint("FileName=%ws",pwsz);
		    return TRUE;
         }
	   }
	  except(1)
	  {
      return FALSE;  
	  }
	 
	}
  }
  return  MmFlushImageSection(SectionObjectPointer,FlushType); 
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
自从看了MJ的XCB大法之后,就没想过要inline hook XXX的方式来解决删除文件遇到问题
2010-10-11 07:21
0
雪    币: 388
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
请问: MJ的XCB大法 在哪里有?很想看一下
2010-10-12 17:06
0
游客
登录 | 注册 方可回帖
返回
//