映像劫持简介

“映像劫持”,也被称为“IFEO”(Image File Execution Options,其实应该称为“Image Hijack”,后面章节会详细提到,至少也应该称为IFEO Hijack而不是只有“IFEO”自身!),它的存在自然有它的理由,在WindowsNT架构的系统里,IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定,系统厂商之所以会这么做,是有一定历史原因的,在Windows NT时代,系统使用一种早期的堆(Heap,由应用程序管理的内存区域)管理机制,使得一些程序的运行机制与现在的不同,而后随着系统更新换代,厂商修改了系统的堆管理机制,通过引入动态内存分配方案,让程序对内存的占用更为减少,在安全上也保护程序不容易被溢出,但是这些改动却导致了一些程序从此再也无法运作,为了兼顾这些出问题的程序,微软以“从长计议”的态度专门设计了“IFEO”技术,它的原意根本不是“劫持”,而是“映像文件执行参数”!

“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options”内,使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等,大概微软考虑到加入路径控制会造成判断麻烦与操作不灵活的后果,也容易导致注册表冗余,于是IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,例如IFEO指定了对一个名为“小金.EXE”的可执行程序文件进行控制,那么无论它在哪个目录下,只要它名字还叫“小金.EXE”,它就只能在IFEO的五指山里打滚了。

实例操作

**

** 说了半天都只是纯粹的概念,那么IFEO到底是怎么样发挥作用的呢?例如有一个程序文件名为“xiaojin.exe”,由于使用了旧的堆管理机制,它在新系统里无法正常运行甚至出现非法操作,为了让系统为其提供旧的堆管理机制,我们需要IFEO来介入,则需执行以下步骤:

  1. 确保在管理员状态下执行regedit.exe,定位到以下注册表项:

  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options

  2. 在“Image File Execution Options”下建立一个子键,名为“xiaojin.exe”,不区分大小写。现在确保位于HKEY_LOCAL_MACHINESOFTWARE MicrosoftWindows NTCurrentVersionImage File Execution Optionsxiaojin.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 FilesInternet ExplorerIEXPLORE.EXE – nohome”来提交给notepad.exe执行,所以最终执行的是“notepad.exe C:Program FilesInternet ExplorerIEXPLORE.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的用户只能莫名其妙的看着眼前就存在而系统“不承认”的安全工具发愣了。

   **判断你的机器是否被劫持

**    最简单的方法是逐个运行你常用的安全工具,检查是否出现“无法找到文件”或者干脆直接没了反应的,当然,执行结果和预期差别太大的也要被怀疑为劫持,例如你执行IceSword.exe反而是你的QQ运行了,那就不必我多说了。

  其实只要注册表编辑器regedit.exe、regedt32.exe没有被劫持,那我们直接用它进入“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options”这个注册表项并展开里面的子项列表一个个看下来确认是否出现Debugger参数或其他可能影响程序运行的堆管理参数,便可得知机器是否被劫持。

  如果注册表编辑器被劫持了怎么办?直接改个名就能用了啊……

  更简单的方法,是使用Sysinternals的Autoruns,点击它的“Image Hijacks”选项卡,即可看到被劫持的程序项了。

  **追查劫持来源

**   如果不幸你的机器上已经成为“映像劫持”的受害者,请记录好Debugger指向的程序位置,也不要试图再执行那些安全工具,首先应该尝试删除受影响的IFEO项,然后刷新注册表看看数据是否马上恢复了,如果马上恢复,则说明后台里有程序正在实时判断和写入IFEO,这时候必须拿出Sysinternals出品的注册表监控工具Regmon或类似工具,设置Filter为你正在尝试删除的安全工具的IFEO项,很快就能发现具体是什么进程在操作注册表了,然后将IceSword改名(如果已经被劫持),在它的进程列表里将相应进程终止掉。如果这个进程立即又重生了呢?再终止一次,然后迅速点击IceSword的“监视进线程创建”,你就能发现上一次捣乱的程序是什么名字了,将它记录下来,再开启一个Sysinternals的工具“Process Explorer”,在对应进程上点击右键选择“Suspend”,这个进程就会被挂起,用IceSword和它配合把相关恶意进程都挂起后,再使用 IceSword的文件功能里的“强制删除”,在这个程序还没来得及反应时就把它们的本体给歼灭,这时候再返回Process Explorer里按照大小排列从最大的一个守护进程开始Kill Process即可,由于没有了映像文件存在,它们意欲重新建立木马帝国的贼心也就无法实现了。