程序,本质是一个二进制文件,其中包含了平台相关的计算机指令。一个在运行中的程序,被加载到内存中,它在存储介质中的可执行文件通常是不可被修改,但是可以访问其中的内容。由此可以通过拷贝其中的数据,再创建一份一样的二进制文件即可复制一个可执行的文件。
demo中的代码省略部分异常处理
int copyfile(const char* srcFile,const char* desFile)
{
FILE* fp_in = NULL;
FILE* fp_out = NULL;
long nFileSize = 0;
size_t rByte = 0;
size_t wSize = 0;
char copyBuf[1] = {0};
fp_in = fopen(srcFile,"rb");
if(!fp_in)
{
perror("OPEN_FILE_FIAL");
return -1;
}
if( !fseek(fp_in,0L,SEEK_END) )
{
nFileSize = ftell(fp_in);
fseek(fp_in,0L,SEEK_SET);
}
else
{
perror("GET_FILE_SIZE_FAIL");
return -1;
}
if( nFileSize > 0 && (fp_out = fopen(desFile,"wb+") ) )
{
wSize = 0;
while(fp_out && 0 == feof(fp_in) )
{
if(rByte = fread(copyBuf,sizeof(copyBuf),1,fp_in) )
{
wSize += fwrite(copyBuf,sizeof(copyBuf),rByte,fp_out);
if(wSize > 1024)//1K时缓冲区数据存盘
{
fflush(fp_out);
wSize = 0;
}
}
}
fclose(fp_out);
}
fclose(fp_in);
return 0;
}
以下代码将一个正在运行的程序的可执行文件复制一份到当前目录下
char szAppPath[MAX_PATH] = {0};
char szDesPath[MAX_PATH] = {0};
char* pChar = NULL;
GetModuleFileName(NULL,szAppPath,MAX_PATH);//获取当前程序绝对路径
if( pChar = strstr(szAppPath,".exe") )
{
strncpy(szDesPath,szAppPath,pChar - szAppPath);
strcat(szDesPath,"_.exe");
if( !copyfile(szAppPath,szDesPath))
{
//复制成功
}
}
else
{
//是否是可执行文件?
}
当你得到了一个可执行文件的拷贝时,便可进行后续的操作。如果这是一个dll也是类似的处理。