首页 > 代码库 > 程序的自我复制

程序的自我复制

计算机病毒的定义是:

计算机病毒(Computer Virus)是编制者在计算机程序中插入的破坏计算机功能或者数据的代码,能影响计算机使用,能自我复制的一组计算机指令或者程序代码。


由此可见 计算机病毒的两大特点是影响计算机使用与自我复制。本文从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也是类似的处理。

程序的自我复制