最近要逆向一個pyd文件,無意中要用到用boost庫生成的pyd文件,這其中的環境配置過程很漫長,特意將配置或者說安裝使用的過程記錄一下。python中使用C++生成的動態庫方法我知道的現在是兩種,(1)通過boost庫生成dll,然后改名成后綴名pyd給python使用,(2)通過python的ctypes庫直接加載dll文件使用。
先說一下第二種方式,這種比較簡單,不用怎么配置環境,網上能搜到很多ctypes使用的方法,唯一需要注意的是,在32位的python使用32位的dll,64位的python中使用64位的dll,如果生成的dll在加載時老是提示找不到dll,是因為這個dll依賴於其它的dll,如果沒依賴自己寫的其他庫,則可能是VS的環境變量沒裝好,配置好環境變量或者重裝一遍VS。
着重說下第一種方式,過程如下:
1) 下載boost庫,下載時有壓縮文件格式,也有exe格式,我使用的壓縮文件格式;
2) 安裝boost庫:解壓縮,然后通過VS的開發工具命令提示(
Win鍵,然后從VS程序下選擇,想要生成32位的pyd文件,則選擇32位的工具,如果是生成64位的pyd文件,則選擇64位兼容的工具,VS2015下選擇VS2015 x86 x64 兼容工具命令提示符
)來運行bootstrap.bat腳本文件,會生成bjam.exe和b2.exe,其實二者是完全一樣的文件,運行其中一個即可,運行直到結束需要花至少20多分鍾,64位的更長,直接運行時,會將生成的文件全部放到bjam.exe當前目錄,當然也可以指定存放目錄,命令如下:
x86安裝則輸入命令:
b2.exe --prefix=D:\boost\x86 --build-type=complete --build-dir=build_tmp toolset=msvc-14.0 address-model=32 install
("D:\boost\x86"是將要生成32位的include和lib文件夾放置的位置,build_tmp是位於安裝包中用於放置中間生成物的文件夾)
x64安裝則輸入命令:
b2.exe --prefix=D:\Boost\x64 --build-type=complete --build-dir=build_tmp_x64 toolset=msvc-14.0 address-model=64 install
(msvc-14.0指的是一個平台,這里是VS2015, msvc-12.0是VS2013,什么VS版本就指定什么平台)。
3)使用配置好的boost庫
用對應版本的VS創建一個dll工程,在其中寫入一些使用boost庫的代碼,網上很多,這里就不再記錄。加入代碼后,直接運行會報各種錯的,因為找不到頭文件和鏈接庫,所以要在:項目——屬性——C/C++——常規中的附加庫目錄中加入***\Python36\include和 ***\boost_1_66_0目錄,項目——屬性——鏈接庫——常規——附加庫目錄中加入***\Python36\libs 和 D:\Boost\x64\lib(如果是直接運行b2.exe或者bjam.exe則是在當前目錄的\stage\lib目錄,如:E:\Program Files (x86)\boost_1_63_0\stage\lib)。雖然有些麻煩,但最后成功的那一下是很喜悅的。
4)生成的dll文件在使用時,可能老是提示找不到dll,這是因為使用的dll中依賴的庫找不到,通過cff或者ida等工具查看一下使用bost庫生成的dll中依賴的哭還蠻多,包含的 python36.dll 和 boost_python3-vc140-mt-x64-1_66.dll (不同版本名稱略微不同)庫不是系統庫,確保這兩個庫所在的路徑在環境變量中就行,其它的依賴庫基本都是系統自帶庫,不用管,如果還不行,再用 everything 搜一下其它庫是否存在。要確信,加載不成功,肯定是找不到某些相應的庫。