C/C++实现windows下的映像劫持(上)之原理分析

#本篇博客将来和大家进行“C/C++实现windows下的映像劫持的原理分析”

####什么是映像劫持:
映像劫持病毒是近几年来对用户系统安全破坏程度最大的病毒之一,它将大量安全软件"绑架", 使其无法正常运行,从而大大降低用户系统的安全性
“映像劫持”,也被称为“IFEO”(Image File Execution Options),在WindowsNT架构的系统里,IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。当一个可执行程序位于IFEO的控制中时,它的内存分配则根据该程序的参数来设定,而WindowsN T架构的系统能通过这个注册表项使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等。出于简化原因,IFEO使用忽略路径的方式来匹配它所要控制的程序文件名,所以程序无论放在哪个路径,只要名字没有变化,它就运行出问题。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions”内,使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等,大概微软考虑到加入路径控制会造成判断麻烦与操作不灵活的后果,也容易导致注册表冗余,于是IFEO使用忽略路径的方式来匹配它所要控制的程序文件名。

####手动实现映像劫持:

  1. 首先我们在VMware虚拟机中来实现映像劫持。我们新建一个win7的虚拟机,然后使用WIN+R输入regedit打开注册表编辑器。并找到项:“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File ExecutionOptions”如图所示:
  2. 现在我们假设我们要对calc.exe进行映像劫持,我们右击新建项,添加项calc.exe,并添加一个字符串值:“Debugger”,修改其值为我们想要打开的文件,在这里我们修改成cmd.exe.(由于cmd.exe存在于操作系统的环境变量中,所以可以不填写绝对路径,如果不存在于操作系统环境变量中,就需要填写文件的绝对路径)这里写图片描述
  3. 这个时候我们保存注册表编辑器。(不在虚拟机实验的请先导出注册表,做一个备份,避免影响操作系统正常运行)然后我们运行calc.exe(计算器),就会惊讶的发现,我们计算器已经被cmd.exe劫持,计算器已经无法打开。这里写图片描述

####映像劫持原理:
#####Quota
######NT系统在试图执行一个从命令行调用的可执行文件运行请求时,先会检查运行程序是不是可执行文件,如果是的话,再检查格式的,然后就会检查是否存在。。如果不存在的话,它会提示系统找不到文件或者是“指定的路径不正确等等。当然,把这些键删除后,程序就可以运行!
#####从实际现象来说:
######惹祸的参数只有一个,那就是“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)只是称呼不同,实际上都是一样的技术手段。

本章给大家带来的是windows下的映像劫持技术的原理分析
下一章节我将会带领大家一起用C/C++来实现基于映像劫持的恶意软件

###下一章节传送门:https://blog.csdn.net/qq_27180763/article/details/82556316

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值