来自:http://blog.csdn.net/chence19871/article/details/38087155
DLL的搜索路径顺序:
· The directory from which the application loaded.
· The system directory.
· The 16-bit system directory.
· The Windows directory.
· The current directory.
· The directories that are listed in the PATH environment variable.
防御策略:
1. 保护游戏目录,不是自己的程序不让拷贝。(主要是防止被加入恶意的DLL到游戏的目录,驱动实现)。
2. 创建一份游戏模块的白名单,游戏启动时对游戏目录下的文件进行检查,检查可疑的文件。白名单可本地加密存储。
3. 将容易被劫持的Windows DLL 写进注册表,那么凡是此项下的DLL文件就会被禁止从EXE自身目录下调用,而只能从系统目录,也就是system32目录下调用。防止从游戏目录加载其它DLL。注册表路径:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs]。确保用户的机器上面的KnownDLLs下是完整的。
4. 确保windows文件保护功能是打开的。“计算机配置”→“管理模板”→“系统”→“Windows 文件保护”.
5. 将游戏的DLL打上签名,防止自身的DLL被劫持。游戏运行时检查游戏目录下模块的签名。(没有签名拒绝加载--必须确保检查签名服务打开)
注意:通过命令行“net stop cryptsvc”关闭签名检验服务可使得客户端签名校验失效。
6. 使用Process Monitor 检查游戏进程的可劫持的DLL 。
一些针对DLL劫持的安全编码的规范:
1)调用LoadLibrary,LoadLibraryEx,CreateProcess,ShellExecute等进行模块加载的函数时,指明模块的完整(全)路径,禁止使用相对路径,这样就可避免从其它目录加载DLL。
2)在应用程序的开头调用SetDllDirectory(TEXT(""));从而将当前目录从DLL的搜索列表中删除,也就是搜索时不搜索当前目录。SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory这几个API配合使用,可以有效的规避DLL劫持问题。可惜的是,这些API只能在打了KB2533623补丁的Windows7,2008上使用。
思考:
如果劫持的不是游戏自己的DLL,通常选择劫持那些导出函数较少的不是关键的系统DLL,如USP10.DLL, LPK.DLL, KSUSER.DLL, MIDIMAP.DLL,COMRES.DLL, d3d8.dll, sxs.dll等。可重点检查这些模块。
参考:
http://blog.csdn.net/magictong/article/details/6931520
http://security.tencent.com/index.php/blog/msg/20
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ff919712(v=vs.85).aspx
附:
WIN 7 x64
默认的表里只包含了3个容易被劫持的DLL。可添加其它容易被劫持的DLL到注册表当中。
Xp sp3