映像劫持 Image Hijack

“映像劫持” —— IFEO(Image File Execution Options:映像文件执行参数),其实应该被称为 “Image Hijack”

原理

原理请看 tombkeeper 所表:

Windows NT系统在执行一个从命令行调用的可执行文件运行请求时,首先会检查这是否是一个可执行文件,如果是,又是什么格式的,然后就会检查是否存在: [HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/ImageName] 如果存在,首先会试图读取这个键值: [HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/ImageName] "Debugger"="debug_prog" 如果存在,就执行“debug_prog ImageName”

来源与说明

在 Windows NT 架构的系统里,IFEO 是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定,微软为何这么做?因为在 NT 时代,系统使用的是一种早期的堆管理机制,(这里的堆英文名为 Heap,应用程序管理的内存区域)后面引用了动态内存分配,但这样就会使得有些程序再也无法正常运行,怎么办?为了兼容,微软特此造出了 IFEO 技术,当有这么一个程序,它无法在新的系统正常运行,为了让系统为其提供旧的堆管理机制,这时候就是 FIEO 大显身手的时候,它会介入进来,使得系统给它提供旧的对管理机制,达到让其正常运行的目的。
除此之外,微软想着如果加入路径控制会带来判断上的麻烦并且操作上也不灵活,以及注册表冗余,所以微软就采用忽略路径的方式来达到 FIEO 对该可执行程序进行控制的目的,所以当 FIEO 指定了一个可执行程序文件进行控制,那么无论这个可执行程序在哪里,它都将受 FIEO 的控制,楚门的世界?

已知 FIEO 参数有:
  ApplicationGoo
  Debugger
  PageHeapFlags
  DisableHeapLookAside
  DebugProcessHeapOnly
  PageHeapSizeRangeStart
  PageHeapSizeRangeEnd
  PageHeapRandomProbability
  PageHeapDllRangeStart
  PageHeapDllRangeEnd
  GlobalFlag
  BreakOnDllLoad

假设现在有一个名为: example.exe 的可执行程序,要怎么做才能让其在旧的堆管理机制运行?

1.打开HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options
2.右键新建项 example.exe
3.进入HKEY_LOCAL_MACHINE/SOFTWARE/ Microsoft/Windows NT/CurrentVersion/Image File Execution Options/example.exe/
4.建立一个名为 DisableHeapLookAside,设其值为 1

Image Hijack

上述那么多参数,哪个参数被用于 Image Hijack,没错,就是 Debugger 参数,一般来说,我们都需要打开调试器,然后载入文件,但是微软可能是为了提高工作效率,想着如果该可执行程序是受 IFEO 控制的话,且参数为 Debugger ,那么直接双击即可进行调试,为了让 IFEO 能够影响到任何一个程序启动请求,NT 架构中奖 IFEO 的优先级设置的很高,基本上,如果一个用户欲执行某个程序,那么系统就会有限判断该文件是不是可执行体,如果是的话,就到 IFEO 的入口项进行文件名配对,如果 FIEO 没有匹配到该可执行程序的文件名,那就通过了 IFEO 这一步之后,进程才真正开始申请内存创建起来…
如果匹配上了,那就会读取参数,这些参数在没有被人为设置之前都有一个默认参数,而且具备优先权,其中 Debugger 的优先权是最高的,所以 Debugger 的话是第一个被读取的参数,如果该参数有值,系统就会按照程序执行请求来处理,而把生成的命令行参数[由可执行程序名和最初参数组合组成]发送给用户。举个例子来说明一下这个概念:(这个例子是我从别处看的,不知道原作者是谁,但真的解释的很好:D)

有两个客人在一起吃自助餐,其中一个客人(用户)委托另一个客人(系统)去拿食物时顺便帮自己带点食物回来(启动程序的请求),可是系统在帮用户装了一盘子食物并打算回来时却发现另一桌上有个客人(Debugger参数指定的程序文件)居然是自己小学里的暗恋对象!于是系统直接端着原本要拿给用户的食物放到那桌客人那里共同回忆往事去了(将启动程序请求的执行文件映像名和最初参数组合转换成新的命令行参数……),最终吃到食物的自然就是Debugger客人(获得命令行参数),至此系统就忙着执行Debugger客人的启动程序请求而把发出最初始启动程序请求的用户和那盘食物(都送给Debugger客人做命令行参数了)给遗忘了。
所以这个 Debugger 就是造成 Image Hijack 的真正原因,比如这里有一个可执行程序名为 : example.exe,且改可执行程序的路径为:"C:/Program Files/example.exe",它在 IFEO 选项中设置了 Debugger 参数,并且设定的值为 "notepad.exe" ,比如 example.exe 有一个命令行参数名为:"order",当我们执行 order 时,系统就会先去 IFEO 项匹配,然后找到 Debugger 参数,此时系统会生成一个新的命令行参数,格式为 路径+初始化命令行参数 --> 新的命令行参数,即: `C:/Program Files/example.exe order` 该新的命令行参数会交给 Debugger 的值 notepad.exe 执行,所以最终执行的命令行为: `notepad.exe C:/Program Files/example.exe order` 所以此时就达到了偷梁换柱的目的,我本来要运行的是 example.exe 程序,这下倒好,你给我运行了 notepad.exe 程序,执行后,会出现一个记事本,会把 example.exe 的内容作为文本读出来,因为系统把 notepad.exe 当成了是 example.exe 的调试器!这是不是也有一种重定向的意思呢?:D 顺带说一句,如果没有命令行参数,会显示文件不存在的现象

