-
-
[求助]CRC32内存检验出现问题,多次运行时出现不同结果,请帮忙看下错在哪了
-
发表于: 2014-8-8 23:48 3997
-
编译环境为VC2012,多字节字符集,编译结果无误,运行时出现错误,表现为连续多次运行时,会出现不同的CRC结果。
尝试将直接计算一个字符串的CRC,连续测试结果是对的。CRC算法应该是对的了。
也尝试将读取的内存数据保存至文件中进行了对比,多次读取的数据是一致的,但是就是结果不一样。
对内存代码只计算前37字节,结果一致,再大一点就出现不同的结果了。不知道为什么。请各位指教。
贴上代码,请大侠指教。
尝试将直接计算一个字符串的CRC,连续测试结果是对的。CRC算法应该是对的了。
也尝试将读取的内存数据保存至文件中进行了对比,多次读取的数据是一致的,但是就是结果不一样。
对内存代码只计算前37字节,结果一致,再大一点就出现不同的结果了。不知道为什么。请各位指教。
贴上代码,请大侠指教。
// test_console.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" DWORD Crc32Table[256]; DWORD last_proc(); //初始化CRC表 void InitCRCTable() { RtlZeroMemory(Crc32Table, 256 * sizeof(DWORD)); for (int i = 0; i < 256; i++) { DWORD dwTempCrc = i; for (int j = 0; j < 8; j++) { dwTempCrc = (dwTempCrc & 1) ? (dwTempCrc >> 1) ^ 0xEDB88320 : dwTempCrc >> 1; } Crc32Table[i] = dwTempCrc; } } //计算CRC值 DWORD CalculateBufferCrc(const LPBYTE pbtBuffer, DWORD dwSize) { if(dwSize <= 0) return 0; LPBYTE pbtTempBuffer = pbtBuffer; DWORD dwTempCrc = 0xFFFFFFFF; while (dwSize--) { dwTempCrc = ((dwTempCrc >> 8) & 0x00FFFFFF) ^ Crc32Table[(dwTempCrc ^ (*pbtTempBuffer)) & 0xFF]; pbtTempBuffer++; } return dwTempCrc; } DWORD get_critical_crc() { DWORD start_addr; _asm mov start_addr,offset begindecrypt; begindecrypt : //标记代码的起妈地址 DWORD end_addr=last_proc(); DWORD crypt_size=end_addr-start_addr; LPBYTE buff=new BYTE[crypt_size]; DWORD memread; RtlZeroMemory(buff,crypt_size); ReadProcessMemory(GetCurrentProcess(),(LPCVOID)start_addr,buff,crypt_size,&memread); DWORD result=CalculateBufferCrc((LPBYTE)buff,memread-1); char log[100]; RtlZeroMemory(log,sizeof(log)); sprintf_s(log,sizeof(log),"start:%08X-end:%08X,size:%d,result:%08X",start_addr,end_addr,memread,result); int len=strlen(log); log[len]=0x0d; log[len+1]=0x0a; HANDLE file=CreateFile("Test.log",GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); SetFilePointer(file,0,0,FILE_END); DWORD dwwritten=0; WriteFile(file,log,strlen(log),&dwwritten,0); WriteFile(file,buff,memread,&dwwritten,0); WriteFile(file,"\r\n",2,&dwwritten,0); WriteFile(file,"\r\n",2,&dwwritten,0); WriteFile(file,"\r\n",2,&dwwritten,0); delete [] buff; CloseHandle(file); return result; } int _tmain(int argc, _TCHAR* argv[]) { InitCRCTable(); get_critical_crc(); return 0; } DWORD last_proc() {//写在文件最后,用于计算文件CRC验证时标记结束的地址 DWORD addr; _asm mov addr,offset enddecrypt; enddecrypt: return addr; }
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: