CS420 课程笔记 P7 - 虚拟内存 多级指针寻址

news2024/12/25 0:37:11

文章目录

    • Intro
    • Pointers
    • Memory leaks
    • Pointer path
    • Pointer scanning
    • Example!

Intro

上节课我们学习了静态地址,这节课我们将着手关注动态地址,我们需要了解一个叫做指针的东西

Pointers

简单地说,指针是对象之间的单向连接

Pointers are connections between objects

这里的箭头就是指针,指针不一定是从高层往低层,比如 User Interface 当然还需要指向玩家的指针来获取血量信息

  • Squally.exe -> World -> Player, Enemy#1 , Enemy#2 …
  • Squally.exe -> User Interface -> …
  • User Interface -> Player

让我们想象一个路径:

  • Squally.exe -> World -> Player -> Inventory

如果我们需要找到玩家的金币数量,金币存在 Inventory 背包里,那么

  • 找到 Squally.exe 指向 World 的指针
  • 找到 World 指向 Player 的指针
  • 找到 Inventory 指向 Gold 的指针

Memory leaks

为了更好理解指针,我们引入一个小例子叫做内存泄漏,内存泄漏是因为销毁了指针但忘记释放或删除对象,因此在这个例子中:玩家可能穿过一扇门并加载了新的地图,但老的地图没有销毁,只是 Squally.exe 指向 World 的指针被修改了!

Pointer path

当我们试图找到黄金,我们可以大致猜测程序的构成:

Squally.exe 中包含:Player XYZ、Player Health、World*、SoundSystem*、UserInterface*…
World 中包含:Map Width/Height、Player*、Enemy List*…
Player 中包含:Player Mana、Inventory*…
Inventory 中包含:NumberOfItems、ItemList*、Gold…

这里的 * 只是一个指针的符号,在32位系统上占用 4bytes,但在64位系统上占用 8bytes,那么此时 Player XYZ、Player Health 就是静态数据,其他的几乎都是动态的!

Allocations are random, but pointer paths are reliable

地址分配是随机的,但是指针的路径是可靠的,如果我们每次都通过这个指针路线那么就能获得金币~

在开始实战之前,让我们介绍一点符号化的对象,举个例子,Squally.exe + 4,代表了玩家的 X 值,Squally.exe + C,代表了 World*,那么地址 [Squally.exe+C] 就是 World 对象,[[Squally.exe+C] + 8] 就是 Player 对象,[[[Squally.exe+C]+8]+4] 就是 Inventory 对象,[[[Squally.exe+C]+8]+4]+8 就是金币了!

TIPS:上面一段内容推荐掌握C语言基础 & 仔细观看视频理解

Pointer scanning

现在我们知道可以这样找到 GOLD 的地址,接下来我们需要找到指向金币的指针路径,CE 有指针扫描仪可以方便完成这个工作,在讲解这些工具之前,先讲讲他们实际工作的原理。

不幸的是,没有办法可以从 GOLD 回溯到 Squally.exe,所有指针都只能从 Squally.exe 开始向下找到 GOLD 数据,这是计算机和数学中的图论问题,而 CE 或者其他任何引擎都没有好办法来优雅地解决这个问题,只能通过暴力搜索,一直尝试直到找到合适的路径!

  • Squally.exe -> User Interface -> Player
  • Squally.exe -> World -> Player

有两种可能来找到 Player 对象,但如果当玩家在过场动画,没有加载 UI,其中这一条就会断掉,因此某些路径是具有弹性的,因此指针扫描技术的一部分是在我们讨论实际实例之前,找到从静态到动态的可靠路径

在这之前,我想快速介绍一下 DLL 或称之为动态链接库,Squally.exe 可以创建类似 UI、World 这样的对象,但这并不是唯一的办法,实际上也有可能产生其他树的根源,比如 PhysicsSystem.dll -> PhysicsWorld,因此在这个结构中,我们有一个静态的 DLL 和 Squally.exe,在这情况下玩家的XY将存放在 DLL 中。

这两棵树也需要一定程度的交互来保证信息同步,比如 Player 中可能包含一个指向 Player Physics 的指针,你仍然可以通过指针扫描找到 XY,只是有可能指针扫描会追溯到 DLL,两种方法都可以工作!

