windows映像劫持技术(IFEO)
基本症状:可能有朋友遇到过这样的情况,一个正常的程序,无论把他放在哪个位置或者是重新用安装盘修复过的程序,都无法运行或者是比如运行A却成了执行B的程序了,而改名后却可以正常运行。。
既然我们是介绍IFEO技术相关,那我们就先介绍下:
一,什么是映像胁持(IFEO)?
所谓的IFEO就是Image File Execution Options
在是位于注册表的
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
由于这个项主要是用来调试程序用的,对一般用户意义不大。默认是只有管理员和local system有权读写修改
“映像劫持”,也被称为“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指定
了对一个名为“AAA.EXE”的可执行程序文件进行控制,那么无论它在哪个目录下,只要它名字还叫“AAA.EXE”,它就只能在IFEO的五指山里打
滚了。
说了半天都只是纯粹的概念,那么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本质是系统厂商为某些可能以早期设计模式运行的软件提供一种保全措施而设计出来的产物,并对其加以扩充形成了一套可用于调试程序的简易方
案,如“BreakOnDllLoad”参数可设定在载入某个DLL时设置断点,便于程序员调试ISAPI接口;带有“Range”字样的几个参数则用于
限制堆的大小等。
而里面有一个导致了今天这种局面的参数:Debugger。或许微软当初的用意是便于程序员能够通过双击某个设置了IFEO控制列表的执行体文件来直接调用调试器对其进行调试,而不用再通过繁琐的打开调试器再进行文件载入来实现调试,提高了工作效率。
为了使得IFEO能够影响到任何一个程序启动请求,NT架构中将IFEO的优先权设置得很高,基本上,当用户要求执行某个程序时,系统首先判断该程序文件
是否可执行体,然后就到IFEO的入口项进行文件名配对了,直到通过IFEO这一步后,进程才真正开始申请内存创建起来。
如果系统在IFEO程序列表里匹配了当前运行的文件名,它就会读取文件名下的参数,这些参数在未被人为设置之前均有个默认值,而且它们也具备优先权,
“Debugger”的优先权是最高的,所以它是第一个被读取的参数,如果该参数未被设置,则默认不作处理,如果设置了这个参数,情况就变得复杂了……
阅读(1499) | 评论(0) | 转发(0) |