|
一、理论体系(部分内容转载)
“映像劫持”,也被称为“IFEO”(Image File Execution Options),在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指定了对一个名为“seesaw.exe”的可执行程序文件进行控制,那么无论它在哪个目录下,只要它名字还叫“seesaw.exe”,它就受 IFEO的控制了。
那么IFEO到底是怎么样发挥作用的呢?
前面大家应该都了解IFEO的本质了,从实际现象来说,把IFEO直接称为“映像劫持”未免有点冤枉它了,因为里面大部分参数并不会导致今天这种局面的发 生,惹祸的参数只有一个,那就是“Debugger”,将IFEO视为映像劫持,大概是因为国内一些人直接套用了“Image File Execution Options”的缩写罢,在相对规范的来自Sysinternals的专业术语里,利用这个技术的设计漏洞进行非法活动的行为应该被称为“Image Hijack”,这才是真正字面上的“映像劫持”!
Debugger参数,直接翻译为“调试器”,它是IFEO里第一个被处理的参数,其作用是属于比较匪夷所思的,系统如果发现某个程序文件在IFEO列表 中,它就会首先来读取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都作为文本读了出来,二是记事本弹出错误信息报告“文件名不正确”,这取决于iexplore.exe原来是作 为光杆司令状态请求执行(无附带运行命令行参数)的还是带命令行参数执行的。
Debugger参数存在的本意是为了让程序员能够通过双击程序文件直接进入调试器里调试自己的程序,曾经调试过程序的朋友也许会有一个疑问,既然程序启 动时都要经过IFEO这一步,那么在调试器里点击启动刚被 Debugger参数送进来的程序时岂不是又会因为这个法则的存在而导致再次产生一个调试器进程?微软并不是傻子,他们理所当然的考虑到了这一点,因此一 个程序启动时是否会调用到IFEO规则取决于它是否“从命令行调用”的,那么“从命令行调用”该怎么理解呢?例如我们在命令提示符里执行 taskmgr.exe,这就是一个典型的“从命令行调用”的执行请求,而我们在点击桌面上、普通应用程序菜单里的taskmgr.exe时,系统都会将 其视为由外壳程序Explorer.exe传递过来的执行请求,这样一来,它也属于“从命令行调用”的范围而触发IFEO规则了。为了与用户操作区分开 来,系统自身加载的程序、调试器里启动的程序,它们就不属于“从命令行调用”的范围,从而绕开了IFEO,避免了这个加载过程无休止的循环下去。
还有一种情况是:当Debugger参数为"ntsd -d"的时候,被加入的程序就一直处于调试状态,无法正常运行。试想若在此处加入个杀毒软件的主程序如:Rav.exe(瑞星杀毒软件)等,会怎么? |
|