C#实现映像劫持

“映像劫持”,也被称为“IFEO”(Image File Execution Options),在WindowsNT架构的系统里,IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。当一个可执行程序位于IFEO的控制中时,它的内存分配则根据该程序的参数来设定,而WindowsN T架构的系统能通过这个注册表项使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等。出于简化原因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名字没有变化,它就运行出问题。

“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions”内,使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等,大概微软考虑到加入路径控制会造成判断麻烦与操作不灵活的后果,也容易导致注册表冗余,于是IFEO使用忽略路径的方式来匹配它所要控制的程序文件名。

实例操作

编辑

例如有一个程序文件名为“xiaojin.exe”,由于使用了旧的堆管理机制,它在新系统里无法正常运行甚至出现非法操作,为了让系统为其提供旧的堆管理机制,需要IFEO来介入,则需执行以下步骤:

1. 确保在管理员状态下执行regedit.exe,定位到以下注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions

2. 在“Image File Execution Options”下建立一个子键,名为“xiaojin.exe”,不区分大小写。现在确保位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions\xiaojin.exe\下,建立一个字符串类型的注册表项,名为“DisableHeapLookAside”,值为“1”

3. 再次运行xiaojin.exe查看运行情况,如果真的是由于堆管理机制引发的问题,则程序得以正常运行,否则该程序问题不属于IFEO能够干涉的范围,或者需要尝试搭配其他的参数使用。

基本原理

编辑

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 bbset”请求执行时,系统实际上到了IFEO那里就跑去执行notepad.exe了,而原来收到的执行请求的文件名和参数则被转化为整个命令行参数“C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome ”来提交给notepad.exe执行,所以最终执行的是“notepad.exe C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome bbs.即用户原来要执行的程序文件名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

以上文字来自于百度百科

下面就来看一下C#代码的简单实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
namespace 设置映象劫持
{
    public partial class Form1 : Form
    {
        public Form1()
        {
   InitializeComponent();
        }
  [STAThread]
  static void Main()
  {

Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new Form1());
  }
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;//开始定时器

}

private void dra()//定时器周期时间,主要用来绘制时间,和本文关系不大
        {
            Graphics gr = this.CreateGraphics();
            Brush br1 = new SolidBrush(Color.Green);
            Brush br = new SolidBrush(Color.Red);
            gr.FillRectangle(br1, 20, 20, 120, 40);
            gr.DrawString("映像劫持",new Font ("宋体",12),br,21,21 );
            gr.FillRectangle(br1, 150,20, 120, 40);
            gr.DrawString(DateTime.Now.ToLongTimeString(), new Font("楷书", 12), br, 151, 20);
        }

private void timer1_Tick(object sender, EventArgs e)
        {
          
            dra();
           
        }

