标题：dll劫持
DLL劫持原理
DLL劫持技术当一个可执行文件运行时，Windows加载器将可执行模块映射到进程的地址空间中，加载器分析可执行模块的输入表，并设法找出任何需要的DLL，并将它们映射到进程的地址空间中。
由于输入表中只包含DLL名而没有它的路径名，因此加载程序必须在磁盘上搜索DLL文件。首先会尝试从当前程序所在的目录加载DLL，如果没找到，则在Windows系统目录中查找，最后是在环境变量中列出的各个目录下查找。利用这个特点，先伪造一个系统同名的DLL，提供同样的输出表，每个输出函数转向真正的系统DLL。程序调用系统DLL时会先调用当前目录下伪造的DLL，完成相关功能后，再跳到系统DLL同名函数里执行。这个过程用个形象的词来描述就是系统DLL被劫持（hijack）了。
利用这种方法取得控制权后，可以对主程序进行补丁。此种方法只对除kernel32.dll、ntdll.dll等核心系统库以外的DLL有效，如网络应用程序的ws2_32.dll、游戏程序中的d3d8.dll，还有大部分应用程序都调用的lpk.dll、sxs.dll，这些DLL都可被劫持。
伪造的dll制作好后，放到程序当前目录下，这样当原程序调用原函数时就调用了伪造的dll的同名函数，进入劫持DLL的代码，处理完毕后，再调用原DLL此函数。
这种补丁技术，对加壳保护的软件很有效，选择挂接的函数最好是在壳中没有被调用的，当挂接函数被执行时，相关的代码已被解压，可以直接补丁了。在有些情况下，必须用计数器统计挂接的函数的调用次数来接近OEP。此方法巧妙地绕过了壳的复杂检测，很适合加壳程序的补丁制作。
一些木马或病毒也会利用DLL劫持技术搞破坏，因此当在应用程序目录下发现系统一些DLL文件存在时，如lpk.dll，应引起注意。
如何防止DLL劫持
DLL劫持利用系统未知DLL的搜索路径方式，使得程序加载当前目录下的系统同名DLL。所以可以告诉系统DLL的位置，改变加载系统DLL的顺序不是当前目录，而是直接到系统目录下查找。
这个想法可以通过修改注册表实现。
在注册表键值：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
是调用系统DLL的首要查找目录。例如里面有RE_SZ类型的"ntdll"="ntdll.dll"项，则系统载入"ntdll"时会直接从系统目录加载。
由此，添加"LPK"="LPK.DLL"即可防止LPK被劫持，同理可以阻止一些其他DLL被劫持，例如"USP10"。
在Windows NT系统，XP默认只有少数关键DLL在此键值下，Win7下面此键值已经相当齐全，在Win7系统下发生DLL劫持的概率要比XP小很多。
一 回顾DLL挟持的发展
2010年08月24日微软发布安全公告2269637，提到三方软件编程不安全存在一个DLL挟持的缺陷可以导致远程攻击
2010年08月24日流行的漏洞信息共享网站exploit-db马上就爆出多个DLL挟持漏洞涉及的软件有：Wireshark（免费嗅探器）,Windows Live email（邮箱客户端）, Microsoft MovieMaker（视频编辑处理），Firefox（网页浏览器）, uTorrent （BT下载工具），PowerPoint 2010（办公软件）等
2010年08月25日－26日漏洞信息共享网站exploit-db继续爆出Winamp,Google Earth,Photoshop等软件存在DLL挟持漏洞，同时发布这个blog之前笔者的电脑中已经发掘存在的流行软件有，QQ影音，QQ音乐，美图秀秀，ppstream等
二新老DLL挟持的攻击原理分析和防御
1 动态链接库文件通常加载顺序如下
windows xp sp2系统以上会默认开启SafeDllSearchMode，安全dll搜索模式下DLL文件的搜索顺序如下所示
（1）可执行程序加载的目录（可理解为程序安装目录比如 C:\Program Files\uTorrent）（2）系统目录（即 %windir%\system32 ）（3）16位系统目录（即 %windir%\system）（4）Windows目录（即 %windir%）（5）运行某文件的所在目录，比如C:\Documents and Settings\Administrator\Desktop\test）（6）PATH环境变量中列出的目录
2 老DLL挟持触发的原理解析和防御（漏洞触发在DLL搜索流程的第一层，运行程序即加载病毒）
（1）老DLL挟持的特点：
为了增加触发的概率，通常会使用usp1.dll，ws2_32.dll，lpk.dll等应用程序所必须的系统dll文件，然后利用DLL搜索第一顺位是程序安装目录，在程序安装目录释放一个同名DLL文件，抢先加载恶意病毒DLL文件，从而达到破坏的作用。这里可执行程序相当于恶意dll的加载器
（2）老DLL挟持病毒利用回顾重现
2007年罗姆病毒（ws2_32.dll导致很多杀毒软件无法打开），2009年春节猫癣病毒（usp10.dll导致很多用户重装系统都无法解决病毒问题）
通常使用老DLL挟持的病毒木马会枚举电脑里面的所有exe目录，然后将恶意的usp10.dll释放到每个exe所在的目录。当用户执行一个应用程序的时候，将会把恶意的usp10.dll文件优先加载从而感染系统
根据前面介绍的DLL加载顺序，运行程序的时候会优先到程序执行的目录下加载必须文件，下图显示了utorrent.exe在安装目录下的找到了usp10.dll文件并把它加载到内存中。
（3）老DLL挟持的通用免疫方案
可以通过编辑HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs来添加需要面议的DLL文件，比如：新建一个ws2_32 指向ws2_32.dll
3  新DLL挟持触发的原理解析和防御（漏洞触发在DLL搜索流程的第五层，运行图片即加载病毒）
（1）新DLL挟持的特点：
应用程序为了扩展或者兼容等目的需要加载相应的DLL文件，但是因为某些原因导致这个DLL文件默认不存在于当前系统，比如plugin_dll.dll文件默认情况下不存在utorrent的安装目录，dwmapi.dllxp环境下不存在（Vista以上系统存在），ie6环境下没有ieframe.dll（ie7以上版本存在）。正是因为程序需要的DLL文件在DLL搜索顺序的（1）－（4）中都不可能存在，此时就会尝试加载文件所在目录下的恶意dll文件，从而达到破坏的作用。这里运行的文件（比如mp3）相当于触发者，根据文件关联它会启动一个应用程序去播放mp3文件。而因为应用程序存在DLL挟持漏洞（比如QQ影音），此时QQ影音就会因为设计上的不足导致成为恶意DLL的加载器。相当于老DLL挟持，简直达到了运行图片/视频文件就会执行恶意文件的目的，当然前提是大灰客们能猜中你电脑里面的默认查看的软件是否存在DLL挟持漏洞了，目前已经发现的存在DLL挟持缺陷的主要有以下几类
① 特定系统环境下的文件
典型的有dwmapi.dll文件，xp环境下不存在，vista以上版本存在，也就是说需要触发这个漏洞的系统环境只能是XP系统
② 特定软件版本下的文件
典型的有：ieframe.dll，IE6下不 存在，ie7以上版本有，也就是说触发漏洞的电脑IE必须是IE6版本
③ 特定的库文件
典型的有：mfc80chs.dll
④ 程序自己需要的dll文件，可能是为了功能扩展或者兼容
典型的有：plugin_dll.dll
⑤ 其它未知
（2）新DLL挟持利用重现
通常灰客们会先通过DLL挟持挖掘工具寻找存在DLL挟持漏洞的流行应用程序，然后构造相应的文件上传到网络上供用户下载（具体的传播方式请看下一章），如果用户的电脑存在漏洞那么运行相应文件的时候就会执行存在漏洞的程序，从而使得恶意dll被不知不觉加载
根据前面介绍的DLL加载顺序和新DLL挟持的特点，程序在前四个流程都没有找到需要的文件，只能勉为其难的在第五流程－当前文件目录下加载恶意dll文件，下图就显示了uTorrent加载plugin_dll.dll顺序（前四个流程都是 name not found）并且加载当前目录下恶意plugin_dll.dll文件（第五流程显示的是success ）的过程

