前段时间在剑盟的反毒学堂看到很多学员都对日志中出现的IFEO项有很多疑问,闲来没事就简单的给回答下,在这里就直接将那时候写的东西稍微整理下发个贴给卡卡实习生看看,知道其原理的大可飘过
记的很早以前看过一篇很详细介绍IFEO的文章,对于IFEO的技术原理讲解的相对比较透彻,可是找不到了 所以下面只能简单的把现在自己懂的一些对于它的理解说一说:
IFEO全称是 Image File Execution Options 也就是“Windows 映像劫持”
它位于注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
因为IFEO能够影响到任何程序启动请求,所以IFEO的优先权设置得很高,其权限也很高,默认是只有管理员和Local system有权读写修改。
IFEO中使用忽略映像路径的方式匹配它所要控制的目标程序;
IFEO中有很多的参数,而如今被病毒广泛应用于劫持安全软件的关键的一个参数,也是在IFEO机制中优先权最高的一个参数是"Debugger"
Debugger翻译成中文叫调试器,简单讲,就是运行某个被劫持的程序时将会转向Debugger参数中指定的程序文件来调试原本的程序文件,所以当Debugger参数中指定的程序文件不是原程序的调试器的话,就无法打开原程序:
Debugger参数是IFEO中最先被处理的一个参数,当一个在IFEO列表中的程序文件(A)想要运行时会先读取Debugger参数,这里就会出现以下几种情况:
1.当Debugger参数没有定义时,程序(A)将正常运行
2.当Debugger参数被指定为其他的某个程序文件(B)
这时候发生的其实是这样的:系统会转向执行程序B,而将原本的程序A以及程序A执行的命令行参数作为一个新的命令行参数发送给程序B,从而与程序B组成一条新的完整的一个程序B执行时的命令行
具体解释就可以这样理解:
a.原本执行程序A的时候命令行是: "程序A 执行程序A的命令行参数"
b.而当程序A在IFEO列表中存在并且它的Debugger被设定为程序B时,执行程序A时系统就转向了执行程序B,而将上面(a)部分的完整命令行传递给程序B作为执行程序B时候的命令行参数,组成了一个新的完整的命令行:
"程序B 程序A 执行程序A的命令行参数",但是上面讲到过,如果程序B不是程序A的调试器,它无法执行后面的参数,因此无法打开程序A(在实际编程中要做到得到程序A的命令行再正常执行程序A其实是可以做到,但在这里就不罗嗦了),这个时候也就只执行了程序B.
对于这点又可以出现以下几种可能:
⑴.当Debugger参数被指定为“ ”(引号内为空格但不代表无定义)时或者被指定为一个不存在的映像路径时,由于实际是不存在指定路径,所以系统将报错“找不到文件”
⑵.当Debugger参数被指定为自身的程序文件(如程序A的Debugger参数被指定为程序A)时,第二点的b小点传递命令行参数的执行过程将会循环下去,最终导致命令行参数过长系统报错
⑶.当Debugger参数被指定为一个真实存在但又不是一个正确的调试器程序文件(B)时,系统转向执行程序B并将a小点的命令行当做命令行参数传递给程序B组成新的命令行,但由于程序B不是个正确的调试器程序因此它不能正确调试程序A所以无法执行程序A,这时候的结果就是系统只执行了程序B而没有执行程序A
⑷.当Debugger参数被指定为一个真正的调试器程序文件时,这时候运行程序A后,系统将转向执行调试器然后载入程序A,接而就可以进行调试了
这些有兴趣的话都可以自己装个虚拟机试一试
现在来举个例子说明一下:
比如现在在C盘根目录下有个SRE.EXE
双击运行SRE 这时候执行SRE的命令行就是"c:\SRE.EXE"
这里又要介绍一下:
当我们双击一个程序或者在命令提示符(如cmd.exe)里执行一个程序时,前者系统会当作是外壳程序(就是explorer.exe)传递的执行请求,所以它们都算是“以命令行调用”的
为什么要介绍上面这句话呢 是要让大家知道,通常我们运行程序的时候,它都是带命令行来执行的,即使它没有带参数
就像上面说的"执行SRE的命令行就是"c:\SRE.EXE""(当然,更完整的说应该是" SRE存放的具体路径\SRE.EXE")
相比之前说的命令行:程序A 执行程序A的命令行参数 它就是少了命令行参数,因为不是运行任何程序都需要用到参数(但是SRE有几个常用的参数,可以问你们的老师)
现在就这个例子来说,一旦SRE.exe被劫持了,Debugger参数指定为"c:\windows\system32\svchost.exe",那么它在日志中就该是显示如下:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\SRE.exe]
<IFEO[SRE.exe]><c:\windows\system32\svchost.exe.> [(Verified)Microsoft Windows Component Publisher]
这个时候,当用户执行SRE.exe的时候,系统转向了目标程序svchost.exe并将svchost.exe当作了被劫持程序SRE.exe的调试器,而SRE.exe这个时候只能被当作是svchost.exe的执行参数来传递。
这样上面说的执行程序A的完整命令行在这里就是: c:\SRE.EXE (因为是不带参数的运行)
这个时候就是把命令行“ c:\SRE.EXE ”传递给svchost.exe并加到它后面当作她的执行参数组成一个新的完整的命令行: c:\windows\system32\svchost.exe c:\SRE.EXE
这里,就因为svchost.exe不是一种的调试器,所以被启动的就是只有svchost.exe.
当然如果Debugger参数被指定为病毒文件自身的话,那样每次运行被劫持的程序,实际上就是重复运行了一次病毒体。
另外,大家可以自己再试一下,将一个程序劫持,并将Debugger参数被指定为如OD、IDA、WinDbg等调试工具,再打开,你会发现结果是启动了Debugger参数指定的程序(就是调试器)并加载启动原程序。
说了这么多,主要是因为大部分人都忽略了一点,就是劫持一个程序到目标程序以后,运行原程序只是单单的转向运行目标程序,这个其实是不正确的说法。
另外注意的一点就是,病毒可以利用IFEO的debugger参数劫持安全软件,同样的我们也可以利用这个技术漏洞来做好防御工作,劫持一些常见的已知的病毒程序,比如一些U盘专杀会给系统自动添加一些劫持项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\auto.exe]
<IFEO[auto.exe]><AUTOGUARDER GUARDED.> [N/A]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\MSDOS.bat]
<IFEO[MSDOS.bat]><AUTOGUARDER GUARDED.> [N/A]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ntldr.exe]
<IFEO[ntldr.exe]><AUTOGUARDER GUARDED.> [N/A]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\pagefile.pif]
<IFEO[pagefile.pif]><AUTOGUARDER GUARDED.> [N/A]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sos.exe]
<IFEO[sos.exe]><AUTOGUARDER GUARDED.> [N/A]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sxs.exe]
<IFEO[sxs.exe]><AUTOGUARDER GUARDED.> [N/A]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\test.exe]
<IFEO[test.exe]><AUTOGUARDER GUARDED.> [N/A]
这些就是利用了IFEO劫持了一些常见的病毒进程 在修复时放过 大可不需要修复
以上只是一些个人以往的学习手记,存在不完整,有异议欢迎大家指出指导更正
用户系统信息:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; CIBA; MAXTHON 2.0)