Code - Windows程序自我复制

程序,本质是一个二进制文件,其中包含了平台相关的计算机指令。一个在运行中的程序,被加载到内存中,它在存储介质中的可执行文件通常是不可被修改,但是可以访问其中的内容。由此可以通过拷贝其中的数据,再创建一份一样的二进制文件即可复制一个可执行的文件。

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也是类似的处理。

转载于:https://my.oschina.net/mlgb/blog/349376

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值