📄 crc32.cpp
字号:
/*--------------------------------------------------------------
int68.cpp -- 利用INT 68h子类型检测SoftICE
仅在Windows 9x系统下有效
(c) 段钢, 2003
--------------------------------------------------------------*/
#include <windows.h>
BOOL IsFileModified();
DWORD CRC32(BYTE*,DWORD);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
if(IsFileModified() )
MessageBox(NULL,TEXT ("CRC32 Check OK!"),TEXT ("OK"),MB_ICONEXCLAMATION);
else
MessageBox(NULL,"File corrupted! !","CRC error",MB_ICONEXCLAMATION);
return 0;
}
////////////////////////////////////////////////////////////////
// 打开文件判断CRC32值是否正确
//
BOOL IsFileModified()
{
DWORD fileSize,OriginalCRC32,NumberOfBytesRW;
BYTE* pMZheader,pPEheaderRVA;
TCHAR *pBuffer ,szFileName[MAX_PATH];
//获得文件名
GetModuleFileName(NULL,szFileName,MAX_PATH);
//打开文件
HANDLE hFile = CreateFile(
szFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( hFile == INVALID_HANDLE_VALUE ) return FALSE;
//获得文件长度 :
fileSize = GetFileSize(hFile,NULL);
if (fileSize == 0xFFFFFFFF) return FALSE;
pBuffer = new TCHAR [fileSize]; // 申请内存,也可用VirtualAlloc等函数申请内存
ReadFile(hFile,pBuffer, fileSize, &NumberOfBytesRW, NULL);//读取文件内容
CloseHandle(hFile); //关闭文件
pMZheader=(BYTE*)pBuffer; //此时pMZheader指向文件头
pPEheaderRVA = *(pMZheader+0x3c);//读3ch处的PE文件头指针
//定位到PE文件头(即字串“PE\0\0”处)前4个字节处,并读出储存在这里的CRC-32值:
OriginalCRC32 =*((DWORD *)(pMZheader+pPEheaderRVA-4));
fileSize=fileSize-DWORD(pPEheaderRVA);//将PE文件头前那部分数据去除
pMZheader=pMZheader+pPEheaderRVA;//将pMZheader指向PE文件头
//比较CRC32值
if (CRC32(pMZheader,fileSize) == OriginalCRC32 )
return TRUE;
else
return FALSE;
}
////////////////////////////////////////////////////////////////
// 计算字符串的CRC32值
// 参数:欲计算CRC32值字符串的首地址和大小
// 返回值: 返回CRC32值
DWORD CRC32(BYTE* ptr,DWORD Size)
{
DWORD crcTable[256],crcTmp1;
//动态生成CRC-32表
for (int i=0; i<256; i++)
{
crcTmp1 = i;
for (int j=8; j>0; j--)
{
if (crcTmp1&1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;
else crcTmp1 >>= 1;
}
crcTable[i] = crcTmp1;
}
//计算CRC32值
DWORD crcTmp2= 0xFFFFFFFF;
while(Size--)
{
crcTmp2 = ((crcTmp2>>8) & 0x00FFFFFF) ^ crcTable[ (crcTmp2^(*ptr)) & 0xFF ];
ptr++;
}
return (crcTmp2^0xFFFFFFFF);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -