映像劫持技术:眼见为虚——解析映像劫持技术

来源:安全中国

. 诡异中毒现象
  在成品检验科文员办公室台电脑上折腾半个小时后计算机维护部门技术员只觉得眼皮不停狂跳从刚开始接手这个任务开始他就直在做无用功:他随身带U盘里引以为豪众多维护工具包在这台机器上全军覆没无论他直接在U盘上运行还是随便复制到哪个目录里系统都是报告“找不到文件”或者直接没有运行起来反应他第次感受到了恐惧文件分明就好好在眼皮底下可它们就是“找不到”或死活不肯执行莫非是在这台机器上被病毒破坏了?他只好打开网页尝试重新下载但是他很快就绝望了刚下载查杀工具同样也不能使用
  无奈的下他只好在众多文员期待下说出了大部分号称上门维护电脑高手们常用句话般情况下这句话马上能让大部分用户接受残酷现实允许其重装系统并为这次重装系统付出50元价格这句话就是:“系统文件严重损坏了没法修了只能重装
  装完系统和常用办公软件Software后他像个贼似赶紧离开了办公室生怕多呆会儿就会惹来什么麻烦似而他却不知道“麻烦”早已在他刚才使用U盘上安家了回到自己电脑前他刚右键点击U盘就看见鼠标忙碌状态比平时久了点然后托盘区里杀毒软件Software和网络防火墙都消失了他心里慌张赶紧运行超级巡警系统却报告“找不到文件”下子呆在了电脑前:瘟神跟上门来了……
  古语云:道高魔高这句经典哲理在网络上得到了迅速延伸应用今年初种早已有的系统调试功能被应用到病毒技术上从而摇身变成为恶魔代言人普通用户很快就面临了场莫名其妙病毒灾难这就是“映像劫持”
   2. 我本将心向明月奈何明月照……
  “映像劫持”也被称为“IFEO”(Image File Execution Options其实应该称为“Image Hijack”后面章节会详细提到至少也应该称为IFEO Hijack而不是只有“IFEO”自身!)存在自然有它理由在WindowsNT架构系统里IFEO本意是为些在默认系统环境中运行时可能引发执行体提供特殊环境设定系统厂商的所以会这么做是有定历史原因在Windows NT时代系统使用种早期堆(Heap由应用管理内存区域)管理机制使得运行机制和现在区别而后随着系统更新换代厂商修改了系统堆管理机制通过引入动态内存分配方案对内存占用更为减少在安全上也保护不容易被溢出但是这些改动却导致了从此再也无法运作为了兼顾这些出问题微软以“从长计议”态度专门设计了“IFEO”技术原意根本不是“劫持”而是“映像文件执行参数”!
  IFEO设定了些和堆分配有关参数个可执行位于IFEO控制中时内存分配则根据该参数来设定那么如何使个可执行位于IFEO控制中呢?答案很简单Windows NT架构系统为用户预留了个交互接口位于注册表“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”内使用和可执行文件名匹配项目作为载入时控制依据最终得以设定堆管理机制和些辅助机制等大概微软考虑到加入路径控制会造成判断麻烦和操作不灵活后果也容易导致注册表冗余于是IFEO使用忽略路径方式来匹配它所要控制文件名例如IFEO指定了对个名为“小金.EXE”可执行文件进行控制那么无论它在哪个目录下只要它名字还叫“小金.EXE”它就只能在IFEO 5指山里打滚了
  说了半天都只是纯粹概念那么IFEO到底是如何样发挥作用呢?例如有文件名为“lk007.exe”由于使用了旧堆管理机制它在新系统里无法正常运行甚至出现非法操作为了让系统为其提供旧堆管理机制我们需要IFEO来介入则需执行以下步骤:
  1. 确保在管理员状态下执行regedit.exe定位到以下注册表项:
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  2. 在“Image File Execution Options”下建立个子键名为“lk007.exe”不区分大小写现在确保位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\lk007.exe\下建立串类型注册表项名为“DisableHeapLookAside”值为“1”
  3. 再次运行lk007.exe查看运行情况如果真是由于堆管理机制引发问题得以正常运行否则该问题不属于IFEO能够干涉范围或者需要尝试搭配其他参数使用
  目前已知IFEO参数有:
  ApplicationGoo
  Debugger
  PageHeapFlags
  DisableHeapLookAside
  DebugProcessHeapOnly
  PageHeapSizeRangeStart
  PageHeapSizeRangeEnd
  PageHeapRandomProbability
  PageHeapDllRangeStart
  PageHeapDllRangeEnd
  GlobalFlag
  BreakOnDllLoad
  ShutdownFlags
  说白了IFEO本质是系统厂商为某些可能以早期设计模式运行软件Software提供种保全措施而设计出来产物并对其加以扩充形成了套可用于调试简易方案如“BreakOnDllLoad”参数可设定在载入某个DLL时设置断点便于员调试ISAPI接口;带有“Range”字样几个参数则用于限制堆大小等
  而里面有个导致了今天这种局面参数:Debugger或许微软当初用意是便于员能够通过双击某个设置了IFEO控制列表执行体文件来直接调试器对其进行调试而不用再通过繁琐打开调试器再进行文件载入来实现调试提高了工作效率
  为了使得IFEO能够影响到任何启动请求NT架构中将IFEO优先权设置得很高基本上当用户要求执行某个系统首先判断该文件是否可执行体然后就到IFEO入口项进行文件名配对了直到通过IFEO这步后进程才真正开始申请内存创建起来
  如果系统在IFEO列表里匹配了当前运行文件名它就会读取文件名下参数这些参数在未被人为设置的前均有个默认值而且它们也具备优先权“Debugger”优先权是最高所以它是第个被读取参数如果该参数未被设置则默认不作处理如果设置了这个参数情况就变得复杂了……
   3. 罪魁祸首“Debugger”
  前面章里大家应该都了解IFEO本质了从实际现象来说把IFEO直接称为“映像劫持”未免有点冤枉它了里面大部分参数并不会导致今天这种局面发生惹祸参数只有那就是“Debugger”将IFEO视为映像劫持大概是国内些人直接套用了“Image File Execution Options”缩写罢在相对规范标准来自Sysernals专业术语里利用这个技术设计漏洞进行非法活动行为应该被称为“Image Hijack”这才是真正字面上“映像劫持”!
  Debugger参数直接翻译为“调试器”它是IFEO里第个被处理参数其作用是属于比较匪夷所思系统如果发现某个文件在IFEO列表中它就会首先来读取Debugger参数如果该参数不为空系统则会把Debugger参数里指定文件名作为用户试图启动执行请求来处理而仅仅把用户试图启动作为Debugger参数里指定文件名参数发送过去!光是这个概念大概就足够部分人无法理解了所以我们放简单点说例如有两个客人在起吃自助餐其中个客人(用户)委托另个客人(系统)去拿食物时顺便帮自己带点食物回来(启动请求)可是系统在帮用户装了盘子食物并打算回来时却发现另桌上有个客人(Debugger参数指定文件)居然是自己小学里暗恋对象!于是系统直接端着原本要拿给用户食物放到那桌客人那里共同回忆往事去了(将启动请求执行文件映像名和最初参合转换成新命令行参数……)最终吃到食物自然就是Debugger客人(获得命令行参数)至此系统就忙着执行Debugger客人启动请求而把发出最启动请求用户和那盘食物(都送给Debugger客人做命令行参数了)给遗忘了
  在系统执行逻辑里这就意味着个设置了IFEO项Debugger参数指定为“notepad.exe”“iexplore.exe”被用户以命令行参数“-nohome bbs.nettf.net”请求执行时系统实际上到了IFEO那里就跑去执行notepad.exe了而原来收到执行请求文件名和参数则被转化为整个命令行参数“C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome bbs.nettf.net”来提交给notepad.exe执行所以最终执行是“notepad.exe C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome bbs.nettf.net”即用户原来要执行文件名iexplore.exe被替换为notepad.exe而原来整串命令行加上iexplore.exe自身都被作为新命令行参数发送到notepad.exe去执行了所以用户最终看到是记事本界面并可能出现两种情况是记事本把整个iexplore.exe都作为文本读了出来 2是记事本弹出信息报告“文件名不正确”这取决于iexplore.exe原来是作为光杆司令状态请求执行(无附带运行命令行参数)还是带命令行参数执行
  Debugger参数存在本意是为了让员能够通过双击文件直接进入调试器里调试自己曾经调试过朋友也许会有个疑问既然启动时都要经过IFEO这那么在调试器里点击启动刚被Debugger参数送进来时岂不是又会这个法则存在而导致再次产生个调试器进程?微软并不是傻子他们理所当然考虑到了这因此启动时是否会到IFEO规则取决于它是否“从命令行那么“从命令行”该如何理解呢?例如我们在命令提示符里执行taskmgr.exe这就是个典型“从命令行执行请求而我们在点击桌面上、普通应用菜单里taskmgr.exe时系统都会将其视为由外壳Explorer.exe传递过来执行请求这样它也属于“从命令行范围而触发IFEO规则了为了和用户操作区分开来系统自身加载、调试器里启动它们就不属于“从命令行范围从而绕开了IFEO避免了这个加载过程无休止循环下去
  从编程角度来介绍说明“命令行那就是取决于启动时CreateProcess是使用lpCommandLine(命令行)还是lpApplicationName(文件名)来执行默认情况下大部分员编写习惯是lpCommandLine——命令行
  BOOL CreateProcess
  (
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
  );
  由于Debugger参数这种特殊作用它又被称为“重定向”(Redirection)而利用它进行攻击又被称为“重定向劫持”(Redirection Hijack)它和“映像劫持”(Image Hijack或IFEO Hijack)只是称呼区别实际上都是技术手段
  讲解完Debugger参数作用现在我们来看看“映像劫持”到底是如何回事遭遇流行“映像劫持”病毒系统表现为常见杀毒软件Software、防火墙、安全检测工具等均提示“找不到文件”或执行了没有反应于是大部分用户只能去重装系统了但是有经验或者歪打正着用户将这个改了个名字就发现它又能正常运行了这是为什么?答案就是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自己用户每次点击那些“打不开”安全工具实际上就等于又执行了次恶意本体!这个招数被广大使用“映像劫持”技术恶意软件Software所青睐随着OSO这款超级U盘病毒和AV终结者(随机数病毒、8位字母病毒)这两个灭杀了大部分流行安全工具和杀毒软件Software恶意肆虐网络以后时的间全国上下人心惶惶其实它们最大改进技术核心就是利用IFEO把自己设置为各种流行安全工具调试器罢了破解的道尤其简单只需要将安全工具执行文件随便改个名字而这个安全工具又不在乎互斥量存在那么它就能正常运行了除非你运气太好又改到另个也处于黑名单内文件名去了例如把AST.exe改为IceSword.exe



Tags:  映像劫持修复 映像劫持修复工具 映像劫持 映像劫持技术

延伸阅读

最新评论

发表评论