标题：映像劫持IFEO
映像劫持简介
“映像劫持”，也被称为“IFEO”（Image File Execution Options，其实应该称为“Image Hijack”，后面章节会详细提到，至少也应该称为IFEO Hijack而不是只有“IFEO”自身！），它的存在自然有它的理由，在WindowsNT架构的系统里，IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定，系统厂商之所以会这么做，是有一定历史原因的，在Windows NT时代，系统使用一种早期的堆（Heap，由应用程序管理的内存区域）管理机制，使得一些程序的运行机制与现在的不同，而后随着系统更新换代，厂商修改了系统的堆管理机制，通过引入动态内存分配方案，让程序对内存的占用更为减少，在安全上也保护程序不容易被溢出，但是这些改动却导致了一些程序从此再也无法运作，为了兼顾这些出问题的程序，微软以“从长计议”的态度专门设计了“IFEO”技术，它的原意根本不是“劫持”，而是“映像文件执行参数”！
“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”内，使用与可执行程序文件名匹配的项目作为程序载入时的控制依据，最终得以设定一个程序的堆管理机制和一些辅助机制等，大概微软考虑到加入路径控制会造成判断麻烦与操作不灵活的后果，也容易导致注册表冗余，于是IFEO使用忽略路径的方式来匹配它所要控制的程序文件名，例如IFEO指定了对一个名为“小金.EXE”的可执行程序文件进行控制，那么无论它在哪个目录下，只要它名字还叫“小金.EXE”，它就只能在IFEO的五指山里打滚了。
实例操作
具体步骤说了半天都只是纯粹的概念，那么IFEO到底是怎么样发挥作用的呢？例如有一个程序文件名为“xiaojin.exe”，由于使用了旧的堆管理机制，它在新系统里无法正常运行甚至出现非法操作，为了让系统为其提供旧的堆管理机制，我们需要IFEO来介入，则需执行以下步骤：
1.        确保在管理员状态下执行regedit.exe，定位到以下注册表项：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
2.        在“Image File Execution Options”下建立一个子键，名为“xiaojin.exe”，不区分大小写。现在确保位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\xiaojin.exe\下，建立一个字符串类型的注册表项，名为“DisableHeapLookAside”，值为“1”
3.        再次运行xiaojin.exe查看运行情况，如果真的是由于堆管理机制引发的问题，则程序得以正常运行，否则该程序问题不属于IFEO能够干涉的范围，或者需要尝试搭配其他的参数使用。IFEO参数ApplicationGoo
Debugger
PageHeapFlags
DisableHeapLookAside
DebugProcessHeapOnly
PageHeapSizeRangeStart
PageHeapSizeRangeEnd
PageHeapRandomProbability
PageHeapDllRangeStart
PageHeapDllRangeEnd
GlobalFlag
BreakOnDllLoad
ShutdownFlags
详细介绍‍
说白了，IFEO本质是系统厂商为某些可能以早期设计模式运行的软件提供一种保全措施而设计出来的产物，并对其加以扩充形成了一套可用于调试程序的简易方案，如“BreakOnDllLoad”参数可设定在载入某个DLL时设置断点，便于程序员调试ISAPI接口；带有“Range”字样的几个参数则用于限制堆的大小等。
而里面有一个导致了今天这种局面的参数：Debugger。或许微软当初的用意是便于程序员能够通过双击某个设置了IFEO控制列表的执行体文件来直接调用调试器对其进行调试，而不用再通过繁琐的打开调试器再进行文件载入来实现调试，提高了工作效率。
为了使得IFEO能够影响到任何一个程序启动请求，NT架构中将IFEO的优先权设置得很高，基本上，当用户要求执行某个程序时，系统首先判断该程序文件是否可执行体，然后就到IFEO的入口项进行文件名配对了，直到通过IFEO这一步后，进程才真正开始申请内存创建起来。
如果系统在IFEO程序列表里匹配了当前运行的文件名，它就会读取文件名下的参数，这些参数在未被人为设置之前均有个默认值，而且它们也具备优先权，“Debugger”的优先权是最高的，所以它是第一个被读取的参数，如果该参数未被设置，则默认不作处理，如果设置了这个参数，就有可能发生“映像劫持”。
记住，惹祸的参数只有一个，那就是“Debugger”，将IFEO视为映像劫持，大概是因为国内一些人直接套用了“Image File Execution Options”的缩写罢，在相对规范的来自Sysinternals的专业术语里，利用这个技术的设计漏洞进行非法活动的行为应该被称为“Image Hijack”，这才是真正字面上的“映像劫持”。
Debugger参数，直接翻译为“调试器”，它是IFEO里第一个被处理的参数，其作用是属于比较匪夷所思的，系统如果发现某个程序文件在IFEO列表中，它就会首先来读取Debugger参数，如果该参数不为空，系统则会把Debugger参数里指定的程序文件名作为用户试图启动的程序执行请求来处理，而仅仅把用户试图启动的程序作为Debugger参数里指定的程序文件名的参数发送过去，
在系统执行的逻辑里，这就意味着，当一个设置了IFEO项Debugger参数指定为“notepad.exe”的“iexplore.exe”被用户以命令行参数“-nohome ”请求执行时，系统实际上到了IFEO那里就跑去执行notepad.exe了，而原来收到的执行请求的文件名和参数则被转化为整个命令行参数“C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome”来提交给notepad.exe执行，所以最终执行的是“notepad.exe C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome ”，即用户原来要执行的程序文件名iexplore.exe被替换为notepad.exe，而原来的整串命令行加上iexplore.exe自身，都被作为新的命令行参数发送到notepad.exe去执行了，所以用户最终看到的是记事本的界面，并可能出现两种情况，一是记事本把整个iexplore.exe都作为文本读了出来，二是记事本弹出错误信息报告“文件名不正确”，这取决于iexplore.exe原来是作为光杆司令状态请求执行（无附带运行命令行参数）的还是带命令行参数执行的。
由于Debugger参数的这种特殊作用，它又被称为“重定向”（Redirection），而利用它进行的攻击，又被称为“重定向劫持”（Redirection Hijack），它和“映像劫持”（Image Hijack，或IFEO Hijack）只是称呼不同，实际上都是一样的技术手段。
讲解完Debugger参数的作用，现在我们来看看“映像劫持”到底是怎么一回事，遭遇流行“映像劫持”病毒的系统表现为常见的杀毒软件、防火墙、安全检测工具等均提示“找不到文件”或执行了没有反应，于是大部分用户只能去重装系统了，但是有经验或者歪打正着的用户将这个程序改了个名字，就发现它又能正常运行了，这是为什么？答案就是IFEO被人为设置了针对这些流行工具的可执行文件名的列表了，而且Debugger参数指向不存在的文件甚至病毒本身！
以超级巡警的主要执行文件AST.exe为例，首先，有个文件名为kkk.exe的恶意程序向IFEO列表里写入AST.exe项，并设置其Debugger指向kkk.exe，于是系统就会认为kkk.exe是AST.exe的调试器，这样每次用户点击执行AST.exe时，系统执行的实际上是作为调试器身份的kkk.exe，至于本该被执行的AST.exe，此刻只能被当作kkk.exe的执行参数来传递而已，而由于kkk.exe不是调试器性质的程序，甚至恶意程序作者都没有编写执行参数的处理代码，所以被启动的永远只有kkk.exe自己一个，用户每次点击那些“打不开”的安全工具，实际上就等于又执行了一次恶意程序本体！这个招数被广大使用“映像劫持”技术的恶意软件所青睐，随着OSO这款超级U盘病毒与AV终结者（随机数病毒、8位字母病毒）这两个灭杀了大部分流行安全工具和杀毒软件的恶意程序肆虐网络以后，一时之间全国上下人心惶惶，其实它们最大改进的技术核心就是利用IFEO把自己设置为各种流行安全工具的调试器罢了，破解之道尤其简单，只需要将安全工具的执行文件随便改个名字，而这个安全工具又不在乎互斥量的存在，那么它就能正常运行了，除非你运气太好又改到另一个也处于黑名单内的文件名去了，例如把AST.exe改为IceSword.exe。
那些双击时明明程序文件就在眼前，系统却报错说“找不到文件”也只是IFEO的另一种应用罢了，其秘诀是将Debugger参数指向一个不存在的文件位置，这样系统就会因为找不到这个调试器而无法顺利执行下去，如果系统老老实实报出“找不到调试器”的错误提示那倒还好了，但就不知道微软是出于对IFEO这个东西存在的事实掩盖还是什么苦衷，却死活不肯承认是Debugger指向的调试器不存在导致的错误，而是把已经被“变异”成为命令行参数无法进入系统创建进程机制的原执行请求作为“找不到的文件”给报了回去，于是未曾了解过IFEO的用户只能莫名其妙的看着眼前就存在而系统“不承认”的安全工具发愣了。
　判断你的机器是否被劫持