在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,Python2.7.8
发布于 2015-08-24 23:21:13
你的问题实际上比你描述的更阴险。我已经看到使用短(MSDOS兼容)名称加载的模块被损坏得更多了。
我唯一能回答你问题的办法就是做点小插曲。如果假设占用最低地址空间的模块是可执行文件的模块,则可以使用lm和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时都是正确的,但情况可能并不总是如此。例如,如果Address布局随机化(,ASLR)完全打破了与其链接的任何进程的假设,我一点也不感到惊讶。
编辑:
要做到这一点,更安全的方法是查看用于PEB的ImageBaseAddress。这是基本模块的模块起始地址。您可以从基地址构建pykd module类型,如下所示:
from pykd import *
peb = typedVar("ntdll!_PEB", getProcessOffset())
exeModule = module(peb.ImageBaseAddress)
print exeModule如果_PEB结构发生变化,这应该会更可靠一些,而且失败的可能性也会更大。
https://stackoverflow.com/questions/32192459
复制相似问题