编译出错,求帮忙分析下问题 5C

编译出错,求帮忙分析下问题

#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;
}

4个回答

没看出这个程序有什么不对,什么编译出错,贴出错误信息。
不过要注意下,这个程序因为使用了windows api函数,必须编译为windows程序,并且必须要链接上windows.h
最好是用vc++编译
其它平台/编译器不支持。

mao20162016
mao20162016 是这样的,但是没有用
4 个月之前 回复

直接看我图片吧
图片说明

mao20162016
mao20162016 跟这个没有关系,调试的时候提示的是Data读取字符串字符时错误!
4 个月之前 回复

Data[i] 这个下标越界了,你的0x400000地址并没有0x95000长度,你把0x95000,改成0x10000,试一下

进程在内存中起始和结束地址如下
开始:PIMAGE_NT_HEADERS.ImageBase(一般PE加载程序的默认起始地址是0x400000)
结束:PIMAGE_NT_HEADERS.ImageBase + PIMAGE_NT_HEADERS.SizeofImage

像楼主这么简单的程序估计没有0x95000这么大,造成Data读取字符的时候,越界访问了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!