暴删文件之Xcb填充

 

 

 前段时间,恶意程序HBKrnl.sys站炕文件导致粉碎机删不掉它,虽然是很古老的科普技术,但是一般的文件粉碎,诸如发IRP,清SectionObject等方法是删不掉的(直接磁盘填0的例外).

      有感于MJ0011写的对付此程序的猥琐暴删文件方法.很想知道他是如何一步步跟踪出来那堆强大的偏移量的, 于是调试啊调试,最终淹没在系统浩瀚的汇编指令中... 难怪MJ在群上信誓旦旦的说 "跟一个版本的那几个偏移量就花了一晚上",哎呀,我花了2天多时间都没跟出来,不过从实践中也学到了许多调试经验,也罢,跟了一部分,找到一个很像的offset: 0x48,也只能到这步了.不搞咯.顺便贴点资料上来,供有兴趣的同学参考,总之, Xcb填充是很强大滴.

      其实,恶意程序把自己文件站炕防删后,可以在内存中保存一份,开DPC/线程循环监视,被删了就重新生成,再注册个关机Notify(当然可以被别人摘除).关机回写.... 这样保护自己文件差不多了吧~~~
   -------------------------------------------------------------------------------------------------------------------------------

Driver object (81797808) is for:
/FileSystem/Ntfs
DriverEntry: f97a8184 Ntfs!GsDriverEntry
DriverStartIo: 00000000
DriverUnload: 00000000
AddDevice: 00000000

Dispatch routines:
[00] IRP_MJ_CREATE f9748c01 Ntfs!NtfsFsdCreate
[01] IRP_MJ_CREATE_NAMED_PIPE 804f43f8 nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE f97480ea Ntfs!NtfsFsdClose
[03] IRP_MJ_READ f9725f3b Ntfs!NtfsFsdRead
[04] IRP_MJ_WRITE f9724b57 Ntfs!NtfsFsdWrite
[05] IRP_MJ_QUERY_INFORMATION f97492b9 Ntfs!NtfsFsdDispatchWait
[06] IRP_MJ_SET_INFORMATION f9726618 Ntfs!NtfsFsdSetInformation
[07] IRP_MJ_QUERY_EA f97492b9 Ntfs!NtfsFsdDispatchWait
[08] IRP_MJ_SET_EA f97492b9 Ntfs!NtfsFsdDispatchWait
[09] IRP_MJ_FLUSH_BUFFERS f9762ec8 Ntfs!NtfsFsdFlushBuffers
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION f9749404 Ntfs!NtfsFsdDispatch
[0b] IRP_MJ_SET_VOLUME_INFORMATION f9749404 Ntfs!NtfsFsdDispatch
[0c] IRP_MJ_DIRECTORY_CONTROL f974afbd Ntfs!NtfsFsdDirectoryControl
[0d] IRP_MJ_FILE_SYSTEM_CONTROL f974d758 Ntfs!NtfsFsdFileSystemControl
[0e] IRP_MJ_DEVICE_CONTROL f9749404 Ntfs!NtfsFsdDispatch
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL 804f43f8 nt!IopInvalidDeviceRequest
[10] IRP_MJ_SHUTDOWN f97375af Ntfs!NtfsFsdShutdown
[11] IRP_MJ_LOCK_CONTROL f979caa3 Ntfs!NtfsFsdLockControl
[12] IRP_MJ_CLEANUP f9748ab8 Ntfs!NtfsFsdCleanup
[13] IRP_MJ_CREATE_MAILSLOT 804f43f8 nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY f9749404 Ntfs!NtfsFsdDispatch
[15] IRP_MJ_SET_SECURITY f9749404 Ntfs!NtfsFsdDispatch
[16] IRP_MJ_POWER 804f43f8 nt!IopInvalidDeviceRequest
[17] IRP_MJ_SYSTEM_CONTROL 804f43f8 nt!IopInvalidDeviceRequest
[18] IRP_MJ_DEVICE_CHANGE 804f43f8 nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA f97492b9 Ntfs!NtfsFsdDispatchWait
[1a] IRP_MJ_SET_QUOTA f97492b9 Ntfs!NtfsFsdDispatchWait
[1b] IRP_MJ_PNP f97657f0 Ntfs!NtfsFsdPnp

哈哈,然后下断点~~~

Raymond : advdbg.org/forums/1211/ShowPost.aspx

1)对NtDeleteFile设置断点后,在资源管理器(Shift+Delete)和命令行(del)执行删除文件操作,断点都没有命中。

2)观察NtDeleteFile的汇编代码(uf NtDeleteFile),可以看到,其中的主要调用是nt!ObOpenObjectByName,也就是通过这个调用向文件系统发出请求的。

3)Win32 API的DeleteFile是用来删除文件的,使用另一个WinDBG通过用户态调试对其跟踪,以下是DeleteFileW(DeleteFile的宽字符版本,DeleteFileA会调用这个函数)的执行过程:

0:000> wt
Tracing kernel32!DeleteFileW to return address 7c831e4e
    14      0 [   0] kernel32!DeleteFileW
    12      0 [   1]    ntdll!RtlDosPathNameToNtPathName_U
    30   1556 [   1]    ntdll!RtlDosPathNameToNtPathName_U
    44   1586 [   0] kernel32!DeleteFileW
     3      0 [   1]    ntdll!NtOpenFile
     2      0 [   2]      ntdll!KiFastSystemCall
     1      0 [   1]    ntdll!NtOpenFile
    55   1592 [   0] kernel32!DeleteFileW
     1      0 [   1]    ntdll!NtQueryInformationFile
     2      0 [   1]    ntdll!ZwQueryInformationFile
     2      0 [   2]      ntdll!KiFastSystemCall
     1      0 [   1]    ntdll!ZwQueryInformationFile
    69   1598 [   0] kernel32!DeleteFileW
     3      0 [   1]    ntdll!RtlFreeHeap
    79     69 [   1]    ntdll!RtlFreeHeap
    78   1746 [   0] kernel32!DeleteFileW
     1      0 [   1]    ntdll!ZwSetInformationFile
     2      0 [   1]    ntdll!NtSetInformationFile
     2      0 [   2]      ntdll!KiFastSystemCall
     1      0 [   1]    ntdll!NtSetInformationFile
    81   1752 [   0] kernel32!DeleteFileW
     1      0 [   1]    ntdll!NtClose
     2      0 [   1]    ntdll!ZwClose
     2      0 [   2]      ntdll!KiFastSystemCall
     1      0 [   1]    ntdll!ZwClose
    90   1758 [   0] kernel32!DeleteFileW

1848 instructions were executed in 1847 events (0 from other threads)

可以发现,DeleteFile API根本没有调用NtDeleteFile,其主要操作是先打开文件,然后调用内核服务NtSetInformationFile,最后再关闭文件。这印证了API文档中的说法: The DeleteFile function marks a file for deletion on close. Therefore, the file deletion does not occur until the last handle to the file is closed.

哎,刚好手头有本wy同学的<文件系统内幕.NTFSI>,里面关于VPB、VCB、FCB、CCB、SCB等讲解的还是很清楚的,得抓紧时间补补啦.

 

 

 

 

 

 

 

 

 

 

 

大的MJ,不是一般的强大,这样跟系统的东西,能这么高效跟出来的没多少人了...

附件是调试笔记,有兴趣的可参考下,估计你看了会吐血,做好心理准备.

NtfsFsdCleanup.rar (5.04 KB)

NtfsFsdCleanup.txt (17.69 KB)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值