2015-08-24 21 views
0

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

回答

1

您的問題實際上比你的描述更陰險。我已經看到使用他們的short (MSDOS compatible) name加載模塊的地方甚至更多。

我可以拿出來回答你的問題的唯一一件事是一個黑客。如果您認爲佔用最低地址空間的模塊是可執行文件的模塊,則可以使用lm1m標誌來列出所有模塊,但僅使用第一個模塊。

這意味着你可以這樣做:

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)完全打破了與其關聯的任何過程的假設,我不會感到驚訝。


編輯:

一點點更安全的方式來做到這一點是看PEBImageBaseAddress。這是基本模塊的模塊起始地址。您可以構建一個pykd module型出基地址,像這樣:

from pykd import * 

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

這應該有點更可靠和更失敗可斷定,名_PEB結構發生改變。

+0

我不喜歡'dbgCommand()',因爲a)它可能會受到別名的影響,並且b)輸出可能會隨着新版本的WinDbg而改變。第二種方法適用於我,只使用PyKD。那很棒! –

+0

@ThomasWeller是的,我也不滿意。然而,我看到選項#2唯一的缺點就是你需要'ntdll'的符號,所以它需要一個合適的符號路徑。幸運的是,這通常不是問題。 –

相關問題