网络游戏安全之实战FPS游戏CRC检测的对抗与防护
来源:互联网 编辑:wan玩得好手游小编 更新:2024-10-29 23:24:14 人气:
⒈ 百度百科给我们CRC的解释
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
来源:https://baike.baidu.com/item/crc%E6%A0%A1%E9%AA%8C
⒉ 维基百科给我们CRC的解释
循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表[1]。
来源:https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%86%97%E9%A4%98%E6%A0%A1%E9%A9%97
#include
#include
int crc = NULL;
int have_crc_table = NULL;
unsigned int crc32_table[256];
//生成具有256个元素的CRC32表
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; //CRC32 多项式的值,也可以是0x04C11DB7
else
crc >>= 1;
}
crc32_table[i] = crc; //生成并存储CRC32数据表
}
}
//根据CRC32数据表计算内存或文件CRC校验码
unsigned int Calc_Crc32(unsigned int crc, char *Data, int len)
{
crc = 0xFFFFFFFF; //将CRC初始化为-1
//判断CRC32表是否生成
if (!have_crc_table)
Crc_Make_Table();
for (int i = 0; i {
crc = (crc >> 8) ^ crc32_table[(crc ^ Data[i]) & 0xff];
}
return ~crc;
}
int main()
{
SetConsoleTitleA("Crc检测过掉学习工具 Ver1.0 提供方:小迪Xiaodi");
printf(" ");
printf("使用CE工具->添加地址0x402000->查找访问并尝试过掉检测! ");
printf("如果修改主程序模块,将会提示 “CRC代码校验检测到您修改了代码!”: ");
//初始内存校验值
unsigned int uMainMoudleSumA = Calc_Crc32(0, (char*)0x400000, 0x1F000);//400000- 41D000
//while循环开启CRC检测
while (1)
{
//CRC循环检测内存实时校验值
unsigned int TmpCrcSum = Calc_Crc32(0, (char*)0x400000, 0x1F000);
if (TmpCrcSum != uMainMoudleSumA)
{
//封号处理-掉线处理
MessageBoxA(NULL, "CRC代码校验检测到您修改了代码!", "Caption", MB_OK);
}
//为了方便,我在这里使用的Sleep函数控制检测的周期
Sleep(2000);
}
getchar();
return 0;
}
//计算内存校验值
Calc_Crc32(0, (char*)0x400000, 0x1F000);
0040103F - movsx ecx,byte ptr [eax]