[翻譯]Python2.5,windows XP,VC++2008 Express的環境下安裝Pydasm和Pydbg以及請教

仙果發表於2011-05-15
作者:仙果
注:版權歸原作者所有,雖然本人討厭日本人,轉載請註明出處,謝謝合作

題記:買了一本《Python 灰帽子》,書雖不足200頁,但其中知識確是非常多,得益不少,又因最近在研究Fuzzing的相關問題,需要搭建Fuzzing進行測試,
        隨按照書上的例子進行實驗。網上搜集資料時搜尋到了這篇文章,雖然買這本書的人挺多(今日在中關村圖書大廈還看到某位安全愛好者買了這本書),
        但卻是沒有看到誰把Python環境搭建的文章發表出來,本著方便自己的想法把這篇文章翻譯下,抱磚引玉,有些問題想請教一下。Go go Let's go!
        發現自己很羅嗦。

正文:
        昨天試著在自己的筆記本上安裝Pydbg和Pydasm。Pydasm是常用且非常受歡迎的反彙編機器碼(位元組碼)的庫。Pydbg同樣也是非常受歡迎windows 平臺
下輕量級可擴充套件的Python 庫。
        實際上,Pydbg是Windows平臺下PaiMei(白眉)的除錯框架。
        整個過程卻是非常困難的,使用Python distutils充滿了掙扎和陷阱。
        記錄瞭如下的文件,把遇到的問題作為備忘錄,方便其他人(包括我)安裝這些使用C語言和Python編寫非常好的反彙編引擎工具。
        我的筆記本配置如下:
	CPU : Intel Pentium M (Centrino) 1.2GHz
	RAM : 1GB
	OS : Windows XP Professional SP3 (Japanese)
	Python: Python 2.5 (install from MSI installer)
			Install Dir : C:\Python25
	Visual Studio : Visual C++ 2008 Express Edision (SP1)
	Subversion: TortoiseSVN 1.6.x

       
我們在後面會獲取PaiMei(白眉)的更新版本。
        好吧,讓我們開始!
        目錄:
        ^一步步安裝 Pydasm
                獲取 libdasm
                嘗試編譯->錯誤
                避免distutils庫的值校驗
                重新嘗試編譯->建立成功
                安裝Pydasm 並且測試...不是吧,沒有找到"MSVCR90.dll"
                重新編輯 msvccompiler.py 修改編譯選項 -> Pydasm工作正常
       
        一步步安裝 Pydbg
                使用SVN更新和安裝->提示找不到"Python26.dll!?"
                Pydbg中移除Pydasm包->成功!!
                白眉(PaiMei)其他模組的注意事項

一步步安裝Pydasm

        Pydbg依賴於Pydasm。安裝Pydbg之前必須要安裝pydasm。但是Pydasm是使用C語言編寫,並且
在Windows平臺沒有正式發行版的二進位制檔案。
使用的環境如下:
        Python 2.5
        Visual C++ 2008 Express Edition SP1
        Pydasm包含在"Libasm"中,這是一個輕量級的X86反彙編庫。
        Pydasm的作者並不是libasm的作者。Libasm是jt(nologin.org)編寫的,Pydasm的作者則是ero(dkbza.org).
        Pydasm被共享到Libasm中。
                dkbza - Pydasm (只是列出了libasm的下載連結,簡述和一些示例程式碼)
                http://dkbza.org/pydasm.html
        現在我們來下載libasm,如下的連結包含Pydasm
                Libasm : nologin--程式碼
                http://www.nologin.org/main.pl?action=codeView&codeId=49&
        下載成功後,解壓tar.gz到任意目錄。
        昨天下載了Libasm-1.5.tar.gz。解壓後,得到了如下的目錄樹:
		libdasm-1.5\
		libdasm.c
		README.txt
		...
		bin\
		pydasm\
		...

        下一步,開啟命令列視窗,進入 VC++ 環境變數(如:vcvars32.bat)。確認"C:\Python25"被新增到環境變數的
的路徑當中,或者".py"字尾名的檔案已經與"C:\Python25\python.exe"進行關聯。
        在命令列中執行"CD"命令進入到"libdasm-1.5\pydasm"目錄, 輸入如下:
	> setup.py build_ext
	running build_ext
	error: Python was built with Visual Studio 2003;
	extensions must be built with a compiler than can generate compatible binaries.
	Visual Studio 2003 was not found on this system. If you have Cygwin installed,
	you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

       噢!!為什麼? 我的命令列視窗環境在VC++ 工具下確認是可用的!!
	> cl
	Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
	Copyright (C) Microsoft Corporation.  All rights reserved.
	...
	> link
	Microsoft (R) Incremental Linker Version 9.00.30729.01
	Copyright (C) Microsoft Corporation.  All rights reserved.

        最終答案是 Python的distutils (沒有找到這個單詞的相關翻譯,直接引用,譯者注)工具(在steup.py中引用)檢查