这里有一个快速的方法帮你找到 DLL,以巫师3为例,文件夹下面有 PhysX3Common_x64.dll、steam_api64.dll,如果你要为这款游戏开发反重力,那么指针可能会从 PhysDLL 获得路径!接下来我们可以使用工具来解决这些问题

Example!

右键点击你找到的数值,点击 Pointer scan for this address
在这里插入图片描述

这里的 level 代表了几级指针,越小越快但可能会错过一些结果
在这里插入图片描述
然后 CE 会要求你将结果保存到某个文件里,随后就开始扫描指针了
在这里插入图片描述

结束后你会获得一大批指针路径,他们绝大多数不是可靠的,你只需要重新启动游戏就可以知道他们是否可靠了
在这里插入图片描述
接下来重新打开游戏,继续将 CE 附加到游戏上,选择保留地址/指针列表
在这里插入图片描述
随后我们将重复做一遍上面的无聊工作,显然生命值的地址已经变了,旧的地址不再有效
在这里插入图片描述
接下来我们可以做的是,在这个指针扫描窗口,重新扫描内存,并说他现在应该指向这个新的有效地址了,重新这样操作 1~3 次之后,剩下了这些
在这里插入图片描述
一般来说,比较短的路径比较好,不能保证这样可靠但现在我们能做的就是保留这些比较短的路径
在这里插入图片描述
把他们双击全部加入 CE 的指针列表,重新打开游戏以后就可以验证你是否成功了!显然这里有5条是可用的了
在这里插入图片描述
有些游戏可能需要更多的指针深度,可能要调整一些参数,但目前学到的足以应对大多数情况了!

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

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

相关文章

【 BlockChain 】零知识证明

【 BlockChain 】零知识证明 一、零知识证明起源 “零知识”的概念最早在80年代由麻省理工学院的研究人员 Shafi Goldwasser,Silvio Micali 和 Charles Rackoff 所提出。当时这些人正在研究与交互证明系统相关的问题——即一种理论系统,使得甲方&#…

QT6删除旧的编译文件,编译会出错,可以选择重新选择编译

QT6工程文件和编译文件的路径关系 下面是显示的工程情况 可能编译文件全部被删除,或者部分缺失 编译问题出现后的处理办法 删去编译工程时添加的内容,其中主要修改CMakeLists.txt中添加的内容,例如添加的路径或resource内容,可…

两个非递减顺序表合并成一个非递减顺序表

两个非递减顺序表合并成一个非递减顺序表 引入 以下这个例题的描述是关于合并两个有序的数组,然后合并之后同样也是一个非递减的顺序排列 但是我名这里讲的不是顺序表,而是封装成一个顺序表,但是我们这里的顺序表其实底层同样是一个数组&a…

复盘|攻防实战中面对“谍影重重”,如何出奇制胜?

随着“数字孪生”概念的深入人心,数字化转型的进展也是一日千里。与此同时,在网络世界中的攻防对抗热度有增无减,甚至连最顶级的安全团队一不小心也会中招。在攻防演练中发生过好几次这种情况:腾讯安全一线的分析人员在前方为攻击…

ATSHA204A国产替代新选择:LCSHA204

ATSHA204A是一款用于固件版权保护,防抄板仿克隆的加密芯片。包含多达16个密钥存储区用于安全存储密钥。同时提供OTP区用于存储用户固定信息。因推出时间早以及芯片本身的安全性在中国市场的使用量非常大。 受当前全球经济和大环境的影响造成该芯片供货严重不足&…

基于Python+DenseNet121算法模型实现一个图像分类识别系统案例

目录 介绍在TensorFlow中的应用实战案例最后 一、介绍 DenseNet(Densely Connected Convolutional Networks)是一种卷积神经网络(CNN)架构,2017年由Gao Huang等人提出。该网络的核心思想是密集连接,即每…

正中优配:怎样开通创业板交易权限?

创业板是我国证券商场的一种特别板块,主要面向创业型企业和高科技企业,至今已成为我国股票商场中较为热门的板块之一。关于投资者来说,能够在创业板中买卖不仅可以发掘到更多有潜力的企业,还可能带来更高的收益。那么,…

