Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: sudami   发起时间: 2008-10-04 21:31 下午   回复: 18

Print Search
帖子排序:    
   2008-10-04, 21:31 下午
sudami 离线,最后访问时间: 2009/8/28 11:12:14 sudami

发帖数前75位
注册: 2008-09-24
发 贴: 17
如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
如何利用 windbg+vm 动态跟踪NtDeleteFile函数执行的全过程,各位同学,请指点一二,谢谢啦~~
IP 地址: 已记录   报告
   2008-10-05, 17:10 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote

这个问题不是很具体。不知道你是感觉哪里有困难,是windbg+vm这种跟踪方式,还是使用这种方式跟踪NtDeleteFile时有困难?我使用WinDBG+VirtualPC跟踪了一下XP SP3,大致结果如下:

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.


IP 地址: 已记录   报告
   2008-10-05, 17:52 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
大米下nt!KiFastCallEntry断点后试着继续跟踪,呵呵

有空在Advdbg给大伙讲讲你的Hook扫描~
IP 地址: 已记录   报告
   2008-10-05, 19:50 下午
sudami 离线,最后访问时间: 2009/8/28 11:12:14 sudami

发帖数前75位
注册: 2008-09-24
发 贴: 17
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
嗯,wy分析的很清楚啊~
哈哈.
Hook扫描大家都会,我就不献丑了~~
IP 地址: 已记录   报告
   2008-10-05, 21:11 下午
sudami 离线,最后访问时间: 2009/8/28 11:12:14 sudami

发帖数前75位
注册: 2008-09-24
发 贴: 17
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
怎么下断 IRP_MJ_CLEANUP 啊???
IP 地址: 已记录   报告
   2008-10-05, 22:00 下午
sudami 离线,最后访问时间: 2009/8/28 11:12:14 sudami

发帖数前75位
注册: 2008-09-24
发 贴: 17
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
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

哈哈,然后下断点@@@@~~~

NtfsDecodeFileObject...
IP 地址: 已记录   报告
   2008-10-06, 09:11 上午
sudami 离线,最后访问时间: 2009/8/28 11:12:14 sudami

发帖数前75位
注册: 2008-09-24
发 贴: 17
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
汗,昨天看错了.把 Raymond 大叔看成wy了.

感谢Raymond大叔的热心帮助,我明白不少~~

嘿嘿~~
IP 地址: 已记录   报告
   2008-10-06, 13:14 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote

 哈哈,岁月无情呀。

对的,!drvobj刚好满足你的需要,我也很喜欢用这个命令。

对于不太熟悉这个命令的朋友,我再罗嗦几句。

这个命令可以跟两个参数,即

!drvobj DriverObject [Flags]

第一个参数可以是_DRIVER_OBJECT结构的地址,也可以是驱动程序的名称

当不知道驱动对象的地址时,使用名称是很方便的,比如下面的命令就可以得到NTFS驱动程序的对象地址,和它的设备实例:

lkd> !drvobj ntfs
Driver object (8a834f38) is for:
 \FileSystem\Ntfs
Driver Extension List: (id , addr)

Device Object list:
8993b020  8a825020  8a85b900 

有了驱动对象的地址8a834f38,那么既可以使用dt命令来观察它的详细信息,也可以使用!drvobj:

lkd> dt _DRIVER_OBJECT 8a834f38
ntdll!_DRIVER_OBJECT
   +0x000 Type             : 4
   +0x002 Size             : 168
   +0x004 DeviceObject     : 0x8993b020 _DEVICE_OBJECT
   +0x008 Flags            : 0x92
   +0x00c DriverStart      : 0xba536000
   +0x010 DriverSize       : 0x8c400
   +0x014 DriverSection    : 0x8a8e66f8
   +0x018 DriverExtension  : 0x8a834fe0 _DRIVER_EXTENSION
   +0x01c DriverName       : _UNICODE_STRING "\FileSystem\Ntfs"
   +0x024 HardwareDatabase : 0x8066f260 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
   +0x028 FastIoDispatch   : 0xba5557a0 _FAST_IO_DISPATCH
   +0x02c DriverInit       : 0xba5bb184     long  Ntfs!GsDriverEntry+0
   +0x030 DriverStartIo    : (null)
   +0x034 DriverUnload     : (null)
   +0x038 MajorFunction    : [28] 0x88fd2c00     long  +ffffffff88fd2c00

然后用dds命令可以列出MajorFunction数组的内容:

lkd> dds 8a834f38+38
8a834f70  88fd2c00
8a834f74  804f3520 nt!IopInvalidDeviceRequest
8a834f78  ba55b0ea Ntfs!NtfsFsdClose
8a834f7c  ba538f3b Ntfs!NtfsFsdRead
8a834f80  ba537b57 Ntfs!NtfsFsdWrite
8a834f84  ba55c2b9 Ntfs!NtfsFsdDispatchWait
8a834f88  88fd2c17
8a834f8c  ba55c2b9 Ntfs!NtfsFsdDispatchWait
8a834f90  ba55c2b9 Ntfs!NtfsFsdDispatchWait
8a834f94  ba575ec8 Ntfs!NtfsFsdFlushBuffers
8a834f98  ba55c404 Ntfs!NtfsFsdDispatch
8a834f9c  ba55c404 Ntfs!NtfsFsdDispatch
8a834fa0  ba55dfbd Ntfs!NtfsFsdDirectoryControl
8a834fa4  ba560758 Ntfs!NtfsFsdFileSystemControl
8a834fa8  ba55c404 Ntfs!NtfsFsdDispatch
8a834fac  804f3520 nt!IopInvalidDeviceRequest
8a834fb0  ba54a5af Ntfs!NtfsFsdShutdown
8a834fb4  ba5afaa3 Ntfs!NtfsFsdLockControl
8a834fb8  ba55bab8 Ntfs!NtfsFsdCleanup
8a834fbc  804f3520 nt!IopInvalidDeviceRequest
8a834fc0  ba55c404 Ntfs!NtfsFsdDispatch
8a834fc4  ba55c404 Ntfs!NtfsFsdDispatch
8a834fc8  804f3520 nt!IopInvalidDeviceRequest
8a834fcc  804f3520 nt!IopInvalidDeviceRequest
8a834fd0  804f3520 nt!IopInvalidDeviceRequest
8a834fd4  ba55c2b9 Ntfs!NtfsFsdDispatchWait
8a834fd8  ba55c2b9 Ntfs!NtfsFsdDispatchWait
8a834fdc  ba5787f0 Ntfs!NtfsFsdPnp
8a834fe0  8a834f38
!drvobj把简化了上面的操作,因此使用一条命令就可以完成,即:lkd> !drvobj ntfs 2 (设置位1以显示分发例程)

 

 


IP 地址: 已记录   报告
   2008-10-06, 21:22 下午
nightxie 离线,最后访问时间: 2010/4/3 8:32:07 nightxie

发帖数前25位
注册: 2008-06-09
发 贴: 43
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
学习了。。。又了解了一条很有用的命令。。。O(∩_∩)O哈哈~
IP 地址: 已记录   报告
   2009-02-09, 14:49 下午
LOVEWDF 离线,最后访问时间: 2009/2/9 14:47:03 LOVE

发帖数前200位
注册: 2009-02-09
发 贴: 4
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote

为什么我的出现

lkd> !drvobj ntfs
Driver object ntfs not found


IP 地址: 已记录   报告
   2009-02-09, 22:39 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
这个提示的意思是没有找到这样的驱动对象,可能是系统中真的没有加载NTFS驱动(用的是FAT32文件系统),也有可能是调试器的模块信息需要刷新。
所以,可以执行一下.reload命令,然后用lm命令观察系统中是否有ntfs模块。
IP 地址: 已记录   报告
   2009-02-10, 14:18 下午
LOVEWDF 离线,最后访问时间: 2009/2/9 14:47:03 LOVE

发帖数前200位
注册: 2009-02-09
发 贴: 4
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
文件系统用的是NTFS
lm后
f9885000 f98b1980 NDIS (deferred)
f98b2000 f993e600 Ntfs (deferred)

!drvobj ntfs
Driver object (f98b2000) is for:
f98b2000: is not a driver object
IP 地址: 已记录   报告
   2009-02-10, 15:27 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
注意到现在信息和前面的不一样了么?
IP 地址: 已记录   报告
   2009-02-10, 15:54 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
呵呵~ ;)
IP 地址: 已记录   报告
   2009-02-10, 19:27 下午
LOVEWDF 离线,最后访问时间: 2009/2/9 14:47:03 LOVE

发帖数前200位
注册: 2009-02-09
发 贴: 4
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
Reply Quote
Driver object (f98b2000) is for:
f98b2000: is not a driver object
为什么说它不是一个驱动对象

我调试的时候什么地方出错了?
IP 地址: 已记录   报告
  总页数 1 第 2 页 [共有 19 条记录] 1 2 >
高端调试 » 软件调试 » Windows内核调试 » Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.