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

哈希表概念

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.hqwc.cn/news/149.html

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

相关文章

spring boot 整合EasyPoi导入导出,下载模版功能

引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></…

IIS安装localhost显示下载,urlrewrite设置

1.取消ftp服务勾选 2. ping localhost ping 127.0.0.1 如果显示 &#xff1a;&#xff1a;1 则需要禁用ipv6 在注册表 找到并单击下面的注册表子项&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 双击“DisabledComponents”以修…

Redis通信协议、过期回收策略

Redis通信协议-RESP协议 Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;server&#xff09;发送一条命令 服务端解析并执行命令&#xff0c;返回…

Unity 之 抖音小游戏本地数据最新存储方法分享

Unity 之 抖音小游戏本地数据最新存储方法分享 一、抖音小游戏文件存储系统背景二、文件存储系统的使用方法2.1 初始化2.1 创建目录2.3 存储数据2.4 删除目录/文件2.5 其他相关操作 三&#xff0c;小结 抖音小游戏是一种基于抖音平台开发的小型游戏&#xff0c;与传统的 APP 不…

研究人员发出警告,小心Akira勒索软件的Linux变体

Cyble研究和情报实验室的研究人员发现了Akira勒索软件一个复杂的Linux变体。 在最近的一份报告中&#xff0c;Cyble研究和情报实验室&#xff08;CRIL&#xff09;详细介绍了Akira勒索软件的一个复杂的Linux变体&#xff0c;引起了人们对Linux环境越来越容易受到网络威胁的关注…

laravel+vue共用一个域名,使用目录区分接口和项目的nginx配置

1、打包好的项目&#xff1a; 首先将打包好的项目放置public下&#xff0c;如下图 2、nginx配置文件 不带注释的伪静态&#xff08;推荐&#xff09; 备注&#xff1a;若在 location /admin 中的 admin 后面不加 “斜杠/”&#xff0c;则会出现访问 /admin-user 路由&#x…

U盘的文件系统为FAT32才可以同时在苹果电脑和windows电脑中正常使用

文章目录 1.驱动器F中的磁盘未被格式化。想现在格式化吗&#xff1f;2.U盘插到苹果电脑上后无法写入 1.驱动器F中的磁盘未被格式化。想现在格式化吗&#xff1f; 我之前U盘的文件系统为exFAT&#xff0c;插入Windows Server 2003系统的电脑中&#xff0c;打开时弹出上面的提示框…

LeetCode刷题笔记

目录 2748.美丽下标对的数目 思路&#xff1a;模拟 代码&#xff1a; 2749.得到整数零需要执行的最少操作数 思路&#xff1a;枚举 代码&#xff1a; 2750.将数组划分成若干好子数组的方式 思路&#xff1a; 代码&#xff1a; 2751.机器人碰撞 思路&#xff1a;栈模拟 代…

云原生(第二篇)k8s-二进制搭建

准备五台机器&#xff1a; master01&#xff1a;192.168.169.10 node01&#xff1a;192.168.169.40 node02&#xff1a;192.168.169.50 master02&#xff1a;192.168.169.60 负载均衡nginxkeepalive01&#xff08;master&#xff09;&#xff1a;192.168.169.20 负载均衡…

word转pdf实现

写一下笔记&#xff0c;以便在以后工作中用到&#xff1a; 导包&#xff1a; <!--word 转 pdf--> <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version> &l…

python3开发-AI智能联系人管理系统

目录 背景 1. 数据收集与存储&#xff1a; 2. 搜索与过滤&#xff1a; 3. AI智能功能&#xff1a; 4. 用户界面与交互&#xff1a; 5. 数据备份与恢复&#xff1a; 6. 安全与权限管理&#xff1a; 7. 测试与部署&#xff1a; 代码示例 1. 数据收集与存储&#xff08;…

谷歌浏览器无法翻译成中文,谷歌翻译,最新(沉浸式翻译和划词翻译,chrome无法翻译,谷歌浏览器无法翻译此网页)

简介&#xff1a;谷歌浏览器自带的翻译功能&#xff0c;对我们来说用处很大&#xff0c;但有的时候突然就会变成“无法翻译此网页”&#xff0c;之前给大家提供过两种无法翻译此网页的解决方案&#xff0c;这次再给大家分享下两款别的翻译方法&#xff1b; 一、上次介绍&#x…