引言
我们可以使用LoadLibrary()
或LoadLibraryEx()
来显式地加载某个dll,在我们未提供dll全路径或调用SetDefaultDllDirectories和 AddDllDirectory两个API对DLL路径进行设置时,系统依然会尝试着在某些目录下寻找我们想要的DLL文件,在寻找DLL时,Windows系统会按一定的顺序在不同的目录下查找.
Windows查找DLL的顺序
在以前的Windows版本(Windows xp sp2之前),系统在寻找某个DLL时,会按照以下顺序搜索:
- 应用程序EXE所在的路径。
- 当前目录(可通过SetCurrentDirectory设置,GetCurrentDirectory获取)
- 系统目录(通常是C:\Windows\System32,WOW64程序也会重定向到C:\Windows\SysWOW64目录,可以通过GetSystemDirectory获取)
- 16位系统目录(通常是,C:\Windows\System)
- Windows目录(通常是,C:\Windows,可以通过GetWindowsDirectory获取)
- PATH环境变量指定的目录
由于很多恶意程序利用这一机制,在程序的当前目录放置与程序欲加载的DLL同名的假DLL文件,导致程序加载了错误的DLL(这一过程又叫DLL劫持),在Windows xp sp2之后,WIndows系统默认开启了一种名为安全DLL搜索模式(SafeDllSearchMode)的机制,该机制将使系统按如下模式搜索DLL:
- 应用程序EXE所在的路径。