调用 FIEO 的条件:

调用 FIEO 的先行判断条件就是看可执行程序启动时是不是从命令行调用的,比如在 CMD 命令行窗口下输入:example.exe 就会调用 IFEO 规则,但如果是直接在桌面点击,就会由 Explorer.exe 来传递执行请求,从而也属于从命令行调用。
除此之外,系统自身加载的程序,调试器里面启动的程序都不属于从命令行调用的范围,所以如果想着说从调试器里面调用 Debugger 从而达到该操作一直无限循环下去的 Bug 目的是不可能的,微软已经考虑到这一点了

综合

所以从上面我们就知道了,即使从桌面点击的,也相当于从 explorer.exe 调用,是从命令行调用过去的,那么如果有恶意人士就把桌面上的一些程序,比如防火墙,安全检测工具,杀毒软件等等的名称添加到 IFEO 项然后还增添了 Debugger 参数,且将参数指向一个不存在的文件位置,那当我们点击的时候,就会显示"文件不存在",因为找不到该调试器,根据 IFEO 执行的步骤原理,我们知道改一个名字以后,可执行程序就又可以正常运行了,因为 IFEO 被人为设置了针对这些流行工具的可执行程序文件名的列表,而且 Debugger 参数指向不存在的文件或者病毒

改个名字就可以防住?

这就要引用到 “互斥量” 这么一个概念了,所谓互斥量就是 Mutex,是一类特殊的系统对象,其存在的目的是为了减少系统开销,比如一个可执行程序已经于行了一个自己,且该成勋只允许运行一个自己,那么因为有了 Mutex 就会打不开该程序,因为 Mutex 的原因,系统(或者说可执行程序?)认为其已经存在了,没必要再创建一个增大系统开销…
所以如果该恶意程序创建了一个 “互斥量”,它可能就是个无敌的存在了

如何判断有无 Image Hijack?

比如你打开一个常用的杀软,显示 “文件不存在” 或者 没反应,再或者打开了别的程序,那就是映像劫持了,那就去注册表看看便知,如果是注册表被劫持了,那把注册表改个名再进去看

判断出来之后做什么?

这里需要看情况,下面分别对其进行说明:

  1. 删除,删除后刷新,数据又恢复了
    这种情况下表明后台有程序一直在对 FIEO 进行探测并写入,剩下的就是找到改程序挂起删除,前提是你手速得要快

  2. 删除,删除后刷新,没有数据恢复
    这种情况就没什么好讲的了

如何防范?

1.其实真的挺难防范的,因为很多病毒会转移自身的名字,你很难去甄别,有种办法就是找出来,把 Debugger 参数改为自身名称,由于不是调试器,所以就形成了死循环,但这样会增大计算机开销,除此之外,如果名字被改成是微软自带的那种程序名,比如 msiexec.exe ,这可是微软安装程序的主执行体啊,你怎么改名让它循环呢?
2.限定权限
把 FIEO 写入权限去掉,但是最开始那种,如果需要堆管理机制才能执行的文件,那这又成了一个问题
3.不能禁不能动,那就监测 FIEO ,如果有修改等操作,就报警,询问,这种方法是最不错的方法,许多工具可以提供这些功能

这里给大家演示:
桌面演示:

以 XmpStart.exe 为例,这是迅雷影音的应用程序名,我们给它搞个映像劫持,当我们在点击时,因为给它指向了一个不存在的文件,所以会提示说找不到文件,因为没有该 “调试器”,如果指向一个恶意程序,就会执行该恶意程序
映像劫持 Image Hijack
映像劫持 Image Hijack
其次可以编程写一个脚本,或者批处理文件执行,后续会上传到 python 类别中…就到这啦~