关于DC电源模块的过流保护功能说明

BOSHIDA 关于DC电源模块的过流保护功能说明 DC电源模块是一种常见的电源供应模块,广泛应用于各种电子设备和系统中。为了确保电源模块的安全和可靠性,通常会设置过流保护功能。 过流保护功能是指当电源模块输出电流超过额定电流时,会自动切…

CountDownLatch原理-(主线程等待子线程结束再执行)

CountDownLatch是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用countDown方法时,其实使用了tryReleaseShared方法以CAS的操作来减少state,直至state为0就代表所有的线程都调用了countDown方法。当调用await方法的时候,如果state不为0&#xff0…

zabbix监控实战

1 zabbix监控平台部署 更改的密码为HLThlt123 创建zabbix数据库 配置zabbix server 配置zabbix前端 启动服务 访问 更改成中文 修改字体文件 2 zabbix添加监控节点 在客户端 在server端 手动添加 自动添加 03 zabbix api 自动注册 停掉自动发现 删掉server3 自动注册 3 zab…

通讯软件015——分分钟学会Kepware OPC HDA Server仿真配置

本文介绍如何使Kepware软件仿真OPC HAD Server配置。相关软件可登录网信智汇(wangxinzhihui.com)下载。 1、创建1个数据源:本案例采用“Graybox.Simulator.1”作为数据源。连接OPC Server数据源“Graybox.Simulator.1”。 右键点击“连通性”…

Ubuntu下Python3与Python2相互切换

参考文章:https://blog.csdn.net/Nicolas_shen/article/details/124144931 设置优先级 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 200

day-41 代码随想录算法训练营(19)动态规划 part 03

343.整数拆分 思路: 1.dp存储的是第i个数,拆分之后最大乘积2.dp[i]max(dp[i],max(j*(i-j),j*dp[i-j]));3.初始化:dp[0]dp[1]0,dp[2]1;4.遍历顺序:外层循环 3-n,内层循环 1-i 2.涉及两次取max: dp[i] 表…

【前端】CSS-Flex弹性盒模型布局

目录 一、前言二、Flex布局是什么1、任何一个容器都可以指定为Flex布局2、行内元素也可以使用Flex布局3、Webkit内核的浏览器,必须加上-webkit前缀 三、基本概念四、flex常用的两种属性1、容器属性2、项目属性 五、容器属性1、flex-direction①、定义②、语句1&…

Matlab进阶绘图第27期—水平双向堆叠图

在上一期文章中,分享了Matlab双向堆叠图的绘制方法: 进一步,再来看一下水平双向堆叠图的绘制方法(由于Matlab中未收录水平双向堆叠图的绘制函数,因此需要大家自行设法解决)。 先来看一下成品效果&#xff…

MyBatis关联关系映射详解

前言 在使用MyBatis进行数据库操作时,关联关系映射是一个非常重要的概念。它允许我们在数据库表之间建立关联,并通过对象之间的关系来进行数据查询和操作。本文将详细介绍MyBatis中的关联关系映射,包括一对一、一对多和多对多关系的处理方法…

第七章:敏捷开发工具方法-part1-敏捷开发基础

文章目录 一、Scrum基础概念1.1 传统开发模式与敏捷开发的区别1.2 传统项目管理与敏捷项目管理的区别1.3 敏捷宣言1.4 敏捷开发的特征1、敏捷的方法 二、角色与职责2.1 Scrum Team2.2 角色职责总结2.3、研发阶段概览1、Sprint计划会议2、产品实施阶段3、Sprint评审会议4、Sprin…

深度解析BERT:从理论到Pytorch实战

本文从BERT的基本概念和架构开始,详细讲解了其预训练和微调机制,并通过Python和PyTorch代码示例展示了如何在实际应用中使用这一模型。我们探讨了BERT的核心特点,包括其强大的注意力机制和与其他Transformer架构的差异。 关注TechLead&#x…

Web Components详解-Shadow DOM基础

目录 引言 概念 基本用法 attachShadow函数 mode(模式) delegatesFocus(委托聚焦) Custom ElementsShadow DOM 基本用法 样式及属性隔离 写在最后 相关代码 参考文章 引言 上篇文章的自定义标签中,我们使…