89.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-游戏中使用的哈希算法逆向分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了

内容参考于:易道云信息技术研究院

上一个内容:88.利用游戏中的函数实现技能显示

上一个内容中把逆向得到的函数用c++实现了并且可以正常获取中文名,本次分析一下游戏中使用的哈希算法,看看游戏中是怎样去做的,分析哈算算法的目的,上一个内容中做了逆向的封装(通过调用游戏函数得到中文名),找名字的这件事就是一个查表的事情,哈希就是解决查表的事情,查询的速度快,其它游戏也肯定会跟哈希这种结构类似,到时候看一眼应该就能知道。

然后在解析怪物信息的时候有一个怪物列表,怪物里面都有一个编号(那个数据包开头部分8字节的数字)

我们用了0x200大小的数组来存放怪物的信息,如下图

然后如果要去更新怪物的属性,该怎么去更新?要遍历这个数组,去找要更新的怪物,找到之后把怪物的指针返回出来,然后对返回的指针进行修改,这有什么问题吗?没有什么问题,如果怪物列表只是0x200的大小是没有任何问题的,但如果怪物列表有两千万个怪物,一次查找最大要两千万次,光循环就两千万次,这就查询的会很慢,然后为了查询的速度更快,就有了一系列的算法,比如说二分算法,二分算法有一个缺点,它需要排序,它查的效率也没有特别高,但比线性(无算法)的查法快很多,然后哈希,哈希首先有一个哈希表,其实就是个数组,既然是数组它就会有大小,实际使用时它会很大,要比质数大,然后有了这个哈希表之后怎样查的更快呢?比如数组大小是10,然后现在的id是1,这时用1/10取余数,1/10余数是1,然后这时就把数据放到数组的1位置,2、3、4、5。。。也都是同理,然后哈希表就这么点东西数据那么多,这怎么放的进去?这肯定会有冲突,如果哈希表大小是质数的情况下,就有发生冲突的可能性,这是数学上的一个特性,然后有冲突的时候,就让数组的值是一个链表结构,比如1会放到数组下标1位置11也会放到数组下标1位置,但是这个11是存放在1数据里的,这是散列哈希,如下图

这个哈希跟查技能有什么关系?技能找名字也是一个查表的操作,游戏中的语言包它可能涉及到几千几万条,如下图根据一个英文去找一个中文

这时如果给一个英文,然后去查表,这时没法用哈希,如上图全是字符串不是数字了,哈希是找的东西/数组长度,这时就要用到一个东西了,哈希函数,就是把字符串转换成一个数字,哈希函数怎么设计?只要满足字符串转数字就可以,哈希函数自己实现就各种各样的都有,但时有一个优劣的问题,就是哈希表是一个有限的大小,但是字符串的组合是无限的,这种无限的变成有限的肯定会发生冲突,这时候就会变成数组里面存链表,然后用到链表了查询速度就会又低了,所以哈希函数,如果给1000个字符串做出来的算法,最好不同的字符串能取得不同的结果,虽然达不到,但是尽量不用冲突,冲突率越低算法就会越高效,下图一个简单的哈希函数(乘法哈希)我感觉可以用哈希套哈希的结构,下图中31*hash+id[i]这里面的31可以是任意数字

现在了解了哈希,然后开始看游戏是中的哈希是怎样的

首先来到下图位置,下图位置是获取中文名字的位置

然后下图红框里的函数,给它一个字符串,它会返回一个数字,通过上方的哈希说明,可以大胆的猜测它是哈希函数

通过断点可以看出它给了函数一个字符串

0x10295FB0函数执行完得到一个数字

然后断点住,按f7进入这个函数开始分析

首先从中文表结构+0x8C位置取出一个数字

然后比较中文表结构+0x29与0的关系

如果不是0就返回-1

然后把参数(也就是英文id)放到了edx里

然后再ebx+0x88(中文表+0x88位置)位置取出了一个数字,这个数字可能是哈希表的大小

然后调用 0x10293E50 函数

然后按F7进入 0x10293E50 函数

然后取出字符串第一个字符,cl寄存器是1字节的

然后一个if判断,如果是0就返回,这意思是,字符串以0结尾,这就说明如果是0说明这个字符串没有内容,是个空的

然后有一个乘法运算,这个算法跟上面简单的哈希函数例子一样

然后查了一个表

通过阿斯克码表,可以看出这个0x103C21E0这个表是为了大小写问题,如果是大写也变成小写