Visual Studio 的登錄檔值並且驗證合適的版本來判斷安裝與否。
        不幸的是,我的本地環境VC++2008 Express Edision 的登錄檔鍵值並不是distutils 庫支援的。
        繞過avoiding distutil 的登錄檔鍵值驗證
        如何來繞過這些惱人的登錄檔鍵值驗證呢?答案是編輯distutil 庫原始碼。Python是開源的而且 distutils 是使用
Python語言編寫的。
        (經過我對distutils以及它的原始碼進行研究分析後)
        結論是,修改如下的原始碼:
	C:\Python25\Lib\distutils\msvccompiler.py
	msvccompiler.py:
		...
	class MSVCCompiler (CCompiler) :
		...
		def __init__ (self, verbose=0, dry_run=0, force=0):
			...
			# comment out here!!
			self.__macros = MacroExpander(self.__version)

        在MacroExpander() 函式和它的建構函式中執行登錄檔鍵值校驗,且"self.__macros"是可選的,不是必需的。因此刪除掉
這行並不會影響到編譯。因此刪除掉不需要的這一行,刪除先前的 ".pyc" 檔案,msvccompiler.pyc ,可能存在".py"的相同
目錄。
        嘗試重新編譯->成功了!!
        msvccompiler.py程式碼中,當"DISTUTILS_USE_SDK"和 "MSSdk" 的環境變數設定正確且"cl.exe"可以在環境變數目錄中找到
時是不會進行登錄檔校驗的。因此可以在命令列視窗中設定"DISTUTILS_USE_SDK"和 "MSSdk" :
	> set DISTUTILS_USE_SDK=1
	> set MSSdk=1

        環境變數內容都設定好以後,msvccompiler.py 只會校驗登錄檔鍵是存在且忽略其值。
        OK,嘗試編譯:
	> setup.py build_ext
	running build_ext
	building 'pydasm' extension
	creating build
	creating build\temp.win32-2.5
	creating build\temp.win32-2.5\Release
	C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.exe \
		/c /nologo /Ox /MD /W3 /GX /DNDEBUG \
		-IC:\Python25\include -IC:\Python25\include -IC:\Python25\PC \
		/Tc../libdasm.c /Fobuild\temp.win32-2.5\Release\../libdasm.obj
	C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.exe \
		/c /nologo /Ox /MD /W3 /GX /DNDEBUG \
		-IC:\Python25\include -IC:\Python25\include -IC:\Python25\PC \
		/Tcpydasm.c /Fobuild\temp.win32-2.5\Release\pydasm.obj
	creating build\lib.win32-2.5
	C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\link.exe \
		/DLL /nologo /INCREMENTAL:NO \
		/LIBPATH:C:\Python25\libs /LIBPATH:C:\Python25\PCBuild /EXPORT:initpydasm \
		build\temp.win32-2.5\Release\../libdasm.obj build\temp.win32-2.5\Release\pydasm.obj \
		/OUT:build\lib.win32-2.5\pydasm.pyd \
		/IMPLIB:build\temp.win32-2.5\Release\..\pydasm.lib

        (刪去了編譯時的一些警告)
        當所有工作成功以後,就會得到
	libdasm-1.5\pydasm\build\lib.win32-2.5\pydasm.pyd


安裝 Pydasm並且測試...OH-NO,沒有找到"MSVCR90.dll"!?
       
        現在呼叫安裝命令:
	> setup.py install
	running install
	running build
	running build_ext
	running install_lib
	copying build\lib.win32-2.5\pydasm.pyd -> C:\Python25\Lib\site-packages
	copying build\lib.win32-2.5\pydasm.pyd.manifest -> C:\Python25\Lib\site-packages
	running install_egg_info
	Removing C:\Python25\Lib\site-packages\pydasm-1.5-py2.5.egg-info
	Writing C:\Python25\Lib\site-packages\pydasm-1.5-py2.5.egg-info

        然後呼叫Python和嘗試匯入Pydasm
	> C:\Python25\python.exe
	Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
	Type "help", "copyright", "credits" or "license" for more information.
	>>> import pydasm
	Traceback (most recent call last):
	  File "<stdin>", line 1, in <module>
	ImportError: DLL load failed: 指定されたモジュールが見つかりません。(中文是“找不到指定的模組”,譯者注)
	>>> quit()

