二.《UE4奥丁》解密哈希ID

news2024/12/26 14:10:08

哈希表概念

1.相信大家经常在UE4或者UE5游戏逆向中遇到下面的代码段

$ ==>            > 41:8B42 0C               > mov eax,dword ptr ds:[r10+C]              >
$+4              > 3B05 AE589B04            > cmp eax,dword ptr ds:[7FF7B68B74F4]       >
$+A              > 7D 28                    > jge projectlh.7FF7B1F01C70                >
$+C              > 99                       > cdq                                       >
$+D              > 0FB7D2                   > movzx edx,dx                              >
$+10             > 03C2                     > add eax,edx                               >
$+12             > 8BC8                     > mov ecx,eax                               >
$+14             > 0FB7C0                   > movzx eax,ax                              >
$+17             > 2BC2                     > sub eax,edx                               >
$+19             > 48:98                    > cdqe                                      >
$+1B             > C1F9 10                  > sar ecx,10                                >
$+1E             > 48:63C9                  > movsxd rcx,ecx                            >
$+21             > 48:8D1440                > lea rdx,qword ptr ds:[rax+rax*2]          >
$+25             > 48:8B05 78589B04         > mov rax,qword ptr ds:[7FF7B68B74E0]       >
$+2C             > 48:8B0CC8                > mov rcx,qword ptr ds:[rax+rcx*8]          >
$+30             > 48:8D1CD1                > lea rbx,qword ptr ds:[rcx+rdx*8]          >
$+34             > 8B43 08                  > mov eax,dword ptr ds:[rbx+8]              >

2.其实这个就是在进行解密哈希ID,有的人不明白这个ID是如何通过这个哈希表拿到我们的哈希对象的

3.额~老师,啥是哈希表?

4.我们首先看看百度是如何解释的

5.正如上面所说我们对任意给定的关键字值key,带入函数后都能返回一个表中的地址,那么我们称这个表是哈希表

6.是不是感觉和我们遇到的情况一样,我们在UE4中通过一个哈希ID(Key),通过上面的代码块拿到对象

7.好~这里明白了大致的概念,现在我们就着手动态分析这段汇编代码,搞清楚是如何解密ID拿到对象

哈希ID来源

1.首先在头下断点,并断下

2.观察此时的寄存器r10

3.转到内存发现r10是一个对象

4.按F8执行一句,继续观察eax

5.发现eax存的是拿到的4字节r10对象+C的哈希ID

6.从来这,我们观察到所有的r10对象+C偏移都是一个哈希ID!

7.结论大家一定要记住!以后看到这个对象+C偏移的地址存有一个4字节ID那么这个对象就是哈希对象

8.然后拿到这个哈希ID经过下面的代码段就可以返回对象了,现在我们看看汇编是如何操作这个哈希ID的

动态分析解密ID

1.我们继续F8执行到这里 movzx edx, dx 的下一句

2.当执行 movzx edx, dx 后,观察寄存器edx是0,好 我们继续

3.执行add eax, edx 后,观察到把原本eax(哈希ID)加上了edx(0),然后赋值给了eax(哈希ID),注意这里都是在操作4字节哦,因为哈希ID就是一个4字节

4.到这里,我们的寄存器edx(0),eax(哈希ID)由于加上0还是等于哈希ID

5.继续执行,经过这句代码 mov ecx, eax,我们观察到eax(哈希ID)赋值给了ecx(哈希ID)

6.继续F8执行movzx eax, ax后,这里就是关键点了,我们观察寄存器变化

7.原本的eax()变成了1D73,是不是取了原本31D73的低4位呢?也就是低2字节,注意我们这里都是按4字节讲的

8.其实不难分析,原来 ax 就是低2字节的意思,为了方便理解,这里画了一张图

9.其实说白了,rax是8字节,eax是4字节,ax是2字节

10.所以我们看到原本31D73,居然取了低2字节为1D73赋值给了eax

11.继续F8执行sub eax, edx

12.eax(1D73)加上edx(0)无任何变化

