修改PE文件前2个字节使exe无法运行

c++

Posted by YiMiTuMi on October 9, 2022

修改PE文件前2个字节使文件无法运行

程序:

//接受一个文件全路径 文件名 是否修改过
BOOL ModPEFile(wstring strFilePath, wstring strFileName, BOOL bMod) 
{
	FILE* pFile = NULL;
	DWORD dwFileSize = 0;
	LPVOID pTempFileBuffer = NULL;
	LPVOID pSaveFile = NULL;
	BOOL bRet = TRUE;
	
	do 
	{
		//打开文件	
		_wfopen_s(&pFile, strFilePath.c_str(), L"rb"); 
		LOGERRW(L"%s, _wfopen_s :%d", strFilePath.c_str(), GetLastError());

		if (pFile == NULL)
		{
			bRet = FALSE;
			break;
		}

		//读取文件大小
		fseek(pFile, 0, SEEK_END); 
		dwFileSize = ftell(pFile); //该函数对大于2^31-1文件,即:2.1G以上的文件操作时可能出错。
		fseek(pFile, 0 , SEEK_SET);

		//分配缓冲区
		pTempFileBuffer = malloc(dwFileSize);
		if (pTempFileBuffer == NULL)
		{
			fclose(pFile);
			bRet = FALSE;
			break;
		}

		//将文件读取到缓冲区
		size_t iSize = fread(pTempFileBuffer, dwFileSize, 1, pFile);
		if (!iSize)
		{
			free(pTempFileBuffer);
			pTempFileBuffer = NULL;
			fclose(pFile);
			bRet = FALSE;
			break;
		}

		fclose(pFile);

		//如果是还原文件,先判断是否本来就是MZ
		if (bMod)
		{
			if (*((PWORD)pTempFileBuffer) == IMAGE_DOS_SIGNATURE)
			{
				bRet = TRUE;
				break;
			}
		}

		//分配新缓冲区保存修改的文件
		pSaveFile = malloc(dwFileSize);
		if (pSaveFile == NULL)
		{
			bRet = FALSE;
			break;
		}

		memset(pSaveFile, 0 , dwFileSize);
		memcpy(pSaveFile, pTempFileBuffer, dwFileSize);

		if (bMod)     
		{
			//修改为MZ,还原
			*((PWORD)pSaveFile) = IMAGE_DOS_SIGNATURE;
		}
		else          
		{
			//修改为其他,使其打不开
			if (*((PWORD)pTempFileBuffer) != IMAGE_DOS_SIGNATURE) 
			{
				bRet = TRUE;
				break;
			}

			//修改前两个字符
			*((PWORD)pSaveFile) = 0x5A5D;

		}

		//获取临时路径
		wchar_t szTempPath[MAX_PATH];
		GetTempPathW(MAX_PATH, szTempPath);

		wstring strTempPath = szTempPath;
		strTempPath += strFileName;

		//保存文件
		FILE* fp;
		_wfopen_s(&fp, strTempPath.c_str(), L"wb");
		if (fp != NULL)
		{
			fwrite(pSaveFile, dwFileSize, 1, fp);
			fclose(fp);
		}
		
		//删除,源文件
		if (PathFileExistsW(strTempPath.c_str()))
		{
			DeleteFileW(strFilePath.c_str());

			CopyFile(strTempPath.c_str(), strFilePath.c_str(), FALSE);

			DeleteFileW(strTempPath.c_str());
		}

		/*
		_wfopen_s(&pFileJu, strTempPath.c_str(), L"rb"); 
		LOGERRW(L"%s, _wfopen_s :%d", strTempPath.c_str(), GetLastError());
		if (pFile != NULL)   //判断文件是否存在
		{
			fclose(fp);

			DeleteFileW(strFilePath.c_str());
			LOGERRW(L"%s, DeleteFileW :%d", strTempPath.c_str(), GetLastError());

			CopyFile(strTempPath.c_str(), strFilePath.c_str(), FALSE);
			LOGERRW(L"%s, CopyFile :%d", strTempPath.c_str(), GetLastError());

			DeleteFileW(strTempPath.c_str());
			LOGERRW(L"%s, DeleteFileW :%d", strTempPath.c_str(), GetLastError());
		}
		*/

	} while (FALSE);


	if (pSaveFile != NULL)
	{
		free(pSaveFile);
	}

	if (pTempFileBuffer != NULL)
	{
		free(pTempFileBuffer);
	}

	return bRet;
}

程序会将文件先修改到临时路径,没问题后才拷贝回来。

薰衣草 – 等待爱情