从文件句柄WinDBG中检索设备/文件名

时间:2014-03-04 05:09:20

标签: windows debugging driver windbg device-driver

是否可以从文件/设备句柄(由CreateFile API返回)中检索目标设备名称(\ Device \ ExampleDevice)或文件名。

实际上,我有一个用户模式应用程序,它使用DeviceIoControl()与内核驱动程序通信。因此,当应用程序运行时,我在Kernel32!DeviceIoControl上设置了一个断点。所以当应用程序到达断点时,从堆栈中我收集了应用程序向其发送IOCTL的目标设备句柄。我们知道第二个参数是目标设备句柄。

我想知道,有没有什么方法可以从句柄获取设备名称(\ Device \ ExampleDevice),在这种情况下是0x000007bc 而没有在CreateFile设置断点?

我试过下面的东西。请建议。

0:000> bp Kernel32!DeviceIoControl
0:000> g
ModLoad: 76360000 76370000   C:\WINDOWS\system32\WINSTA.dll
ModLoad: 77e70000 77f01000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 5b860000 5b8b4000   C:\WINDOWS\system32\NETAPI32.dll
ModLoad: 77d40000 77dd0000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77f10000 77f56000   C:\WINDOWS\system32\GDI32.dll
Breakpoint 1 hit
eax=0022f6a4 ebx=0022f850 ecx=77e46520 edx=000007bc esi=00000000 edi=00000000
eip=7c801625 esp=0022f620 ebp=0022f678 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
kernel32!DeviceIoControl:
7c801625 6a14            push    14h
0:000> d esp
0022f620  77dd9672 000007bc 00390008 77e462c0
0022f630  00000100 0022f6b0 00000100 0022f6a4
0022f640  00000000 77e462a0 0022f7c8 00000018
0022f650  00000000 0022f66c 00000040 00000000
0022f660  00000000 00000000 00000000 001e001c
0022f670  77dd988c 000007bc 0022f7b4 77dd8724
0022f680  77e462c0 00000100 0022f6b0 0022f6a4
0022f690  00000000 00000000 00000000 00000100
0:000> !handle 000007bc f
Handle 7bc
  Type          File
  Attributes    0
  GrantedAccess 0x100001:
         Synch
         Read/List
  HandleCount   2
  PointerCount  3
  No Object Specific Information available
0:000> !handle 000007bc
Handle 7bc
  Type          File
0:000> !handle 000007bc 7
Handle 7bc
  Type          File
  Attributes    0
  GrantedAccess 0x100001:
         Synch
         Read/List
  HandleCount   2
  PointerCount  3

先谢谢,

2 个答案:

答案 0 :(得分:4)

很晚才回答

kernel32!beep不调用CreateFileA或W它直接调用ntdll.dll中的NtCreateFile所以kernel32.dll中的断点不会被命中

在这种特殊情况下,FILE始终是\ Device \ Beep

0:000> kbL;!obja poi(@esp + 0xc)
ChildEBP RetAddr  Args to Child              
0013fef0 7c837b44 0013ff60 00000003 0013ff2c ntdll!ZwCreateFile
0013ff68 00401013 000002ee 0000012c 0013ffc0 kernel32!Beep+0xc4
0013ff78 00401192 00000001 00033ae8 00033b18 Beep!main+0x13
0013ffc0 7c817077 009af6ee 009af71a 7ffde000 Beep!__tmainCRTStartup+0x10b
0013fff0 00000000 004011e8 00000000 78746341 kernel32!BaseProcessStart+0x23
Obja +0013ff2c at 0013ff2c:
    Name is \Device\Beep

如前所述,名称信息在内核模式下可用,而不是用户模式

0:000> !handle  poi(0x0013ff60) 7
Handle fa4
  Type          File
  Attributes    0
  GrantedAccess 0x3:
         None
         Read/List,Write/Add
  HandleCount   2
  PointerCount  3

name可以在并行本地内核调试会话中找到 for OS> vista LKd需要启用/ DEBUG开关

find the pid find the object and get the name of the object

C:\>wmic process get name,Processid | grep -i beep
Beep.exe                2796

C:\>kd -kl -c "!handle 0xfa4 7  0n2796;q " | grep -i object:

0fa4: Object: 86325028  GrantedAccess: 00000003 Entry: e1274f48
Object: 86325028  Type: (86fe9e70) File

C:\>kd -kl -c "!fileobj 86325028;q" | grep -i Device

Device Object: 0x868a6b90   \Driver\Beep

C:\>

答案 1 :(得分:1)

我看到你将windbg连接为usermode调试器。 !handle不能在usermode中显示这样的信息,因为映射beetwen FILE_OBJECT(对象管理器对象)并且只在kernelmode中处理avaiable。将windbg连接为kernelmode调试器,您将能够看到带有!handle扩展名的文件名。