O-No,最後的"ImportError"說明指定的模組沒有找到。在我的環境中,視窗顯示的是"MSVCR90.dll 沒有找到"。
       
        檢查模組的依賴關係:
	> dumpbin /dependents C:\Python25\python.exe
	...
	   python25.dll
	   MSVCR71.dll   <-- Python25 depends on MSVCR71.dll
	   KERNEL32.dll
	...
	> dumpbin /dependents build\lib.win32-2.5\pydasm.pyd
	...
	   MSVCR90.dll    <-- pydasm depends on MSVCR90.dll !!
	   python25.dll
	   KERNEL32.dll

        我的環境中,MSVCR90.dll 安裝在 Visual Studio的安裝目錄中,並不是系統目錄。如果你已經安裝包含MSVCR90.dll
的VC執行庫在系統目錄中,那麼匯入錯誤就不會提示,一切工作正確。
        現在如何去做呢?有2中方法解決這個錯誤。
                1.在Windows上安裝包含MSVCR90.dll的VC執行庫。
                        1.這是最簡單的,但是Python使用MSVCR71.dll (使用低版本的Visual Studio進行編譯的),我擔心在兩個動態
                DLL會產生衝突。
                2.靜態連結VC-DLL。
                        1.使用合適的模組,但是需要改變編譯選項,模組檔案大小會變大。
        我強烈擔心兩個動態DLL產生衝突(或者其他錯誤),因此選擇了第二種方法。
        又一次編輯msvccompiler.py, 修改編譯選項->Pydasm正常工作!!
        現在如何修改編譯選項?選擇什麼選項呢?
        msvccompiler.py 在MSVCCompiler 類的初始化方法的安裝編譯選項。
	msvccompiler.py: 
	...
	class MSVCCompiler (CCompiler) :
	...
		def initialize(self):
			...
			self.preprocess_options = None
			if self.__arch == "Intel":
				self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ,
										 '/DNDEBUG']
				self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX',
                                          '/Z7', '/D_DEBUG']

        "/MD" 和"/MDd"表示動態連結多執行緒庫。若要了解關於動態庫和編譯選項的更詳細資訊,檢視MSDN:
       
http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx 
	"MSDN Library" > "Development Tools and Languages" > "Visual Studio 2010" > "Visual Studio" > "Visual Studio Languages" > "Visual C++" > "Visual C++ Reference" > "Visual C++ Libraries Reference" > "Run-Time Library" > "C Run-Time Libraries"

        這次我們需要連結靜態多執行緒庫,因此選擇"/MT" 和 "/MTd"。
	...
	class MSVCCompiler (CCompiler) :
	...
		def initialize(self):
			...
			self.preprocess_options = None
			if self.__arch == "Intel":
				# change '/MD' => '/MT'
				self.compile_options = [ '/nologo', '/Ox', '/MT', '/W3', '/GX' ,
										 '/DNDEBUG']
				# change '/MDd' => '/MTd'
				self.compile_options_debug = ['/nologo', '/Od', '/MTd', '/W3', '/GX',
											  '/Z7', '/D_DEBUG']


        刪除舊的msvccompiler.pyc和pydasm\build目錄,重新嘗試。
	> setup.py build_ext
	> dumpbin /dependents build\lib.win32-2.5\pydasm.pyd
	 Image has the following dependencies:

	   python25.dll
	   KERNEL32.dll
	...
	> setup.py install
	...
	> C:\Python25\python.exe
	Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
	Type "help", "copyright", "credits" or "license" for more information.
	>>> import pydasm
	>>> buffer = '\x90\x31\xc9\x31\xca\x31\xcb'
	>>> offset = 0
	>>> while offset < len(buffer):
	...     i = pydasm.get_instruction(buffer[offset:], pydasm.MODE_32)
	...     print pydasm.get_instruction_string(i, pydasm.FORMAT_INTEL, 0)
	...     if not i:
	...         break
	...     offset += i.length
	...
	nop
	xor ecx,ecx
	xor edx,ecx
	xor ebx,ecx
	>>> quit()

        好了。Pydasm開始工作正常。
        下一步,嘗試安裝(白眉)PaiMei,Pydbg。
        白眉官方文件
        http://pedram.redhive.com/PaiMei/docs/
        白眉google程式碼站
        http://code.google.com/p/paimei/
        其他資源
        http://thatsbroken.com/?p=26
        http://maliciousattacker.blogspot.com/2006/12/pydbg-in-vmware.html
        http://www.openrce.org/downloads/details/208/PaiMei
        http://maliciousattacker.blogspot.com/2007/01/setting-up-pydbg.html

從SVN上下載儲存並安裝->"找不到Python26.dll "

        首先,從SVN源上下載白眉的最新版(並不是匯出)。使用你自己喜歡的SVN工具。昨天我更新了r248編號的原始碼。
        第二步,開啟命令列視窗,CD到白眉的目錄,執行setup.py
	> setup.py build
	(...)
	> setup.py install
	(...)

