【问题标题】:Retrieving Device/File Name from File handle WinDBG从文件句柄 WinDBG 中检索设备/文件名
【发布时间】:2014-03-04 05:09:19
【问题描述】:

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

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

我想知道,有没有什么方法可以从句柄(在这种情况下为 0x000007bc)获取设备名称 (\Device\ExampleDevice),无需在 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

提前致谢,

【问题讨论】:

  • 您所做的是正确的,但由于某种奇怪的原因无法获得特定于对象的信息,大概您的所有符号都是正确的?
  • 是的!我想是的! “!handle 000007bc 7”输出是否应该包含开发人员。一般情况下的名称??
  • 如果可用,它会输出句柄对象特定信息,所以我希望文件路径在那里
  • 我也有同样的问题。使用procdump -ma,我无法获得特定的对象信息。在另一个时间从另一个进程获取的转储没有这个问题。我现在要么是权利问题,要么是转储服务和普通流程之间的区别。

标签: windows debugging driver windbg device-driver


【解决方案1】:

很晚才回答

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

在这种特定情况下,文件始终是 \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

名称可以在并行本地内核调试会话中找到
对于 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:\>

【讨论】:

    【解决方案2】:

    我看到您将 windbg 连接为用户模式调试器。 !handle 无法在用户模式下显示此类信息,因为映射 beetwen FILE_OBJECT(对象管理器对象)和句柄仅在内核模式下可用。将 windbg 连接为内核模式调试器,您将能够看到带有 !handle 扩展名的文件名。

    【讨论】:

    • 感谢您的回复,实际上我正在尝试查看 IOCTL 代码一个进程使用用户模式调试器发送到任何内核设备。因此,我在 CreateFileW 和 CreateFileA 处设置了断点以获取目标设备名称,并在 DeviceIoControl 处设置了一个 BP 以获取 IOCTL 代码。但不幸的是,我已经看到 CreateFile 函数 BP 永远不会受到打击。但是 DevieIoControl BP 正在受到打击。我不确定它如何在不使用任何 createfile api 的情况下获取目标设备的句柄。是否有任何其他方式(除了createfile)任何进程可以处理任何设备以将IOCTL发送给它?
    • 显然你做错了什么。它是您的应用程序(src 可用?)?您在 CreateFileA/W 的哪个阶段设置断点?基本上,您可以启用句柄跟踪 (!htrace) 以查看创建句柄的位置。
    • 我尝试了非常简单的事情。调用 Beep() API 以创建哔声的单行 C 程序。运行程序时,我使用 OSR IRP 跟踪器工具查看用户模式应用程序发送到 Beep 设备的 IOCTL。我可以在 IRP 跟踪器实用程序中看到它向 Beep 设备发送 IOCTL。但是,当我使用 Immunity 调试器加载相同的用户模式应用程序并在应用程序位于其入口点时设置上述 BP 并运行应用程序时,我发现 CreateFile 断点在其运行时永远不会被命中。但是 DeviceIoControl BP 被击中一次。如果我做错了什么,请提出建议。?
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多