（3）新DLL挟持的免疫
目前微软没有提供有效的免疫方案可以使用，建议升级你常用软件到最新版本.
三 新DLL挟持可能存在的攻击方式
exploit-db公布了存在DLL Hijacking的大量常用软件，这些软件里面有视频音频播放器，图像设计浏览软件，IM聊天工具，文字处理软件，网页浏览器，下载软件，杀毒软件。根据在下的一点拙见如果病毒作者想要利用这个漏洞来实现广泛传播的话主要有几种方式。
1  BT下载大片传播
挖掘出支持BT下载的流行软件（比如uTorrent ）的DLL Hijacking漏洞，然后构造一个恶意dll文件（估计会设置隐藏属性，这样你解压以后将不会看到这个文件）和BT种子文件打包成压缩包上传到网上供用户下载，用户一旦下载了这个压缩包双击BT种子文件的时候会调用uTorrent 打开，uTorrent 运行的时候由于设计上的不河蟹根据dll加载的顺序最后会将种子所在目录的恶意dll加载
2  美女图片分享传播
挖掘出流行图片浏览工具（比如美图秀秀）的DLL Hijacking漏洞，然后构造一个恶意dll文件（估计会设置隐藏属性，这样你解压以后将不会看到这个文件）和图片文件打包成压缩包上传到网上供用户下载，用户一旦下载了这个压缩包，解压浏览美女靓照的时候可能会调用图片浏览工具打开从而触发漏洞加载恶意dll文件
3  软件下载包含的网页文件传播
挖掘出流行网页浏览工具（比如firefox）的DLL Hijacking漏洞，然后构造一个恶意dll文件（估计会设置隐藏属性，这样你解压以后将不会看到这个文件），应用程序和htm等网页文件打包成软件压缩包并上传到网上供用户下载。用户一旦下载了这个软件压缩包，解压以后运行安装必看.htm之类的网页文件会调用网页浏览工具打开从而触发漏洞加载恶意dll文件
4  热门视频音频文件传播
挖掘出流行视频音频播放工具（比如QQ影音）的DLL Hijacking漏洞，然后构造一个恶意dll文件（估计会设置隐藏属性，这样你解压以后将不会看到这个文件）和rmvb等视音频文件打包压缩包并上传到网上供用户下载。用户一旦下载了这个压缩包，解压播放相应视频的时候从而触发漏洞加载恶意dll文件
5  目前公布的部分软件列表
Google Earth
Nullsoft Winamp 5.581
Media Player Classic 6.4.9.1
Mozilla Thunderbird
Microsoft Office PowerPoint 2007
Adobe InDesign CS4
Nvidia Driver
Adobe Illustrator CS4
Adobe Premier Pro CS4
Skype <= 4.2.0.169
TechSmith Snagit 10
Safari v5.0.1
uTorrent
Microsoft Visio 2003
Adobe Photoshop CS2
avast! <= 5.0.594
Adobe Dreamweaver CS5
Opera v10.61
Firefox <= 3.6.8
四  DLL安全编程，避免产生DLL挟持问题
(1） 调用LoadLibrary， LoadLibraryEx， CreateProcess的，或者 的ShellExecute 等涉及到模块加载的函数的时候，指定DLL加载的完整路径，貌似应该有API可以获取当前程序运行的目录的
（2）考虑使用 的DLL重定向 或 Manifests文件 ，以确保您的应用程序使用正确的DLL。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
（3）确保DLL安全搜索模式被激活。未使用安全搜索设置的话，第二加载项就是当前目录。
HKLM\System\CurrentControlSet\Control\Session Manager \ SafeDllSearchMode
（4）从搜索列表中取消当前目录，可以通过调用SetDllDirectory 参数设置为一个空字符串