⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc32.cpp

📁 此为本书的配套光盘.本书结合实例
💻 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 + -