|
|
|
|
|
|
|
Windows内核调试
帖子发起人: sudami 发起时间: 2008-10-04 21:31 下午 回复: 18
|
帖子排序:
|
|
|
|
2008-10-04, 21:31 下午
|
sudami
注册: 2008-09-24
发 贴: 17
|
如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
如何利用 windbg+vm 动态跟踪NtDeleteFile函数执行的全过程,各位同学,请指点一二,谢谢啦~~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-10-05, 17:10 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
这个问题不是很具体。不知道你是感觉哪里有困难,是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 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
大米下nt!KiFastCallEntry断点后试着继续跟踪,呵呵
有空在Advdbg给大伙讲讲你的Hook扫描~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-10-05, 19:50 下午
|
sudami
注册: 2008-09-24
发 贴: 17
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
嗯,wy分析的很清楚啊~
哈哈.
Hook扫描大家都会,我就不献丑了~~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-10-05, 21:11 下午
|
sudami
注册: 2008-09-24
发 贴: 17
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-10-05, 22:00 下午
|
sudami
注册: 2008-09-24
发 贴: 17
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
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
注册: 2008-09-24
发 贴: 17
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
汗,昨天看错了.把 Raymond 大叔看成wy了.
感谢Raymond大叔的热心帮助,我明白不少~~
嘿嘿~~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-10-06, 13:14 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
哈哈,岁月无情呀。
对的,!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
注册: 2008-06-09
发 贴: 43
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
学习了。。。又了解了一条很有用的命令。。。O(∩_∩)O哈哈~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-02-09, 22:39 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
这个提示的意思是没有找到这样的驱动对象,可能是系统中真的没有加载NTFS驱动(用的是FAT32文件系统),也有可能是调试器的模块信息需要刷新。
所以,可以执行一下.reload命令,然后用lm命令观察系统中是否有ntfs模块。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-02-10, 14:18 下午
|
LOVE
注册: 2009-02-09
发 贴: 4
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
文件系统用的是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 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-02-10, 15:54 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-02-10, 19:27 下午
|
LOVE
注册: 2009-02-09
发 贴: 4
|
Re: 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
Driver object (f98b2000) is for:
f98b2000: is not a driver object
为什么说它不是一个驱动对象
我调试的时候什么地方出错了?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
|
总页数 1 第 2 页 [共有 19 条记录]
|
1 2 > |
|
|
高端调试 » 软件调试 » Windows内核调试 » 如何利用windbg+vm动态跟踪NtDeleteFile函数执行的全过程
|
|
|
|
|
|