在 PyKD 中获取可执行文件的模块
Get the executable's module in PyKD
在 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
你的问题实际上比你描述的更隐蔽。我看到使用 short (MSDOS compatible) name 加载的模块在哪里被破坏得更多。
我唯一能想到的来回答你的问题是有点乱七八糟。如果您假设占用最低地址 space 的模块是可执行文件的模块,那么您可以使用 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 回到 NT 4.0 都是如此,但情况可能并非总是如此。例如,如果地址 Space 布局随机化 (ASLR) 完全打破了与它相关的任何进程启用的这一假设,我一点也不会感到惊讶。
编辑:
一种更安全的方法是查看基地址中的 PEB
for the ImageBaseAddress
. This is the module start address for the base module. You can construct a pykd module
类型,如下所示:
from pykd import *
peb = typedVar("ntdll!_PEB", getProcessOffset())
exeModule = module(peb.ImageBaseAddress)
print exeModule
如果 _PEB
结构发生变化,这应该会更可靠地工作,并且更容易失败。
在 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
你的问题实际上比你描述的更隐蔽。我看到使用 short (MSDOS compatible) name 加载的模块在哪里被破坏得更多。
我唯一能想到的来回答你的问题是有点乱七八糟。如果您假设占用最低地址 space 的模块是可执行文件的模块,那么您可以使用 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 回到 NT 4.0 都是如此,但情况可能并非总是如此。例如,如果地址 Space 布局随机化 (ASLR) 完全打破了与它相关的任何进程启用的这一假设,我一点也不会感到惊讶。
编辑:
一种更安全的方法是查看基地址中的 PEB
for the ImageBaseAddress
. This is the module start address for the base module. You can construct a pykd module
类型,如下所示:
from pykd import *
peb = typedVar("ntdll!_PEB", getProcessOffset())
exeModule = module(peb.ImageBaseAddress)
print exeModule
如果 _PEB
结构发生变化,这应该会更可靠地工作,并且更容易失败。