Python 获取可执行文件&x27;PyKD中的s模

Python 获取可执行文件&x27;PyKD中的s模,python,windbg,pykd,Python,Windbg,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\rund

在中,我可以获得可执行文件的进程名,如下所示:

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。您的问题实际上比您描述的更隐秘。我已经看到使用它们的组件加载的模块被破坏得更严重

我能想出的回答你问题的唯一办法就是有点小技巧。如果假设占用最低地址空间的模块是可执行文件的模块,则可以使用
1m
标志列出所有模块,但只使用第一个模块

这意味着您可以:

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回到NT4.0都是如此,但情况可能并非总是如此。例如,如果地址空间布局随机化()完全打破了与之相关联的任何进程的这种假设,我一点也不会感到惊讶


编辑:

更安全的方法是查看
ImageBaseAddress
的。这是基本模块的模块起始地址。您可以使用基址构造pykd类型,如下所示:

from pykd import *

peb = typedVar("ntdll!_PEB", getProcessOffset())
exeModule = module(peb.ImageBaseAddress)
print exeModule

如果
\u PEB
结构发生变化,这应该工作得更可靠,故障也更容易预测。

我不喜欢
dbgCommand()
,因为a)它可能会受到别名的影响,b)输出可能会随着WinDbg的新版本而改变。第二种方法适用于我,只使用PyKD。太好了@汤马斯韦勒是的,我也不满意。不过,我看到选项#2的唯一缺点是,
ntdll
需要符号,因此它需要一个正确的符号路径。幸运的是,这通常不是问题。