private void button1_Click(object sender, EventArgs e)//设置映像劫持,本文的核心
        {
            int s=0;
            for (int i = 0; i < comboBox1.Items.Count; i++)
            {
                string []name=new string [comboBox1.Items.Count ];
                name[i]= comboBox1.Items[i].ToString();
                if (name[i] == comboBox1.Text)
                {
                    s++;
                }
            }
            if(s==0)
            {
                comboBox1.Items.Add (comboBox1.Text );

}
            else
            {

}
                try
                {
                    RegistryKey reg;
                    reg = Registry.LocalMachine;

reg = reg.CreateSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\" + comboBox1.Text);
                    reg.SetValue("Debugger", comboBox2.Text);
                    reg.Close();
                    MessageBox.Show("映像劫持成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Refresh();

}
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

private void button2_Click(object sender, EventArgs e)//解除映像劫持,本文的核心
        {
            try
            {
                RegistryKey reg;
                reg = Registry.LocalMachine;

reg.DeleteSubKeyTree(@"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\" + comboBox1.Text,true);
               
                reg.Close();
                MessageBox.Show("解救映像成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Refresh();

}
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                label1.Text = "解救映像名:";
            }
        }

}
}

时间: 2024-10-14 15:02:25

C#实现映像劫持的相关文章

映像劫持

因使用电脑不当,这周电脑默默地不知道中了什么毒.每当电脑进入“是否允许该应用更改计算机”时就会发生黑屏然后死机,打开杀毒软件一查,发现问题是一个叫做“映像劫持项出现异常,部分软件不能正常使用”的什么鬼.于是乎我就上网百度了一下什么是映像劫持和解决方法,可是,呵呵,并没有用...... 映像劫持 就是Image File Execution Options(其实应该称为“Image Hijack”.)是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定.由于这个项主要是用来调试

利用映像劫持替换记事本

Image File Execution Options就是映像劫持技术,通过此种方式替换记事本,非常地绿色环保. Image File Execution Options是CreateProcess函数中的一个功能,即在可执行程序运行时,Windows会先检测对应IFEO中的Debugger值,如果 存在这个参数的话,就运行这个参数中指定的程序,好像是程序调试之用,具体可以见这里. 原理:通过修改 Image File Execution Options 键值后,在有 notepad.exe

映像劫持技术(1):简单介绍

映像劫持,即Image File Execution Option.在深入了解这个概念之前,可以简单地认为,它可以令应用程度重定向.这是注册表里的一个功能,可以做这样的尝试: 打开注册表——定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options,右键,新建项,将其重命名为notepad.exe.在右边空白处点击右键,新建”字符串值“,将其重命名为”Debugg

如何手动清除那些映像劫持技术的病毒

在用电脑的过程中,经常会遇到一些病毒,那么怎么样才能彻底查杀电脑中的木马病毒呢?安全防御教你如何查杀映像劫持技术的病毒. 解决步骤 分别对将icesword和Sreng主程序改名后运行,此时,那个象记事本的病毒程序已经打开近百个对话框,系统变得很慢.在WINXP的任务栏选中这一组窗口,关闭掉,先抢占一些系统资源再说. 然后,双击U盘上的ProcessExplorer,一眼看到有记事本图标的三个进程,尝试结束其中一个,发现结束后,程序会立即重新启动.看来,直接KILL进程是不行的.结束不行,就用下

映像劫持IFEO

类似标签:映像劫持.(Image File Execution Options).“Image Hijact" "如果我想在双击程序‘notepad.exe' 程序时,系统执行的确是 'cmd.exe' ,该怎么实现?” 我们应该先探索一下 当我们点击了 'notepad.exe'时,发生了什么:我们双击了'notepad.exe',系统判断'notepad.exe'是一个可执行体,然后为程序申请内存空间/加载程序/执行程序. 不对,其实在为程序申请内存空间之前,系统还对'notepa

常规鼠标键盘钩子.映像劫持.开机自启动

using System;using System.Collections.Generic;using System.IO;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection; namespace HookTest{ /* 注意: 如果运行中出现SetWindowsHookEx的返回值为0,这是因为.net 调试模式的问题,具体的做法是禁用宿主进程,在 Visual Stu

映像劫持技术(2):实例

在Image File Execution Options下创建cmd.exe项,将其“重定向”到我们自己编写的程序 1 #include<stdio.h> 2 #include<windows.h> 3 4 int main() 5 { 6 HKEY hKey; 7 DWORD dwDisposition=REG_CREATED_NEW_KEY; //新建一个子项 8 if((::RegCreateKeyEx(HKEY_LOCAL_MACHINE, 9 "SOFTWAR

通过映像劫持实现Notepad2替换记事本

创建如下注册表项: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 如果无法修改,需要先右键取得权限: 在notepad.exe注册表项中,创建名为Debugger的字符串值(REG_SZ): 修改字符串值Debugger的数据为Notepad2.exe的完整路径,最后以 /z参数结尾. 如: "C:\Program Files\Notepad2.exe"

IFEO 映像文件劫持

"映像劫持",也被称为"IFEO"(Image File Execution Options) 映像劫持的根本就是被恶意篡改了注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options项. 比如如在这里新建一个子项notepad.exe,再在这子项里新建一个REG_SZ的名字为Debugger,内容为cmd.exe的值项.这样就会实现映