然后看到下图位置之后,就能明白它实际上跟上方我们的简单例子是一样的操作

通过下图红框里的两行代码,完成了 hash=31*hash+id[i]这样的代码

然后搞完一遍如果有字符串继续循环

然后现在知道了游戏哈希函数的逻辑,然后在看它插入哈希表的操作,然后在ret位置打断点跳出哈希函数

取消断点

然后按F8,如下图可以看到eax得到的值,这种数字被称为哈希值

然后有了哈希值就该去用哈希值/哈希表大小了,看到下图有div这个指令,div ecx这个意思是eax=eax/ecx这样的代码,eax是被除数,ecx是除数

看上方1字节的指令直观,下面不够直观,看懂了上面下面的应该能看到,如果看不懂 百度搜索 div指令什么意思 这种或这种类似的关键词

然后ecx的值是从ebp+1得来的,上面怀疑过ebp的值是哈希表的大小,在这也验证了

执行完div指令

然后游戏中使用了余数,下图的内存里的数据不对,忘记乘以4了,然后代码也执行过去了,没法重新截图了

它取出了一个D220

然后D220与哈希表比较大小

jae是高于跳转,所以如果D220大于哈希表的大小就返回,就是如果哈希表是10个大小,意思就是得出的值不能超过10,使用余数的话这个判断没必要写,它就不可能超过10

然后ebx还是中文表结构,然后中文表结构+0x80位置是中文表,下图位置取查了中文表

现在的一个情况是游戏中有一个表存放了一个索引,然后用这个索引去查中文表,那上面说没必要的判断这时是有必要的了

然后得到中文

中文

这里有一个东西,用ASII(阿斯克码表)方式查看的时候,发现中文后面跟着它的英文,如下图红框,内存地址与上图都是一个只是显示的编码不一样,上图是UTF-16编码下图是阿斯克码

然后在存放中文的结构里也存放了中文对应的英文

然后我们的代码也改成了跟游戏一样

然后来到0x1035EF66函数

按f7进入函数

然后执行了一个跳转

然后跳转到了0x1035EE5E位置,其它的不知道是干嘛的

然后跳转之后的代码

然后比较eax与ecx是否一致,这里就是一个比较字符串的操作,与stcmp函数意思一样,这里直接跳过在ret位置打断点跳出函数

然后回到下图位置,然后一致就给返回了

然后找个不一致的,它会产生哈希冲突

然后发现它返回了-1,没找到东西,然后在换一个不一样的数据

这时从哈希表里找到的中文结构头部4字节不是-1了

这时没有执行到0x102976C0函数。这说明文字结构第一个内容是链表指向下一个数据的东西

然后代码也改了

整理一下,哈希表里面放的第一个链表,然后链表的内容是中文表里的某一个,然后中文表第一个是next下一个链表位置,然后-1表示没有链表,所以找不到,也就是这个英文没有对应的文字

到这应该能感觉出,这种算法分析起来并不是很难,只要知道入参的意思,然后带着入参去一步一步跟着断点去走,就可以很清晰的分析出算法来

因为就改了两行代码,所以代码不会贴出来但会放到码云

总结:

中文表结构+0x8C位置是哈希表,中文表结构+0x88位置是哈希表大小,中文表结构+0x80位置是语言表


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九节 设计 Starter 不能忽视的细节

我们要定义一个生产可用的 Starter ,还有几个细节,我们必须要关注。这些细节可以很好的帮助我们写出更优秀的 Starter 一、maven 包依赖 每一个 Starter,可以理解为一个 Jar,这个 Jar 包,如果被其他应用引用&#xf…

贪心算法--区间调度问题

贪心算法 引言 贪心算法是一种简单而有效的算法设计技巧,在解决一些优化问题时具有广泛的应用。其基本思想是通过每一步的局部最优选择,最终达到全局最优解。贪心算法通常不会回溯之前的决策,而是根据当前状态作出最优决策,因此…

面试准备-八股【面试准备】

面试准备-八股【面试准备】 Java基础解决hash冲突的方法try catch finallyException与Error的包结构OOM你遇到过哪些情况,SOF你遇到过哪些情况线程有哪些基本状态?Java IO与 NIO的区别堆和栈的区别对象分配规则notify()和notifyAll()有什么区别?sleep()…

Docker(四)容器相关操作及问题处理

