定位Dll加载异常的方法
总体说明
动态库加载异常的原因有以下几种:
1.dll不在dll搜索路径
2.dll依赖的其他dll不在dll搜索路径
3.dll与exe不是同一架构,如exe是64位,dll是32位
4.dll或依赖的dll其导出函数对不上
dll依赖的其他dll不在dll搜索路径
注意dll的搜索路径永远是exe所在的当前路径
使用x64dbg去打开dll的话,如果dll的依赖的其他dll找不到了,并不会报错,而是直接调试结束,无法断在入口断点
dll或依赖的dll其导出函数对不上
下面是两个动态库,win32crypt.pyd依赖了pywintypes37.dll
点击这里获取素材
我们使用x64dbg
打开win32crypt.pyd
出现了上面的错误,说win32crypt.pyd
的导入函数?PyWinObject_FromOLECHAR@@YAPEAU_object@@PEB_WH@Z
,找不到实现
我们将?PyWinObject_FromOLECHAR@@YAPEAU_object@@PEB_WH@Z
进行解码为struct _object * __ptr64 __cdecl PyWinObject_FromOLECHAR(wchar_t const * __ptr64,int)
如何解码请查看c++命名粉碎及快速还原
使用ida
打开win32crypt.pyd
,查看导入函数,搜索PyWinObject_FromOLECHAR
发现有问题的函数来自pywintypes37.dll
使用ida
打开pywintypes37.dll
,查看导出函数,搜索PyWinObject_FromOLECHAR
发现其函数名为PyWinObject_FromOLECHAR(wchar_t const * __ptr64,__int64)
,和win32crypt.pyd
的不同之处在于第二个参数为__int64
,这样就对不上了,而导致导入失败