首页
社区
课程
招聘
[求助]CRC32内存检验出现问题,多次运行时出现不同结果,请帮忙看下错在哪了
2014-8-8 23:48 3609

[求助]CRC32内存检验出现问题,多次运行时出现不同结果,请帮忙看下错在哪了

2014-8-8 23:48
3609
编译环境为VC2012,多字节字符集,编译结果无误,运行时出现错误,表现为连续多次运行时,会出现不同的CRC结果。
尝试将直接计算一个字符串的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;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回