编译出错,求帮忙分析下问题
#include <Windows.h>
#include <stdio.h>
int crc = NULL;
int have_crc_table = NULL;
unsigned int crc32_table[256];
void Crc_Make_Table()
{
have_crc_table = 1;
for (int i = 0; i < 256; i++)
{
crc = i;
for (int j = 0; j < 8; j++)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
crc32_table[i] = crc;
}
}
unsigned int Calc_Crc32(unsigned int crc, char *Data, int len)
{
crc = 0xFFFFFFFF;
if (!have_crc_table)
Crc_Make_Table();
for (int i = 0; i < len; i++)
{
crc = (crc >> 8) ^ crc32_table[(crc ^ Data[i]) & 0xff];
}
return ~crc;
}
int main()
{
printf("Demo\n\n");
unsigned int uMainMoudleSumA = Calc_Crc32(0, (char*)0x400000, 0x95000);
while (1)
{
unsigned int TmpCrcSum = Calc_Crc32(0, (char*)0x400000, 0x95000);
if(TmpCrcSum != uMainMoudleSumA)
{
MessageBoxA(NULL, "CRC检测修改了此内存", "ABC提示", MB_OK);
}
Sleep(2000);
}
getchar();
return 0;
}
没看出这个程序有什么不对,什么编译出错,贴出错误信息。
不过要注意下,这个程序因为使用了windows api函数,必须编译为windows程序,并且必须要链接上windows.h
最好是用vc++编译
其它平台/编译器不支持。
直接看我图片吧
Data[i] 这个下标越界了,你的0x400000地址并没有0x95000长度,你把0x95000,改成0x10000,试一下
进程在内存中起始和结束地址如下
开始:PIMAGE_NT_HEADERS.ImageBase(一般PE加载程序的默认起始地址是0x400000)
结束:PIMAGE_NT_HEADERS.ImageBase + PIMAGE_NT_HEADERS.SizeofImage
像楼主这么简单的程序估计没有0x95000这么大,造成Data读取字符的时候,越界访问了。