13.继续F8执行过sar ecx, 0x10, 这句的时候,又来到一个关键点

14.我们发现执行后,ecx变成了3,这个3来源哪里呢?

15.分析得到这个3居然就是上面哈希ID的高2字节

16.额,他是如何得到的呢?其实仔细看到sar ecx, 0x10这个sar汇编指令的作用我们就知道原因了

17.有的同学不太明白sar的作用,我们百度看看

18.居然是位运算!,而且我们看到sar ecx, 0x10中的0x10换算成十进制就是16刚好右移动了16位(二进制位),是不是相当于把原本的低16位给移除了,原本的搞16位变成了现在的

低16位也就是3!

19.这里画了一张图便于分析

20.分析后,原来sar ecx, 0x10这句代码是取哈希ID的高4字节,而movzx eax, ax是取低4字节

偏移表达式

1.上面我们解密了ID分成了2个部分分别存在了rcx(哈希ID的高4字节),eax(哈希ID的低4字节)

2.我们继续执行下,这里比较简单就是偏移表达式的组合

3.能得到一个偏移表达式

[[0x00007FF7B68B74E0]+ecx8]+eax3*8]==哈希对象

4.原来我们的ecx和eax就是2个索引,分别从哈希ID分解得到

5.那么最终我们得出结论如图

6.好了今天的哈希ID解密就讲到这里,是不是很简单呢?

7.感谢同学们的支持,感谢支持迪大学院285530835

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

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

相关文章

DeFi(去中心化金融),定义金融服务的未来

在数字化时代,区块链技术的发展引领了金融服务的全新变革。去中心化金融(DeFi)作为区块链技术的重要应用之一,正在重新定义传统金融服务的未来。本文将探讨DeFi的概念、优势以及对金融服务的影响,并展望其在未来的发展…

Linux上配置安装Nginx

Linux上安装配置Nginx 前言安装参考 前言 在前文中介绍了Nginx:Nginx入门 现在我们来试着在服务器上安装以下Nginx,以下操作使用的版本为1.20.0 下载地址为:Nginx官网下载地址 安装 先把包丢上去,我这里使用的是XFtp连接的服…

【Spring】— Spring MVC简单数据绑定(二)

接上文:【Spring】— Spring MVC简单数据绑定(一) 目录 2.3绑定POJO类型 2.3绑定POJO类型 在使用简单数据类型绑定时,可以很容易地根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求…

java学习记录之MySql二

1 mysql回顾 1.1 DDL 数据定义语言:结构  数据库database create database 数据库名称 character set 字符集 [collate 比较]; drop database 数据库名称; alter database 数据库名称 character set 字符集 …;  表 create table 表名(字段描述 , … ); 字段描述…

优雅地在高版本Android将文件保存到磁盘

Android对于文件存储的限制正在日趋严格。事实上,从Android 11(Android R)开始,那些传统的文件保存和读取方式统统失效了。 而高版本Android中存/取文件操作,百度到的内容是可行的,但是非常麻烦&#xff0c…

AIGC时代,基于云原生 MLOps 构建属于你的大模型(下)

为了满足企业在数字化转型过程中对更新迭代生产力工具的需求,灵雀云近日推出了Alauda MLOps 解决方案,帮助企业快速落地AI技术、实现智能化应用和服务。 AIGC大模型已成为企业创新引擎 随着ChatGPT的爆火,越来越多的人考虑使用AI来提升我们日…

python机器学习——回归模型评估方法 回归算法(线性回归、L2岭回归)

目录 回归模型评价方法【回归】线性回归模型1.线性模型2.线性回归3.损失函数(误差大小)4.解决方法1) 最小二乘法之正规方程2) 最小二乘法之梯度下降 5.代码实现5.模型保存与加载6.特点 实例:波士顿房价【回归】带有L2正则化的岭回归 回归模型…

C++初阶之类和对象(上)

类和对象(上) 1、面向过程和面向对象初步认识2、类的引入3、类的定义4、类的访问限定符及封装4.1 访问限定符4.2 封装 5、类的作用域6、类的实例化7、类对象模型7.1 如何计算类对象的大小 8.this指针8.1 this指针的引出8.2 this指针的特性8.3. C语言和C实…

