在PyKD中,我可以像这样得到可执行文件的进程名称:
0:017> !py
...
>>> getProcessExeName()
u'C:\\Windows\\SysWOW64\\rundll32.exe'
我可以用
获取模块信息>>> print module("rundll32")
Module: rundll32
Start: 7f0000 End: 7fe000 Size: e000
Image: C:\Windows\SysWOW64\rundll32.exe
Symbols: e:\debug\symbols\rundll32.pdb\EFAE0C870C2846EDB63B9A7274CD50422\rundll32.pdb
Timestamp: 4a5bc637
Check Sum: 11cf2
如何从流程名称转换为模块名称?
它不像提取文件名那么简单,因为包含Notepad++.exe
等特殊字符的文件名会转换为notepad__
作为模块名称。
背景:我想自动化转储分析,首先我检查它是否是我的程序,然后我想检查我需要模块信息的崩溃程序的版本。我想让它更具普遍性,并考虑用户重命名可执行文件的情况。
版本(如果重要):PyKD 0.3.0.25,32位,WinDbg 6.2.9200,Python 2.7.8
答案 0 :(得分:2)
你的问题实际上比你描述的更加阴险。我已经看到使用short (MSDOS compatible) name加载的模块在哪些地方被破坏了。
我唯一可以想出回答你的问题的是一个黑客攻击。如果您假设占用最低地址空间的模块是可执行文件的模块,那么您可以使用带有1m
标志的lm
列出所有模块,但只使用第一个模块。
这意味着您可以:
0:001> !py c:\test.py
Module: notepad__
Start: 10000 End: 21c000 Size: 20c000
Image: C:\Program Files (x86)\Notepad++\notepad++.exe
Symbols: export symbols
Timestamp: 55ad8d3e
Check Sum: 0
test.py
的位置:
from pykd import *
exeModuleName = dbgCommand("lm1m").split('\n')[0]
exeModule = module(exeModuleName)
print exeModule
这仍然依赖于一个假设。虽然,我已经观察到对于所有版本的Windows回到NT 4.0都是如此,但情况可能并非总是如此。例如,如果地址空间布局随机化(ASLR)完全打破了与其相关联的任何进程的假设,我就不会感到惊讶了。
修改强>
更安全的方法是查看ImageBaseAddress
的{{3}}。这是基本模块的模块起始地址。你可以在基地址之外构造一个pykd PEB
类型,如下所示:
from pykd import *
peb = typedVar("ntdll!_PEB", getProcessOffset())
exeModule = module(peb.ImageBaseAddress)
print exeModule
这应该更加可靠,并且更可预测地失败,_PEB
结构是否会发生变化。