修改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;
}
程序会将文件先修改到临时路径,没问题后才拷贝回来。