首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PyKD中获取可执行文件的模块

在PyKD中获取可执行文件的模块
EN

Stack Overflow用户
提问于 2015-08-24 22:02:10
回答 1查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
0:017> !py
...
>>> getProcessExeName()
u'C:\\Windows\\SysWOW64\\rundll32.exe'

我可以通过

代码语言:javascript
复制
>>> 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-24 23:21:13

你的问题实际上比你描述的更阴险。我已经看到使用短(MSDOS兼容)名称加载的模块被损坏得更多了。

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

这意味着你可以:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
from pykd import *

exeModuleName = dbgCommand("lm1m").split('\n')[0]
exeModule = module(exeModuleName)
print exeModule

这仍然取决于一种假设。尽管我观察到Windows的所有版本回到NT4.0时都是正确的,但情况可能并不总是如此。例如,如果Address布局随机化(,ASLR)完全打破了与其链接的任何进程的假设,我一点也不感到惊讶。

编辑:

要做到这一点,更安全的方法是查看用于PEBImageBaseAddress。这是基本模块的模块起始地址。您可以从基地址构建pykd module类型,如下所示:

代码语言:javascript
复制
from pykd import *

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

如果_PEB结构发生变化,这应该会更可靠一些,而且失败的可能性也会更大。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32192459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档