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

文章目录

    • 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.rhkb.cn/news/120592.html

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

相关文章

vue集成mars3d后,basemaps加不上去

首先&#xff1a; <template> <div id"centerDiv" class"mapcontainer"> <mars-map :url"configUrl" οnlοad"onMapload" /> </div> </template> <script> import MarsMap from ../component…

C到C++的升级

C和C的关系 C继承了所有C语言的特性&#xff1b;C在C的基础上提供了更多的语法和特性&#xff0c;C语言去除了一些C语言的不好的特性。C的设计目标是运行效率与开发效率的统一。 变化一&#xff1a;所有变量都可以在使用时定义 C中更强调语言的实用性&#xff0c;所有的变量…

解决centos离线安装cmake找不到OpenSSL问题

安装方法&#xff1a;见另外一篇文章 https://blog.csdn.net/zhongxj183/article/details/118488629 按照文章下载了离线gcc 和OpenSSL&#xff0c;以及在cmake官网下载了最新版 cmake-3.27.4.tar.gz 顺利安装gcc 和OpenSSL 但执行编译cmake时&#xff0c;报错找不到OpenSSL…

【python】读取.dat格式文件

import binascii# 打开二进制文件以只读二进制模式 with open(EXCEL/文件.dat, rb) as file:binary_data file.read()print(binary_data)# 将二进制数据转换为十六进制字符串 hex_data binascii.hexlify(binary_data).decode(utf-8) # binary_data 现在包含了文件的二进制内容…

计算机图形学线性代数相关概念

Transformation&#xff08;2D-Model&#xff09; Scale(缩放) [ x ′ y ′ ] [ s 0 0 s ] [ x y ] (等比例缩放) \left[ \begin{matrix} x \\ y \end{matrix} \right] \left[ \begin{matrix} s & 0 \\ 0 & s \end{matrix} \right] \left[ \begin{matrix} x \\ y \en…

页面页脚部分CSS分享

先看效果&#xff1a; CSS部分&#xff1a;&#xff08;查看更多&#xff09; <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…

Qt+C++自建网页浏览器-Chrome blink最新内核基础上搭建-改进版本

程序示例精选 QtC自建网页浏览器-Chrome blink最新内核基础上搭建-改进版本 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC自建网页浏览器-Chrome blink最新内核基础上搭建-改进版…

linux并发服务器 —— linux网络编程(七)

网络结构模式 C/S结构 - 客户机/服务器&#xff1b;采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互&#xff1b;C/S结构中&#xff0c;服务器 - 后台服务&#xff0c;客户机 - 前台功能&#xff1b; 优点 1. 充分发挥客户端PC处理能力…

机器学习笔记之最优化理论与方法(六)无约束优化问题——最优性条件

机器学习笔记之最优化理论与方法——无约束优化问题[最优性条件] 引言无约束优化问题无约束优化问题最优解的定义 无约束优化问题的最优性条件无约束优化问题的充要条件无约束优化问题的必要条件无约束优化问题的充分条件 引言 本节将介绍无约束优化问题&#xff0c;主要介绍无…

DDR2 IP核调式记录2

本文相对简单&#xff0c;只供自己看看就行。从其它的博客找了个代码&#xff0c;然后记录下仿真波形。 1. 功能 直接使用quartus生成的DDR2 IP核&#xff0c;然后实现循环 -->写入burst长度的数据后读出。 代码数据的传输是32位&#xff0c;实际使用了两片IC。因此IP核也是…

51单片机热水器温度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机热水器温度控制系统仿真设计 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单 &&下载链接 51单片机热水器温度控制系统仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#x…

【图解RabbitMQ-2】图解JMS规范与AMQP协议是什么

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

FreeRTOS操作系统中,断言输出 Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 原因

分析&#xff1a;Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 出现这个原因表示&#xff0c;你现在系统某个中断的优先级高于FreeRTOS可管理的优先级范围&#xff0c;一旦你这个中断触发&#xff0c;断言的信息即你串口就会输出这个条语句&#xff08;前提你串口…

这3个教学难题,你中招了吗?

在当今教育领域&#xff0c;提高教育质量和学生学习成果是学校和教育机构的首要任务之一。教育管理者、教师和政策制定者都在寻求创新的方法来监督和改进教育过程。 在线巡课系统应运而生&#xff0c;成为教育界的一项重要工具&#xff0c;旨在帮助学校管理者更好地理解教育实践…

Python爬虫:下载小红书无水印图片、视频

该代码只提供学习使用&#xff0c;该项目是基于https://github.com/JoeanAmier/XHS_Downloader的小改动 1.下载项目 git clone https://github.com/zhouayi/XHS_Downloader.git2.找到需要下载的文章的ID 写入main.py中 3.下载 python main.py最近很火的莲花楼为例<嘿嘿…

uniapp 集成蓝牙打印功能(个人测试佳博打印机)

uniapp 集成蓝牙打印功能&#xff08;个人测试京博打印机&#xff09; uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能&#xff0c;个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…

【Apollo】开启Apollo之旅:让自动驾驶如此简单

前言 Apollo 是百度公司推出的自动驾驶平台。它是一个综合性的自动驾驶解决方案&#xff0c;提供了包括感知、决策、规划和控制等核心功能&#xff0c;以及地图、定位、仿真、数据管理等配套工具。 文章目录 前言Apollo 的发展历程Apollo 8.0新特性软件包管理感知框架工具链小…

开发指导—利用 CSS 动画实现 HarmonyOS 动效(二)

注&#xff1a;本文内容分享转载自 HarmonyOS Developer 官网文档 点击查看《开发指导—利用CSS动画实现HarmonyOS动效&#xff08;一&#xff09;》 3. background-position 样式动画 通过改变 background-position 属性&#xff08;第一个值为 X 轴的位置&#xff0c;第二个…

西电Latex毕业模板使用时的小技巧

西电Latex毕业模板 配置的环境&#xff1a;textlivetextstudio \qqad 空格 参考文献先设置成bib&#xff0c;放到tex文件下&#xff0c;然后如下操作就可以将参考文献加载进去 如果搜不到相关文献的bib格式&#xff0c;可以用zotero软件将下载好的文件导出为bib格式&#xf…

Hadoop HDFS 高阶优化方案

目录 一、短路本地读取&#xff1a;Short Circuit Local Reads 1.1 背景 ​1.2 老版本的设计实现 ​1.3 安全性改进版设计实现 1.4 短路本地读取配置 1.4.1 libhadoop.so 1.4.2 hdfs-site.xml 1.4.3 查看 Datanode 日志 二、HDFS Block 负载平衡器&#xff1a;Balan…