Python开发工具PyCharm 2023.1发布,这些新功能都值得期待!

PyCharm 2023.1 现已正式发布!今年的第一个主要版本带来了对远程Jupyter Notebook的支持、对新UI的增强、改进的泛型类型推断等。 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0…

SpringBoot 使用 Testcontainers 进行容器化集成测试

SpringBoot 使用 Testcontainers 进行容器化集成测试 容器化集成测试是测试应用程序与其依赖项之间的集成,其中依赖项以容器的形式运行。SpringBoot提供了Testcontainers来测试应用程序与依赖项之间的集成,本文将介绍如何使用Testcontainers进行容器化集…

详细解说一次性低代码和持续化低代码的关键区别在哪里

为什么很多开发团队吐槽低代码开发平台,其中大致归结了几个方面的原因: 1、使用过后会降低对技术的依赖度,工具人的倾向更加严重 2、目前大部分的低代码都是一次性的低代码,仅仅是在第一次构建模型的时候,可以生成一…

CDC介绍

CDC介绍 1 CDC Change Data Capture:定义了一种场景,即识别并捕获数据库表中数据的变更,并交付给下游进一步处理。CDC是对针对行级数据记录的。其中数据的变更信息,即 CDC 的数据结构,包括变更是什么样的操作&#x…

《JDK8特性深入讲解》学习笔记

Lambda表达式 如果不适用lambda表达式的话,可以使用匿名内部类,但是代码会显得有点多 lambda表达式其实就是匿名内部类 Lambda表达式简化了匿名内部类的使用,语法更加简单。 语法规则 (参数类型 参数名称) -> {代码体; } Lambda表达…

Unreal 5 实现Data Table 数据表格的使用

数据是一个游戏重要的组成部分,按分工,数据会交由策划去配置,所以,你的数据不可能直接写到蓝图里面,而是有一个专门的数据表格去配置。 大家通用的方式是策划在Excel内编辑完成,然后通过工具生成游戏需要使…

RabbitMQ安装以及SpringBoot整合RabbitMQ

SpringBootMQ整合Rabbit RabbitMQ安装以及SpringBoot整合 1、Docker安装RabbitMQ #拉取rabbitmq镜像 docker pull rabbitmq#启动RabbitMQ docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq#安装图形化插件 #进入容器 docker exec -i…

ubantu16.04搭建Qt环境

目录 ubantu16.04搭建Qt环境 下载opensource 安装qmake 安装g以及依赖库 配置环境 编译原码 安装make 查看qmake是否安装 配置环境变量 qmake编译c/c代码 安装qtcreator Linux编译Qt代码 ubantu16.04搭建Qt环境 下载opensource 「下载 qt-everywhere-opensource-s…

用于配电室的内部环境监控系统设计与产品选型

摘要:配电室是配电系统的重要组成部分,影响着电力用户的用电需求,需要保障其安全、可靠运行。针对配电室内部环境进行了深入分析,设计了一种内部环境监控系统。通过该系统可以采集配电室内部的温度、湿度、液位、SF6气体和烟雾&am…

伪随机码详解

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 伪随机码伪随机序列…

期末复习【网络安全】

期末复习【网络安全】 前言推荐期末复习第1章 引言1.1 计算机安全概念1.2 OSI安全体系结构 61.3 安全攻击 71.3.1 被动攻击1.3.2 主动攻击 第2章 对称加密和消息机密性2.1 对称加密原理 232.1.3 Feistel密码结构 25 2.2 对称分组加密算法 272.2.1 数据加密标准2.2.2 三重DES2.2…

【C#】并行编程实战:任务并行性(下)

本章继续介绍任务并行性,因篇幅所限,本章为下篇。 6、处理任务异常 所有优秀的程序员都擅长高效地处理异常,这也是并行编程最重要的方面之一。任务并行库(TPL)提供了一种高效的设计来处理异常:任务中发生的…