我们先了解一下几种对抗游戏作弊的技术:

⒈数据检测:对基础的游戏数据进行校验,例如坐标是否违规越界地图(坐标瞬移功能),人物短时间位移距离是否过大(人物加速功能)等等

⒉CRC检测:基于游戏程序代码的检验,例如将人物移动中判断障碍物的je条件跳转修改为jmp强制跳转(人物穿墙功能)等等

⒊封包检测:将游戏数据封包进行校验,防止利用封包漏洞实现违规操作,例如之前的穿X火线强登(可以登录任意账号)等等

⒋机器检测:现在鹅厂 安全组好像换人了 ,游戏机器码封的都挺狠,一封就十年,不过道高一尺,魔高一丈,目前依然不够完善,很多朋友还是可以Pass

⒌Call检测:非法调用Call导致校验值非法,例如攻击Call的严格校验(角色扮演游戏自动打怪脚本都是调用Call的)等等

⒍堆栈检测:该检测归于调用Call过程中产生的问题

⒎文件检测:对于游戏本地文件的检测,例如之前穿X火线几年前风靡一时的REZ文件(快刀秒杀,穿墙,遁地,飞天)等等

⒏模块检测:很多外x挂采用“注入”的形式,所以模块检测在游戏安全对抗中也扮演着极其重要的作用

⒐特征检测:这个主要检测典型的使用“易语言”开发的程序,或者部分外x挂市场比较大的毒瘤程序,或者菜单绘制(imgui绘制)等等

⒑调试检测:针对调试器和调试行为的检测,对Ollydbg,CheatEngine等调试器特征和调试行为的检测等。

⒒游戏保护:主要是利用R3各种反调试技术以及驱动层的HOOK等技术实现的游戏保护,例如鹅厂的TP等等

说过检测之前我们先了解一下什么是crc检测。CRC,中文名称为循环冗余校验,CRC属于密码学一类算法,常用于数据校验,一般会用来检测程序是否被脱壳或者被修改,以达到防破解的目的。

CRC算法原理

数据发送过程:

多项式转化为二进制数,这个2进制数作为除数。

CRC校验码的位数=上面计算除数的位数-1

校验码的位数是多少,就把需要校验的数据左移多少位,得到的就是被除数

被除数 模二除 除数 = 商+余数

余数就是我们需要的CRC校验码

数据接收过程:0

多项式转化为二进制数,这个2进制数作为除数。

接收到的数据和CRC码拼接起来,作为被除数

除数确定了,被除数也确定了,接下来再次使用“模2除法”校验

结果为0,则接受的数据正确,结果不为0接收的数据不正确

还是不懂,很好,再翻译一遍

多项式就是一个指定的数值,用我们需要校验的数据模二除这个多项式的数值,得到的余数就是CRC校验码。

CRC算法实现

首先生成CRC校验码,我们这里按字节计算CRC,先写个函数生成一张字节CRC校验码的表,因为每个字节从00-FF有256个组合,所以每个字节有256种不同的校验码。

简单一句话总结一下:CRC是一种校验算法并且该算法被广泛应用于文件,数据等的校验

光说不练假把式,我们来动手写一个crc校验:

#include <Windows.h>
#include <stdio.h>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 多项式的值,也可以是0x04C11DB7elsecrc >>= 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 < len; i++){crc = (crc >> 8) ^ crc32_table[(crc ^ Data[i]) & 0xff];}return ~crc;
}int main()
{SetConsoleTitleA("Crc检测过掉学习工具");printf("使用CE工具->添加地址0x402000->查找访问并尝试过掉检测!\n\n");printf("如果修改主程序模块,将会提示 “CRC代码校验检测到您修改了代码!”:\n\n\n\n\n");//初始内存校验值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();

注:release编译的时候记得关一下各种优化

这里有一点注意的,

//计算内存校验值

Calc_Crc32(0, (char*)0x400000, 0x1F000);

最后一个参数是一个校验的范围,我们用PE相关工具去确定程序主模块镜像大小。

我们看我这里就要改一下,要不会出问题。

我们改一下这里的数值就相当于改了代码,就触发了crc校验

那么接下来,我们就想办法给他搞掉。

首先,在攻击前,我们要知道代码的CRC检测是针对代码段的

代码段是用来执行的,正常情况下不会有其他数据访问代码段,被访问的大多是数据段,代码段被访问,很可疑就是CRC检测

此处说的“访问”的概念,大家可以通过CheatEngine工具中的“找出是什么访问了这个地址”来理解

针对0x402000这个地址,我们去看一下什么访问了

记住这行汇编,出现这个基本上就是crc检测了。同时记住40103f这个地址,我们去od里跟一下。

我们单步的走一走看看

第一次这里是400000,走了一遍后

变成了400001,,也就是说,它在循环的递增检测所有范围内的内存代码数据。

这块的代码时crc校验的那里,我们要到的是if比较那一块,很明显我们要跳出这个call。但是下面有一个jmp,很明显我们正常跑是出不去的,我们需要到函数头那里找出返回地址

我们在这里回车就到我们的主程序里了

找到我们就要修改,call下面的eax是call返回的数值。大概看一下(因为是我们自己写的),我们就知道这个汇编程序的逻辑,先运行一个crc校验给local.1,然后不断的重复运行crc校验给local.2,这俩进行比较,不一样就弹对话框,那么我们破解的思路就有了,一个是把cmp xxx改成cmp eax,eax,这样就永远一样了,还有一种就是把je改成jmp,这样不管比较如何都不执行错误的代码,当然还有很多思路,大家可以试这改改,然后发现不管我们怎么改代码的数据都不会被crc检测出来了。

软件破解逆向安全(五)CRC检测相关推荐

  1. 软件破解逆向安全(三)初识HOOK

    什么是HOOK?这是逆向工程里的一个大块,我在这里几句话是一定说不清楚的,如果大家想深入了解,可以去学习一下.我这里简单说一下,hook,中文就是钩子的意思,简单理解为勾住一切事物,来实现我们想要的功 ...

  2. 【软件逆向】软件破解?病毒木马?游戏外挂?

    文章目录 课前闲聊 认识CTF 什么是CTF CTF解题模式 什么是逆向 定义 应用领域 CTF中的逆向 现状 推荐书籍 学习要点 逆向工程学习基础 常规逆向流程 阶段一:信息收集 阶段二:过保护后静 ...

  3. 软件安全之CRC检测

    CRC介绍 在玩某些游戏,例如fps类游戏时,你想要修改某些特定的数值实现一些功能,这时你很有可能会被查封账号甚至禁封机器码.因为你更改了游戏中的数据,从而导致接收方收到"错误的数据&quo ...

  4. 1-Click PC Tuneup软件-破解实录-[上]

    [作者] 网名: 猪头三 站点: http://www.x86asm.com Email: pliceman_110@163.com QQ: 643439947 编程生涯: 2001-至今[12年] ...

  5. 1-Click PC Tuneup软件-破解实录-[中]

    [作者] 网名: 猪头三 站点: http://www.x86asm.com Email: pliceman_110@163.com QQ: 643439947 编程生涯: 2001-至今[12年] ...

  6. 较量 软件破解方法大揭密(图)

    作为一名程序员,由于我所编写的几款小软件经常被人破解,所以就对常见的软件破解方式比较关注.在这篇文章中,我把各种软件破解方式一网打尽,如算法注册机.内存破解法.补丁破解法和文件注册法等,以便大家&qu ...

  7. 代码保护软件VMP逆向分析虚拟机指令

    VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果. VMProtect通过在具有 ...

  8. OD调试9—实例:深入分析代码完成软件破解

    OD调试9-实例:深入分析代码完成软件破解  爆破,是最初级的解决方案,不到万不得已,我们不直接修改JNZ通关.因为这样子的话,我们就享受不到破解.逆向的真正乐趣了. 了解程序背后按照剧情发展经常会出 ...

  9. 软件破解高手常用的破解工具介绍

    剑客离不开剑,软件破解高手也离不开软件破解工具,合适的工具使你事半功倍,本文主要是介绍几种软件破解工具. 1.调试工具softice 2.调试工具Trw2000 3.反汇编工具Wdasm8.93 4. ...

最新文章

  1. axios不发起请求_重复的ajax请求让人很受伤
  2. 【C语言学习趣事】_GCC源代码分析_2_assert.h
  3. (0013)iOS 开发之集成友盟第三方登录
  4. Maven详解之聚合与继承
  5. python学习(2)--变量与表达式
  6. js获取url参数值
  7. MHA 日常维护命令集
  8. 基于套接字SOCKET的及时聊天
  9. 13.4. 临时表是否需要建索引
  10. CIO如何跟“IT盲”领导沟通
  11. Redis学习总结(6)——Redis 高级特性与案例学习
  12. 随想录(用memmove函数代替strncpy函数)
  13. AutoCad注册机使用方法
  14. 计算机模拟题操作题错误,计算机模拟试卷操作题答案.doc
  15. hget和get redis_redis hget hash命令简介
  16. BCrypt算法,想想spring security里的BCryptPasswordEncoder
  17. C语言加油站程序,计算机学院“0101”计划名师导航篇“C语言加油站”第一讲如期开讲...
  18. 如何用python爬取数据_入门用Python进行Web爬取数据:为数据科学项目提取数据的有效方法...
  19. 活动预告|CodeWisdom软件供应链系列学术报告:第5期(鲍凌峰 浙江大学)
  20. 关于面试党的那些刁问题

热门文章

  1. python代码执行过程记录_优雅的记录Python程序日志
  2. 常用的mvc框架 java_常用框架SpringMVC
  3. 合理的运动减肥的心率
  4. buildroot详解和分析
  5. 以太坊智能合约开发(五):Solidity成绩录入智能合约实验
  6. 7-39 QQ Account Management (25 分)【c++】【中英文】
  7. MuZero:用学习模型规划玩转雅达利、围棋、国际象棋和日本将棋
  8. 电脑维修和维护 毕业总结及经验报告
  9. 【Elasticsearch】文本分析 Text analysis (1)
  10. 【ABC科创企业案例】高科数聚:把脉消费者视角,洞悉消费力趋向