CRC算法简介

“CRC” 的全称是 “Cyclic Redundancy Checksum” 或者 "Cyclic Redundancy Check",是对数据的校验值,中文名是“循环冗余校验码”,常用于校验数据的完整性。最常用的CRC 算法是 CRC32(即数据校验值为32位)

CRC算法代码量小,容易理解,目前应用十分广泛。

CRC算法也广泛应用在游戏安全领域,用于对游戏代码的校验,防止别人通过修改代码来达到某一目的,比如对于FPS游戏,可能用户修改了减少子弹的关键代码,使自己达到无限子弹的效果

手写CRC检测算法

我们参考《加密与解密》第四版279页CRC32算法,自己手写一个CRC检测程序

#include <stdio.h>
#include <windows.h>int crc32_table[256];//生成具有256个元素的CRC32表
void Crc_Make_Table()
{int crc = 0;for (int i = 0; i < 256; i++){crc = i;for (int j = 0; j < 8; j++){if (crc & 1)crc = (crc >> 1) ^ 0XEDB88320;      //CRC32多项式的值,也可以是04C11DB7elsecrc >>= 1;}crc32_table[i] = crc;}
}//根据CRC32数据表来计算字符串或者文件的CRC32值
int Calc_Crc32(char * data, int len)
{int crc = 0XFFFFFFFF; //CRC初值是-1,即0XFFFFFFFFfor (int i = 0; i < len; i++){crc = crc32_table[(crc ^ data[i]) & 0XFF] ^ (crc >> 8);}return ~crc;
}//返回代码段的基址和大小
DWORD GetTextAddrAndSize(int * pTextSize)
{HMODULE hModule = GetModuleHandle(NULL);PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)hModule;PIMAGE_NT_HEADERS32 pnh = PIMAGE_NT_HEADERS32(pidh->e_lfanew + (DWORD)pidh);//获取节的数量int secNum = pnh->FileHeader.NumberOfSections;//获得节表的基址PIMAGE_SECTION_HEADER  psh = PIMAGE_SECTION_HEADER(sizeof(_IMAGE_NT_HEADERS) + (DWORD)pnh);for (int i = 0; i < secNum; i++){if (!strcmp((const char *)psh->Name, ".text")){*pTextSize = psh->Misc.VirtualSize;return psh->VirtualAddress + (DWORD)hModule;}psh++;}*pTextSize = 0;return 0;
}int main()
{int textSize = 0;DWORD dwTextAddr = GetTextAddrAndSize(&textSize);//下面我们将CRC32校验用于自身代码,来模拟游戏中的CRC校验printf("请尝试修改内存,并过掉检测!\n");//先生成一个CRC32表Crc_Make_Table();//初始内存校验值int sum = Calc_Crc32((char *)dwTextAddr, textSize);while (1){int tempSum = Calc_Crc32((char *)dwTextAddr, textSize);if (tempSum != sum){MessageBox(NULL, "检测到您修改了代码!", "封号!", MB_OK);}Sleep(2000);}getchar();return 0;
}

运行程序下断被检测

我们运行程序,并用OD附加

程序正常执行,但是当我们按下F2下断点的时候(将代码数据改为CC)

这时,就会被程序检测到,如果是游戏程序的话,这个时候就会被检测进行惩罚了,,比如封号啥的,,下面我们就来尝试过掉这个CRC检测

实战过CRC检测

我们对上面401051这个地址下内存访问断点,程序断下

整体观察这段代码

就是一个死循环校验

通过堆栈观察,返回到上层函数

发现这个je就是关键位置,如果程序检测到代码改变,zf就是0,je不跳转,然后MessageBox就执行了(被检测到),所以我们将je改为jmp,使其强制跳转

这样,不论我们怎么修改代码,程序都不会被检测到了

过掉本程序检测的方式有很多,比如还可以全部将检测到之后执行的代码全部NOP掉等。大家可以发挥想象力,自行实践。

这里写的CRC例子虽然非常简单,但是麻雀虽小,五脏俱全,其他的一些大的检测也无非是加入了一些混淆技术,或者多重CRC等

参考书籍

《加密与解密第四版》

参考文章

https://www.freebuf.com/articles/system/210304.html

最后,还是那句话,技术不分对错,人心才分善恶,希望大家努力学习技术,为游戏安全贡献出自己的一份力量,也希望自己在未来的日子更上一层楼。加油~~~~~~

游戏保护_CRC32检测相关推荐

  1. 过游戏保护NP或TP的几种方法和思路

    以前有很多这方面的文章,但是大多涉及hook和汇编,新手门都是看了等于没看,还不如不看.但是本人通过实践,感觉就算是新手,只要善于组合使用一些现成的工具,依然可以达到目的. 先说下最新版本的np,虽然 ...

  2. eac 反调试_一种可能被用于EAC保护的检测调试器方案

    测试环境: Windows7 x64 虚拟机 win10 1809 x64 虚拟机 0x0 起因 小伙伴 @DBDig 最近也在玩APEX这个游戏,因为这个游戏有EAC保护所以有反调试,遂准备安排它. ...

  3. 网易 Android 游戏保护实践

    内容来源:2018 年 09 月 08 日,网易资深安全工程师张本梁在"RTC2018 实时互联网大会"进行<网易 Android 游戏保护实践>演讲分享.IT 大咖说 ...

  4. 围观一下tp的游戏保护 一

    普通会员 资 料: 注册日期: Jul 2011 帖子: 73  精华: 9 现金: 453 Kx 致谢数: 5 获感谢文章数:8 获会员感谢数:23 1  2011-09-20 11:43:51   ...

  5. 散谈游戏保护那点事~就从_TP开始入手吧

    标 题: [原创]散谈游戏保护那点事~就从_TP开始入手吧 作 者: crazyearl 时 间: 2010-12-20,02:37:22 链 接: http://bbs.pediy.com/show ...

  6. Roguelike+单机玩法游戏保护案例

    某Roguelike+单机玩法的游戏.游戏界面如下图: 该游戏玩法是Roguelike+单机,买量阶段留存数据不错,积累了不小体量的玩家,不过也因此被外挂作者盯上,有多个QQ群在售卖此款游戏的外挂. ...

  7. 解析电磁炉保护与检测电路工作原理

    解析电磁炉保护与检测电路工作原理 1 电网电压检测.高压检测保护电路 电网电压检测.高压检测保护电路原理如图1 所示. 电网电压检测电路主要由D101.D102.R101.R102.R103.C101 ...

  8. 【原创】散谈游戏保护那点事~就从_TP开始入手吧

    标 题:  [原创]散谈游戏保护那点事~就从_TP开始入手吧 作 者: crazyearl 时 间: 2010-12-20,02:37:22 链 接: http://bbs.pediy.com/sho ...

  9. 【转】散谈游戏保护那点事~就从_TP开始入手吧

    转自看雪:http://bbs.pediy.com/showthread.php?t=126802 声明:本文只为研究技术,请所有童鞋切勿使用本文之方法做下那天理难容罪恶不舍之坏事.          ...

最新文章

  1. nokia 上的好玩应用(转载)
  2. 如何使用包含属性名称的变量检查对象属性是否存在?
  3. 这家中国AI公司,正在打入新加坡AI“腹地”
  4. java 数组遍历_Java中遍历数组使用foreach循环还是for循环?
  5. java中求立方根_求解立方根
  6. 腾讯云低延时直播系统架构设计与弱网优化实践
  7. Ms Sql Server 2005的数据库快照功能使用实践
  8. 微信小程序, 解析↵换行
  9. boost::lockfree::queue多线程读写实例
  10. Qt Package Project 打包发布程序
  11. 重访 list comprehension
  12. 2017/12/30 GUI和动态代理
  13. 批量将csv转xls
  14. AUTOCAD——三种箭头的画法
  15. iphone 投android电视,手机投屏到电视上的2种方法,看完才知道原来这么简单
  16. cocos2dx 学习笔记之摄像头与3D精灵的移动
  17. 【电力系统】基于凸松弛算法的电力市场策略(Matlab代码实现)
  18. esp8266局域网内的TCP通信实验
  19. substr() 方法
  20. VUE+element 上传视频

热门文章

  1. 163电子邮箱,注册登陆及使用详细揭秘
  2. 蓝桥杯Java必备基础知识总结大全【3W字】持续更新中
  3. 【牛津大学博士论文】关系数据的学习和推理
  4. 在 Mac OS系统下选择、安装、配置 win 10虚拟机
  5. 【Elasticsearch】15 ES文档的基本操作 aggregations 【执行聚合操作】
  6. 陪玩MM千千万,谁是你的NO.1?使用Python获取陪玩照片进行颜值检测打分
  7. python集合如何去除重复数据_Python 迭代删除重复项,集合删除重复项
  8. Qemu连接外网的配置方法
  9. 面试总结——商汤科技自动驾驶研究员
  10. 如何查看自己的分区是固态还是机械