python中调用用C++写的dll——20180902

2018/09/02 15:10
阅读数 22

    最近要逆向一个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 搜一下其它库是否存在。要确信,加载不成功,肯定是找不到某些相应的库。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部