WinDbg的 |应用程序内存完全转储 - 显示文件句柄的文件路径

WinDbg | Application memory full dump - Show file path of file handle

提问人:Enki 提问时间:6/2/2023 更新时间:6/3/2023 访问量:114

问:

我使用 创建了一个应用程序的内存转储。 应用程序访问各种文件。procdump -ma abc.exe

我运行并获取了 100 多个文件句柄。 当我获得特定的句柄地址时,我运行以下命令,结果为:!handle 0 f FILE!handle 000000000000161c f

0:000> !handle 000000000000161c f
Handle 000000000000161c
  Type          File
  Attributes    0
  GrantedAccess 0x12019f:
         ReadControl,Synch
         Read/List,Write/Add,Append/SubDir/CreatePipe,ReadEA,WriteEA,ReadAttr,WriteAttr
  HandleCount   2
  PointerCount  65479
  No object specific information available

是否有机会检索实际的文件路径?像这样的东西: 如何在windbg中通过句柄获取文件路径? 似乎只在内核模式调试中起作用。

调试 Windbg

评论

1赞 Neitsa 6/2/2023
遗憾的是,句柄数值和对象名称(如果有)之间的关系保持在内核级别。这甚至不适用于用户模式调试中的实时进程。您确实需要一个内核调试器(实时或完整内核转储)来检索对象名称。在用户模式下,一种不太实用的可能性是获取所有句柄,询问它们的类型,如果它们是命名对象,则询问内核以获取该名称,然后大致在同一时间执行转储......
0赞 Thomas Weller 6/3/2023
@Neitsa:有一个扩展。当然,只有实时调试。

答:

2赞 Thomas Weller 6/3/2023 #1

对于事后调试(故障转储分析),没有办法,除非你有内核转储(那时我不能告诉你如何做到这一点)。Windows 将关闭已终止的进程的句柄。

!handle 与 !handleex 结合使用

Github 上有 handleex

结合并获得很好的信息。!handle!handleex

.foreach /pS 1 /ps 1 (file {!handle 0 4 FILE}) { .echo Handle file; !handleex file; .echo }

示例输出

0:007> .foreach /pS 1 /ps 1 (file {!handle 0 4 FILE}) { .echo Handle file; !handleex file; .echo }
Handle 4c
Object Type: File
Handle Name: \Device\HarddiskVolume3\Users\T

Handle 8c
Object Type: File
Handle Name: \Device\HarddiskVolume3\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.1110_none_60b5254171f9507e

Handle b4
Object Type: File
Handle Name: \Device\HarddiskVolume3\Windows\System32\en-US\notepad.exe.mui

...

handle与 SysInternals 句柄结合使用

可以结合使用 WinDbg 命令和 SysInternals 句柄工具!handle

记事本调试会话示例:

:018> !handle 0 1 FILE
Handle 4c
  Type          File
Handle 8c
  Type          File
Handle b8
  Type          File
Handle 134
  Type          File
...

结合控制台中的信息:

C:\...>handle -p notepad.exe | findstr 8C:
   8C: File          C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.1110_none_60b5254171f9507e

C:\...>handle -p notepad.exe | findstr B8:
   B8: File          C:\Windows\System32\en-US\notepad.exe.mui

自动化它并不真正有效:

0:007> .printf "%d\n",$tpid
2168
0:007> .foreach /pS 1 /ps 1 (file {!handle 0 4 FILE}) { .shell C:\handle.exe -p 2168 | findstr file: }

该过程似乎太慢,需要太多用户输入。

评论

0赞 Neitsa 6/3/2023
谢谢托马斯,我不知道这个扩展!
0赞 Enki 6/4/2023
谢谢你的回答。我将尝试使用 handleex 扩展!:-)