“映像劫持”,也被称为“IFEO”(Image File Execution Options)
映像劫持的根本就是被恶意篡改了注册表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options项。
比如如在这里新建一个子项notepad.exe,再在这子项里新建一个REG_SZ的名字为Debugger,内容为cmd.exe的值项。这样就会实现映像劫持了,这样你每次用记事本的方式打开文本文件时,却打开的是命令提示符的窗口。
Debugger参数的本意----(本段摘自百度百科)
是为了让程序员能够通过双击程序文件直接进入调试器里调试自己的程序,曾经调试过程序的朋友也许会有一个疑问,既然程序启动时都要经过IFEO这一步,那么在调试器里点击启动刚被Debugger参数送进来的程序时岂不是又会因为这个法则的存在而导致再次产生一个调试器进程?微软并不是傻子,他们理所当然的考虑到了这一点,因此一个程序启动时是否会调用到IFEO规则取决于它是否“从命令行调用”的,那么“从命令行调用”该怎么理解呢?例如我们在命令提示符里执行taskmgr.exe,这就是一个典型的“从命令行调用”的执行请求,而我们在点击桌面上、普通应用程序菜单里的taskmgr.exe时,系统都会将其视为由外壳程序Explorer.exe 传递过来的执行请求,这样一来,它也属于“从命令行调用”的范围而触发IFEO规则了。为了与用户操作区分开来,系统自身加载的程序、调试器里启动的程 序,它们就不属于“从命令行调用”的范围,从而绕开了IFEO,避免了这个加载过程无休止的循环下去。由于Debugger参数的这种特殊作用,它又被称为“重定向”(Redirection), 而利用它进行的攻击,又被称为“重定向劫持”(Redirection Hijack),它和“映像劫持”(Image Hijack,或IFEO Hijack)只是称呼不同,实际上都是一样的技术手段。
这种手段还是非常危险的,如果劫持了杀软,那么你打开杀软的瞬间,其实就是打开的恶意程序。也可以劫持一些doc文档之类的,欺骗用户,同时也能屏蔽杀软,让它运行不起来。
当然这个手段的解决办法也十分简单,那就是改一下文件名,应用程序就又能使用了,然后去修改恢复注册表项。
下面是实际的实现:
目标程序:Server.exe 是自己写的一个mfc小程序
劫持之前:
执行映像劫持之后:
此时双击Server.exe 出来的就不是原来的程序,而是计算器。
修改文件名,和删除注册表项都可以解决这个问题。
其实就是简单的注册表操作,但是功能很强大,也比较脆弱。
附上源码:
#include "stdafx.h" #include <windows.h> #include <stdio.h> int main() { WCHAR DllFullPath[MAX_PATH] = L"calc.exe"; DWORD Value = 1; HKEY hKey; DWORD dwDisposition; LPCTSTR SetData = L"Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Server.exe"; if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE, SetData, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition)) { if (ERROR_SUCCESS == RegSetValueEx(hKey, L"Debugger", NULL, REG_SZ, LPBYTE(DllFullPath), sizeof(DllFullPath))) { printf("Image hijacking Success! "); } } getchar(); RegCloseKey(hKey); return 0; }