目录 一、进入、退出容器操作 二、查看Docker 容器的配置文件 方法一:进入docker容器内进行查看 方法二:通过数据卷挂载方式查看配置文件 方法三:使用Docker可视化工具查看配置文件 三、容器与宿主机时间同步 方法一:创建启…

3D模型旋转显示不全怎么办---模大狮模型网

在3D建模和渲染过程中,我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成,包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法,帮助您解决3D模型旋转显示不全的问题。 一、检查模型…

Mask R-CNN实战

一、源码和数据集的准备 获取git开源项目代码 https://github.com/matterport/Mask_RCNN 一下载2.1的前三个文件,和2.0的第一个h5文件,coco.h5是预训练权重,也放入源码 项目文件结构如下: samples/logs:训练模型保存的位置 配置…

LINUX系统编程:命名管道

匿名管道的通信只能在,有血缘关系的进程中,本质就是,子进程会拷贝一份父进程的文件描述符表,父子进程就可以看到操作系统的同一块资源(文件),以这块资源为媒介进行通信。 命名管道,…

STM32——DAC篇(基于f103)

技术笔记! 一、DAC简介(了解) 1.1 DAC概念 传感器信号采集改变电信号,通过ADC转换成单片机可以处理的数字信号,处理后,通过DAC转换成电信号,进而实现对系统的控制。 1.2 DAC的特性参数 1.3…

Vue3实战笔记(41)—自己封装一个计时器Hooks

文章目录 前言计时器钩子总结 前言 在Vue项目中,封装一个计时器挂钩(Hook)是一种实用的技术,它允许你在组件中方便地管理定时任务,如倒计时、计时器等,而无需在每个使用场景重复编写相同的逻辑代码。 计时…

大语言模型的工程技巧(一)——GPU计算

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下:regression2chatgpt/ch07_autograd/gpu.ipynb 本文将讨论如何利用PyTorch实现GPU计算。本…

常见的几种数据库通过SQL对表信息进行查询

一、前言 我们查询数据库表的信息,一般都使用界面化的连接工具查看,很少使用SQL语句去查,而且不同的数据库SQL语句又各自有差异。但如果通过代码去获取数据库表的信息,这时就需要通过SQL语句去查了,这个在逆向代码生成…

翻转列表-力扣

题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: …

CGAN|生成手势图像|可控制生成

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:TensorFlow入门实战|第3周:天气识别🍖 原作者:K同学啊|接辅导、项目定制 CGAN(条件生成对抗网络&#xf…

pytorch-13_2 模型结构选择策略:层数、激活函数、神经元个数

一、拟合度概念 在所有的模型优化问题中,最基础的也是最核心的问题,就是关于模型拟合程度的探讨与优化。根据此前的讨论,模型如果能很好的捕捉总体规律,就能够有较好的未知数据的预测效果。但限制模型捕捉总体规律的原因主要有两点…

C++:vector基础讲解

hello,各位小伙伴,本篇文章跟大家一起学习《C:vector基础讲解》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!&#…

day15|各种遍历的应用

相关题目&#xff1a; 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路&#xff1a;层次遍历二叉树&#xff0c;将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…

框架学习之SpringMVC学习笔记(一)

一、SpringMVC简介 1-介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 在控制层…

一文深度剖析 ColBERT

近年来&#xff0c;向量搜索领域经历了爆炸性增长&#xff0c;尤其是在大型语言模型&#xff08;LLMs&#xff09;问世后。学术界开始重点关注如何通过扩展训练数据、采用先进的训练方法和新的架构等方法来增强 embedding 向量模型。 在之前的文章中&#xff0c;我们已经深入探…

记录踩坑事件 分页查询order by出现重复数据bug

MySQL排序小坑_mysql order by name相同导致排序混乱-CSDN博客 1、问题描述 列表页分页查询出现重复数据。 2、问题排查 排查最终执行sql日志。 select * from tableA where (start_time>2024-04-17 00:00:00) AND (start_time<2024-05-18 00:00:00) ORDER BY sta…

AIGC基础教学:AI+建筑设计,一场划时代变革的序幕已经拉开

2015年9月&#xff0c;美的集团本着把艺术融入民间的理念&#xff0c;邀请了安藤忠雄设计正在筹建中的美术馆。 在历经长达近120天的设计工作之后&#xff0c;美术馆于同年12月动工。这座具有岭南建筑文化意境的美术馆&#xff0c;后来荣获2020年美国建筑大师奖(Architecture …