📄 selfext.cpp
字号:
// SelfExt.cpp: 实现CSelfExt类.
//
#include "stdafx.h"
#include "SelfExt.h"
//---------------------------------------------------------------------------
CSelfExt::CSelfExt()
{
}
//---------------------------------------------------------------------------
CSelfExt::~CSelfExt()
{
}
//---------------------------------------------------------------------------
BOOL CSelfExt::SelfDel()
{
CStdioFile file;
CFileException fileEx;
TCHAR szDir[MAX_PATH];
TCHAR szModule[MAX_PATH];
GetModuleFileName(0, szModule, sizeof(szModule)); // 获得应用程序名.
GetCurrentDirectory(MAX_PATH, szDir); // 获得文件的当前目录.
CString strFilePath=CString(szDir)+"tempDel.bat"; // 临时批处理文件名.
if(!file.Open(strFilePath,CFile::modeWrite |
CFile::typeText | CFile::modeCreate,&fileEx))
{
#ifdef _DEBUG
afxDump << "The file could not be opened " << strFilePath<<"\n";
afxDump << "Cause :"<<fileEx.m_cause << "\n";
#endif
return FALSE;
}
CString strCmdLine1,strCmdLine2;
strCmdLine1.Format("del %s\n",szModule);
strCmdLine2.Format("del %%0\n");
file.WriteString(strCmdLine1); // 写删除EXE的命令行.
file.WriteString(strCmdLine2); // 写删除BAT的命令行.
file.Close();
WinExec(strFilePath,SW_HIDE); // 执行自行删除操作.
return TRUE;
}
//---------------------------------------------------------------------------
BOOL CSelfExt::FileExists(LPCTSTR lpszFileName)
{
DWORD dwAttributes = GetFileAttributes(lpszFileName);
if (dwAttributes == 0xFFFFFFFF)
return FALSE;
if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY)
== FILE_ATTRIBUTE_DIRECTORY)
{
return FALSE;
}
else{
return TRUE;
}
}
//---------------------------------------------------------------------------
BOOL CSelfExt::MakeSelfExtract()
{
KEYEXTRACT key;
SELFEXTRACT bind;
TCHAR szModule [MAX_PATH];
DWORD nCount;
FILE *fpread, *fpwrite;
// 获得自身文件名.
if(GetModuleFileName(0,szModule,MAX_PATH)==0)
return FALSE;
// 打开已自身文件.
if((fpread=fopen(szModule,"rb"))==NULL)
return FALSE;
struct _stat ST;
// 获取自身长度.
_stat(szModule, &ST);
// 计算"钥匙"结构在文件中的位置.
DWORD nFilesize=ST.st_size;
DWORD offset = nFilesize - sizeof(key);
// 如果文件长度小于"钥匙"结构块长度,返回.
if(offset<0) return FALSE;
// 读取"钥匙"结构信息.
fseek(fpread,offset,SEEK_SET);
fread(&key,1,sizeof(key),fpread);
// 校验文件长度,如果不正确,返回.
if(key.nFileSize!=nFilesize){
fclose(fpread);
return FALSE;
}
// 分解文件.
DWORD nPos=key.nObjectSize;
for(DWORD i=1;i<key.nNum;i++){
// 读出文件信息.
fseek(fpread,nPos,SEEK_SET);
fread(&bind,1,sizeof(bind),fpread);
// 打开写分解的子文件.
if((fpwrite=fopen(bind.cFilename,"wb"))==NULL)
{
fclose(fpread);
return FALSE;
}
int c;
nPos +=sizeof(bind);
fseek(fpread,nPos,SEEK_SET);
// 把自分解文件数据写入被分解的文件.
nCount=0;
while((c=fgetc(fpread))!=EOF)
{
fputc(c,fpwrite);
nCount++;
if(nCount==bind.nFileSize) break;
}
nPos +=bind.nFileSize;
fclose(fpwrite);
}
fclose(fpread);
// 文件分解后删除母体文件.
SelfDel();
return TRUE;
}
BOOL CSelfExt::DoBind()
{
int nFileNum=4;
CString strFile[4];
strFile[0]= "SelfExtCtrl.exe"; // 控制体文件.
strFile[1]= "calc1.exe"; // 捆绑文件1.
strFile[2]= "calc2.exe"; // 捆绑文件2.
strFile[3]= "calc3.exe"; // 捆绑文件3.
CString strSelfExtFile="SelfExt.exe"; // 捆绑文件后所生成的文件.
if(!FileExists(strFile[1])) return FALSE;
if(!FileExists(strFile[2])) return FALSE;
if(!FileExists(strFile[3])) return FALSE;
SELFEXTRACT *pBind=new SELFEXTRACT[nFileNum];
KEYEXTRACT key;
DWORD nFilesize;
struct _stat ST;
_stat(strFile[0], &ST);
pBind[0].nFileSize=ST.st_size;
strcpy(pBind[0].cFilename,MCHAR(strFile[0]));
nFilesize =pBind[0].nFileSize;
// i=0 作为母体的文件头,不用.
for(int i=1;i<nFileNum;i++)
{
strcpy(pBind[i].cFilename,MCHAR(strFile[i]));
// 获取文件长度.
_stat(strFile[i], &ST);
pBind[i].nFileSize=ST.st_size;
nFilesize +=ST.st_size;
}
// 给"钥匙"结构赋值.
key.nNum=nFileNum;
key.nObjectSize=pBind[0].nFileSize;
key.nFileSize=nFilesize+sizeof(KEYEXTRACT)+
(nFileNum-1)*sizeof(SELFEXTRACT);
FILE *fpread, *fpwrite;
if((fpwrite=fopen(strSelfExtFile,"wb"))==NULL){
delete [] pBind;
return FALSE;
}
for(i=0;i<nFileNum;i++)
{
// 打开文件.
if((fpread=fopen(pBind[i].cFilename,"rb"))==NULL)
{
fclose(fpwrite);
delete [] pBind;
return FALSE;
}
// 把文件信息保存到自分解文件.
if(i!=0){
fwrite(&pBind[i],1,sizeof(SELFEXTRACT),fpwrite);
}
int c;
// 把被捆绑文件数据写入到自分解文件.
while((c=fgetc(fpread))!=EOF)
{
fputc(c,fpwrite);
}
fclose(fpread);
}
// 保存"钥匙"结构.
fwrite(&key,1,sizeof(KEYEXTRACT),fpwrite);
fclose(fpwrite);
delete [] pBind;
for(i=1;i<nFileNum;i++)
DeleteFile(strFile[i]);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -