基本症状:可能有朋友遇到过这样的情况,一个正常的程序,无论把它放在哪个位置,或者是一个程序重新用安装盘修复过,都出现无法运行的情况,或是出错提示为“找不到文件”或者直接没有运行起来的反应,或者是比如运行程序A却成了执行B(可能是病毒),而改名后却可以正常运行的现象。
遭遇流行“映像劫持”病毒的系统表现为常见的杀毒软件、防火墙、安全检测工具等均提示“找不到文件”或执行了没有反应,于是大部分用户只能去重装系统了,但是有经验或者歪打正着的用户将这个程序改了个名字,就发现它又能正常运行了~~
既然我们是介绍映像劫持技术(IFEO)相关,那我们就先介绍下:
1.所谓的映像劫持IFEO就是Image File Execution Options
(其实应该称为“Image Hijack”。)
它是位于注册表的
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options
IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。由于这个项主要是用来调试程序用的,对一般用户意义不大。默认是只有管理员和local system有权读写修改。
当一个可执行程序位于IFEO的控制中时,它的内存分配则根据该程序的参数来设定,而WindowsN T架构的系统能通过这个注册表项使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等。出于简化原因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名字没有变化,它就运行出问题。
先看看常规病毒等怎么修改注册表来达到随机启动吧。
病毒、蠕虫和,木马等仍然使用众所皆知并且过度使用的注册表键值,如下:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run
HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon/Notify
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/RunOnce
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/RunServicesOnce
等等。
2.另外一种劫持的方法是:在目标程序目录下建立与系统DLL相同的导出函数,执行内容为
f=LoadLibrary(byref "c:/windows/system32/"+dllname)
f=GetProcAddress(byval f,byref procname)
!jmp f
'(PowerBasic)
,在DLL初始化的时候可以干一些坏事,以此来达到改变原应用程序的目的
我们大家一起来看网络上另一个朋友做得试验:
开始-运行-regedit,展开到:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/
然后选上Image File Execution Options,新建个项,然后,把这个项(默认在最后面)改成123.exe
选上123.exe这个项,然后默认右边是空白的,我们点右键,新建个“字串符”,然后改名为“Debugger"
这一步要做好,然后回车,就可以。。。再双击该键,修改数据数值(其实就是路径)。。
把它改为 C:/windows/system32/CMD.exe
(注:C:是系统盘,如果你系统安装在D则改为D:如果是NT或2K的系统的话,把Windows改成Winnt,下面如有再提起,类推。。。)
好了,实验下。~ .
然后找个扩展名为EXE的,(我这里拿IcesWord.exe做实验),改名为123.exe。。。
然后运行之。。。嘿嘿。。出现了DOS操作框,不知情的看着一闪闪的光标,肯定觉得特诡异。
一次简单的恶作剧就成咧。。。
同理,病毒等也可以利用这样的方法,把杀软、安全工具等名字再进行重定向,指向病毒路径
所以,如果你把病毒清理掉后,重定向项没有清理的话,由于IFEO的作用,没被损坏的程序一样运行不了!
让病毒迷失自我
同上面的道理一样,如果我们把病毒程序给重定向了,是不是病毒就不能运行了,答案是肯定的。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/sppoolsv.exe]
Debugger=123.exe
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/logo_1.exe]
Debugger=123.exe
将上面的代码保存为后缀.reg的文件,双击它,是以金猪病毒和威金病毒为例,这样即使这些病毒在系统启动项里面,即使随系统运行了,但是由于映象劫持的
重定向作用,还是会被系统提示无法找到病毒文件(这里是logo_1.exe和sppoolsv.exe)。
QUOTE:
NT系统在试图执行一个从命令行调用的可执行文件运行请求时,先会检查运行程序是不是可执行文件,如果是的话,再检查格式的,然后就会检查是否存在。。如果不存在的话,它会提示系统找不到文件或者是“指定的路径不正确等等。。
当然,把这些键删除后,程序就可以运行!
[ 引自 网络技术论坛:]
从实际现象来说,把IFEO直接称为“映像劫持”未免有点冤枉它了,因为里面大部分参数并不会导致今天这种局面的发生,惹祸的参数只有一个,那就是“Debugger”,将IFEO视为映像劫持,大概是因为国内一些人直接套用了“Image File Execution Options”的缩写罢,在相对规范的来自Sysinternals的专业术语里,利用这个技术的设计漏洞进行非法活动的行为应该被称为“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都作为文本读了出来,二是记事本弹出错误信息报告“文件名不正确”,这取决于iexplore.exe原来是作为光杆司令状态请求执行(无附带运行命令行参数)的还是带命令行参数执行的。
Debugger参数存在的本意是为了让程序员能够通过双击程序文件直接进入调试器里调试自己的程序,曾经调试过程序的朋友也许会有一个疑问,既然程序启动时都要经过IFEO这一步,那么在调试器里点击启动刚被Debugger参数送进来的程序时岂不是又会因为这个法则的存在而导致再次产生一个调试器进程?微软并不是傻子,他们理所当然的考虑到了这一点,因此一个程序启动时是否会调用到IFEO规则取决于它是否“从命令行调用”的,那么“从命令行调用”该怎么理解呢?例如我们在命令提示符里执行taskmgr.exe,这就是一个典型的“从命令行调用”的执行请求,而我们在点击桌面上、普通应用程序菜单里的taskmgr.exe时,系统都会将其视为由外壳程序Explorer.exe传递过来的执行请求,这样一来,它也属于“从命令行调用”的范围而触发IFEO规则了。为了与用户操作区分开来,系统自身加载的程序、调试器里启动的程序,它们就不属于“从命令行调用”的范围,从而绕开了IFEO,避免了这个加载过程无休止的循环下去。
由于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。
引用JM的jzb770325001版主的一个分析案例:
QUOTE:
蔚为壮观的IFEO,稍微有些名气的都挂了:
HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/avp.exe
HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/AgentSvr.exe
HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/CCenter.exe
HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/Rav.exe
从这个案例,我们可以看到这个技术的强大之处!很多的杀软进程和一些辅助杀软或工具,全部被胁持,导致你遇到的所有杀软都无法运行!
试想如果更多病毒,利用于此,将是多么可怕的事情!
方法一: 限制法(转自网络搜索)
它要修改Image File Execution Options,所先要有权限,才可读,于是。。一条思路就成了。。
打开注册表编辑器,定位到[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/ImageFileExecutionOptions/,选中该项,右键→权限→高级,取消administrator和system用户的写权限即可。
方法二:快刀斩乱麻法
打开注册表编辑器,定位到[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/,把“ImageFileExecutionOptions”项删除即可。
方法三:利用Microsoft Sysinternals Suite
更简单的方法,是使用Sysinternals Suite(一个微软的工具集合)中的Autoruns,点击它的“Image Hijacks”选项卡,即可看到被劫持的程序项了。
方法四:权限杜绝
网上还流传着一个让初级用户看不懂的做法,那就是关闭IFEO列表的写入权限,具体操作如下:
执行32位注册表编辑器regedt32.exe
定位到HKLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options;
确保焦点在Image File Execution Options上,选择“安全”—“权限”;
将出现的用户列表内所有带有“写入”的权限去掉,确定退出。
这样一来,任何对IFEO的写入操作都失效了,也就起了免疫效果。这个方法对一般用户而言还是不错的,除非遭遇到一些特殊的需要往里面写入堆管理参数的程序。建议一般用户还是禁止此项,从而杜绝一切IFEO类病毒来袭。