第三步,嘗試匯入 Pydbg:
	> C:\Python25\python.exe
	Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
	Type "help", "copyright", "credits" or "license" for more information.
	>>> import pydbg
	Traceback (most recent call last):
	  File "<stdin>", line 1, in <module>
	  File "pydbg\__init__.py", line 47, in <module>
		from pydbg                   import *
	  File "C:\in_vitro\SVNWORK\paimei\pydbg\pydbg.py", line 32, in <module>
		import pydasm
	ImportError: DLL load failed: 指定されたモジュールが見つかりません。

錯誤提示視窗表示“沒有找到Python26.dll”。
               經過對Python的堆疊輸出進行仔細的檢視。非常奇怪的發生在"import pydasm"(匯入 Python)上。
        上一節中,我們驗證了"import pydasm"是可以正常工作的。那現在為什麼?

在Pydbg包中移除pydasm.pyd->成功了!!
答案是: Pydbg的模組目錄已經包含了"pydasm.pyd",而且是在 Python 2.6下編譯的。
	> dumpbin /dependents C:\Python25\Lib\site-packages\pydbg\pydasm.pyd
														^^^^^^^^^^^^^^^^ pydasm.pyd was bundled!!
	...
	  Image has the following dependencies:

		MSVCR90.dll
		python26.dll
		KERNEL32.dll
	...

        然後我們簡單的移除 "pydbg\pydasm.pyd"。關閉命令列視窗,一併關閉所有的Python程式,重新開啟命令列視窗
(清除載入的DLL),再試一次:
	> C:\Python25\python.exe
	Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
	Type "help", "copyright", "credits" or "license" for more information.
	>>> import pydbg
	>>>

        好的,沒有任何錯誤。
       
        最後,呼叫calc.exe ,得到它的PID,例子如下:
	from pydbg import *
	from pydbg.defines import *
	def handler_breakpoint (pydbg):
	  if pydbg.first_breakpoint:
		print "[*] Hit 1st breakpoint!"
		return DBG_CONTINUE
	  print "[*] Hit breakpoint!"
	  return DBG_CONTINUE
	dbg = pydbg()
	dbg.set_callback(EXCEPTION_BREAKPOINT, handler_breakpoint)
	dbg.attach(XXXXX) # pid of calc.exe
	recv = dbg.func_resolve("user32", "ShowWindow")
	dbg.bp_set(recv)
	dbg.debug_event_loop()

        例如:
	> C:\Python25\python.exe
	Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
	Type "help", "copyright", "credits" or "license" for more information.
	>>> from pydbg import *
	>>> from pydbg.defines import *
	>>> def handler_breakpoint (pydbg):
	...   if pydbg.first_breakpoint:
	...     print "[*] Hit 1st breakpoint!"
	...     return DBG_CONTINUE
	...   print "[*] Hit breakpoint!"
	...   return DBG_CONTINUE
	...
	>>> dbg = pydbg()
	>>> dbg.set_callback(EXCEPTION_BREAKPOINT, handler_breakpoint)
	>>> dbg.attach(5084)
	<pydbg.pydbg.pydbg instance at 0x00BF8198>
	>>> recv = dbg.func_resolve("user32", "ShowWindow")
	>>> dbg.bp_set(recv)
	<pydbg.pydbg.pydbg instance at 0x00BF8198>
	>>> dbg.debug_event_loop()
	[*] Hit 1st breakpoint!
	[*] Hit breakpoint!
	...
	(minimize, or restore calc window)
	...
	[*] Hit breakpoint!
	>>> quit()

        白眉其他模組的注意事項
        這篇文章中,我們只需要安裝白眉的Pydbg。忽略瞭如何安裝白眉的其他模組,如PIDA,GUI部件。如果你想安裝這些模組
白眉都是可以設定的,透過閱讀官方文件或者在SVN下載原始碼"docs/index.html" 。

        這是這篇文章的翻譯,由於本人英語水平的問題,文中肯定有錯誤之處,歡迎指正。
下面我說下自己的環境
	OS:XP SP3_CN
	VC:Visual Studio 2008 Team SP1
	PY:Python 2.7

        按理說Python2.7是可以可以安裝Pydbg的,我安裝Pydasm是可以正常工作的,已經測試了,下載安裝Pydbg的時候就報錯了
請教其他安裝Pydbg的朋友,你們遇到這個問題沒,該如何解決?
        仙果感激不盡!
Python-Installing pydasm and pydbg with Python 2_5, WinXP, VC++2008 Express Edition及中文翻
上傳的附件:

相關文章