街机模拟游戏逆向工程(HACKROM)教程:[4]MAME的作弊功能

news2024/11/20 13:40:26

需要对游戏进行逆向分析,我们首先需要了解游戏的内存系统。在一个游戏的运行过程中,游戏中所有的变动,比如玩家的血量,敌人的血量,玩家所在位置,场景的位置,剩余时间,等等一切,都在内存中有所体现。所有的数据,都保存在内存的某个地址。

比如一个玩家血量减少的大概逻辑为:

1、当被敌人攻击,程序分析敌人的攻击力数据。

2、从玩家血量的内存地址读取玩家的当前血量,把当前血量以敌人的攻击力大小减少相对应的值,再把已减少的值写入玩家血量的内存地址。

3、玩家的血量是否为空,如果为空,进入死亡程序分支。如果不为空,进入非死亡程序分支。

在这个逻辑下,我们首先需要知道玩家的血量的内存地址。我们如何找到玩家血量的内存地址呢,MAME内自带内存搜索指令,可以方便地搜索内存数据,下面,我们尝试用MAME自带的指令来搜索到"恐龙新世纪"游戏中1号机位对应玩家的血量。

我们搜索一个内存数据的逻辑为,我们首先在一定的情况下,把内存的所有数据保存下来,比如我们当前需要搜索玩家血量:

1、我们在玩家血量为满的情况下,把所有内存的数据保存下来。

2、我们再次进入游戏,利用敌人或其它方式让玩家的血量发生变化,再次搜索之前保存下来的数据,因为血量已经发生了变化,相对于之前的数据,血量的内存数据也必定发生了变化,我们把之前的数据与已变化的数据进行对比,筛选出已经发生变化的数据。

3、因为内存里的数据量通常比较大,虽然血量发生了变化,但可能有无数的数据也同样发生了变化,所以,我们通过不断地让血量发生变化,通过多次的筛选,来一步步地减少所筛选出来地址数量,直到找到对应玩家血量的地址。

我们介绍一下MAME内存搜索功能指令:

cheatinit(ci)            -初始化搜索选定的内存区域

cheatinit [[<sign>[<width>[<swap>]]],[<address>,<length>[,<space>]]]

参数1 
<sign> 可以是 u(表示无符号)或 s(表示有符号),
<width> 可以是 b(表示 8 位(字节))、w(表示 16 位(字))、d(表示 32 位(双字))或 q对于 64 位(四字); 
<swap> 可以是 s 来表示相反的字节顺序。  如果第一个参数被省略或为空,则使用上一次作弊搜索的数据格式,如果这是第一次作弊搜索,则使用无符号 8 位格式。

参数2
<address> 指定开始搜索的地址,
<length> 指定要搜索的内存量。  如果指定,将搜索 <address> 到 <address>+<length>-1(含)范围内的可写 RAM;  否则,将搜索地址空间中所有可写的RAM。
cheatrange(cr)        -添加选定的内存区域进行作弊搜索

cheatrange <address>,<length>

参数:
<address> 指定开始搜索的地址,
<length> 指定要搜索的内存量。  <地址> 到 <地址>+<长度>-1(含)范围内的可写 RAM 将添加到要搜索的区域。
cheatnext (cn)         -通过与之前的值进行比较来筛选对应的地址
cheatnextf(cn)         -通过与初始化的值进行比较来筛选对应的地址

cheatnext <condition>[,<comparisonvalue>]
cheatnextf <condition>[,<comparisonvalue>]

参数1:
all                                 更新最后的值
equal (eq)                          如果没有 <comparisonvalue>,则搜索与之前搜索相同的值;  使用 <comparisonvalue>,搜索等于 <comparisonvalue> 的值。
notequal (ne)                       如果没有<comparisonvalue>,则搜索不等于之前搜索的值;  使用 <comparisonvalue>,搜索不等于 <comparisonvalue> 的值。
decrease (de, -)                    如果没有<comparisonvalue>,则搜索自上次搜索以来减少的值;  使用 <comparisonvalue>,搜索自上次搜索以来减少了 <comparisonvalue> 的值。
increase (in, +)                    如果没有<comparisonvalue>,则搜索自上次搜索以来增加的值;  使用 <comparisonvalue>,搜索自上次搜索以来增加了 <comparisonvalue> 的值。
decreaseorequal (deeq)              搜索自上次搜索以来已减少或未更改的值(不使用 <comparisonvalue>)。
increaseorequal (ineq)              搜索自上次搜索后增加或不变的值(不使用 <comparisonvalue>)。
smallerof (lt, <)                   搜索小于 <comparisonvalue> 的值(<comparisonvalue> 是必需的)。
greaterof (gt, >)                   搜索大于 <comparisonvalue> 的值(<comparisonvalue> 是必需的)。
changedby (ch, ~)                   搜索自上次搜索以来已按 <comparisonvalue> 更改的值(<comparisonvalue> 是必需的)。

cheatlist(cl)            -显示已搜索相匹配的列表,或将它们保存到文件中

cheatlist [<filename>]


 

cheatundo(cu)         -撤消最后一次作弊搜索(仅限状态)

cheatundo

我们进入游戏来实际测试一下:

首先,我们进入游戏,最好的方式是保持满血,场景内保留一个敌人,场景内保留一个回血的道具,在"恐龙新世纪"中,比较好的地方为第一个场景进入门后会有一个回血道具,我们清理完场景,保留一个敌人和一个回血道具,在此时,我们保留一个存档:

此时,我们按键盘的"~"键进入DEBUG调试器,在命令框中输入:

ci

按F12回到游戏,让玩家的血量发生变化(被敌人攻击,或使用扣血技能,或拾取回血道具),发生了变化后,按"~"再次进入DEBUG调试器,在命令框中输入:

cn -

//如果血量减少时使用减号"-"参数;
//如果血量增加使用加号"+"参数;
//如果血量不变使用"eq"参数;

这里提示,对比筛选出59个对应的地址。

再次按F12回到游戏,让玩家的血量发生变化(被敌人攻击,或使用扣血技能,或拾取回血道具),发生了变化后,按"~"再次进入DEBUG调试器,在命令框中输入:

cn -

//如果血量减少时使用减号"-"参数;
//如果血量增加使用加号"+"参数;
//如果血量不变使用"eq"参数;

尽量多次循环以上步骤,直到得到的地址足够少,最好可以得到唯一地址。

如果未能得到唯一地址,可以使用命令:

cl

列出已经得到的地址列表,尝试一个个测试得到的地址。

我们现在得到了唯一的地址:FFB2E1

我们在调试器中,新建一个内存窗口:

输入我们得到的地址:

在68000中,我们最好使用偶数地址,比如FFB2E1,我们选择偶数地址:FFB2E0

 

我们可以看到,当前FFB2E1地址的值为3D,这是一个16进制值。也就是说,当前玩家的血量对应的值为3D,我们可以尝试在内存窗口把该值进得更改,鼠标选中该值,在键盘输入你想需要的值,如50:

回到游戏,我们会发现,血条并未发生变化,因为血量发生变化后,游戏的显示并未发生变化,这其中的逻辑为,当血量发生变化后,会调用血条显示的程序。但这时通过其它方法去更改玩家的血量时,程序并不会进入血条显示的程序。所以,在显示上,血条并未发生变化。我们尝试再次在游戏中让血量发生变化(被敌人攻击,或使用扣血技能,或拾取回血道具),才可以测试出,我们对血量的改动是否成功。

以上就是对于MAME搜索内存的介绍,几乎所有逆向工程的开始都基于对于内存的搜索,所以,在之后对于游戏的所有逆向研究,几乎都会用到内存搜索功能。建议对该功能更加详尽地了解。

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

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

相关文章

如何制作一本电子版时尚杂志

​随着数字媒体的崛起&#xff0c;电子版时尚杂志已成为一种新的时尚风向标。然而&#xff0c;如何制作一本独具特色的电子版时尚杂志&#xff0c;却让许多初涉此领域的品牌和设计师感到困惑。教你一些方法&#xff0c;制作一本电子版时尚杂志。 一、明确目标与定位 首先&…

10.云原生之在线开发调试

云原生专栏大纲 文章目录 vscode-server介绍VSCode Server 和云开发结合vscode-server安装code-server安装插件在线安装插件离线安装插件安装中文插件 配置开发环境在容器中安装开放环境Dockerfile制作镜像 git拉取项目 vscode-server介绍 VSCode Server&#xff08;Visual S…

建造者模式深入理解:演示建造单个和多个产品的实践,结合模板模式,通俗易懂

首先呢看下建造者的定义是什么样的&#xff0c;先读一遍 建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它主要用于将一个复杂对象的构建过程与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表现形式。这种模式…

如何用Mac工具制作“苹果高管形象照”

大伙儿最近有没有刷到“苹果高管形象照”风格&#xff0c;详细说来就是&#xff1a; 以苹果官网管理层简介页面中&#xff0c;各位高管形象照为模型&#xff0c;佐以磨皮、美白、高光等修图术&#xff0c;打造的看上去既有事业又有时间有氧的证件照&#xff0c;又称“苹…

【教学类-43-21】完结篇 16宫格(4*4可算全部数字)

作品展示&#xff1a; 16宫格里面的4*4小格子可以凑满1-16&#xff0c;旁边的7宫格格2份 背景需求&#xff1a; 做完了1-20宫格的A4模板&#xff0c;最后做一个16宫格小格子&#xff08;附加7宫格2套&#xff09;的样式&#xff0c;只有4宫格&#xff08;2*2&#xff09;、9宫…

uniapp+vue3打包问题记录

**背景&#xff1a;**打包app出现问题&#xff0c;只显示底部导航的文字&#xff0c;其他一片空白 1. pages.json文件&#xff1a;tabBar中的iconPath图标格式不支持svg&#xff0c;只支持&#xff1a;png, jpg, jpeg的格式&#xff0c;当图片改为.png的时候可以正常显示 2. …

代码随想录算法训练营第6天 | 242.有效的字母异位词 , 349. 两个数组的交集 , 202. 快乐数 , 1. 两数之和

哈希知识基础 文章链接&#xff1a;https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E8%A1%A8 242.有效的字母异位词 题目链接&#xff1a;https://leetcode.cn/problems/valid-anagram/description/…

cv 不能正常读取中文路径

之前一直以为是PyQT的getOpenFileNames方法不能读取中文路径的。多次尝试后发现不是&#xff0c;是OpenCV的问题。 self.selected_imgPaths, _ QtWidgets.QFileDialog.getOpenFileNames(self, "打开图片", "./pending_images", "*.jpg;;*.JPG;;*.png…

C语言——实用调试技巧

一、为什么漏洞叫bug 为什么漏洞的英文是bug&#xff0c;众所周知bug有虫子的意思&#xff0c;这其实有一个很有名的故事。 1947年&#xff0c;计算机科学的先驱格蕾丝霍普&#xff08;Grace Hopper&#xff09;和她的团队在使用哈佛大学的马克二电脑时&#xff0c;发现了一个…

为CT_P自动注册与CT_Run相关的方法

概述 在docx.oxml.text.paragraph模块中定义了CT_P段落对象元素类&#xff0c;但是CT_P中并未定义add_r等与CT_Run相关的方法。在不断探索源码逻辑的过程中&#xff0c;对这种自动为类注册合适的方法的功能进行了梳理——xmlchemy这个模块设计的真好&#xff01;&#xff01;&…

rust跟我学(一):模块编写与使用

在rust中,单元文件可以被称为模块。 以下内容,将以get_local_info为例,讲解mod在工程中的使用。 先看下图,network.rs是src文件夹里的一个文件,我们可以单独把这个文件理解成一个模块。Rust比较智能,它可以将文件名称直接理解成一个模块,这在go里面是做不到的。 Rust其实…

​​社交媒体与新闻:Facebook在信息传播中的作用

社交媒体已经成为我们获取和传播新闻的主要渠道之一&#xff0c;而Facebook作为社交媒体的巨头&#xff0c;在信息传播中扮演着举足轻重的角色。本文将深入探讨社交媒体对新闻传播的影响&#xff0c;聚焦于Facebook在这一领域的独特作用&#xff0c;以及这种作用对我们的新闻体…

2024北京智博会:共赴科技盛会,助力跨界融合与实体经济深度发展

2024年6月&#xff0c;一场备受瞩目的科技盛会将在北京亦创国际会展中心拉开帷幕。作为国内外科技交流的重要平台&#xff0c;2024北京智博会将汇集众多科技领域的精英和企业&#xff0c;共同探讨跨界应用、实体经济深度融合等议题&#xff0c;为推动科技强国发展注入新动力。 …

SSL之mkcert构建本地自签名

文章目录 1. 什么是SSL2. mkcert&#xff1a;快速生成自签名证书2.1 mkcert的工作流程如下&#xff1a;2.2 window 本地实现自签证书2.2.1 下载安装2.2.2 下载,生成本地 SSL2.2.3 生成 pem 自签证书,可供局域网内使用其他主机访问。2.2.4 使用-psck12 生成*.p12 文件 2.3 Sprin…

7.11、Kali Linux中文版虚拟机安装运行教程

目录 一、资源下载准备工作 二、安装教程 三、kali linux换源 四、apt-get update 报错 一、资源下载准备工作 linux 中文版镜像历史版本下载:http://old.kali.org/kali-images/ 大家可以自行选择版本下载&#xff0c;本人下载的是2021版本 二、安装教程 打开vmvare wokst…

修炼九阳神功——“函数”

目录 前言 1. 函数的概念 2. 库函数 2.1 标准库和头⽂件 2.2 库函数的使用方法 2.2.1 功能 2.2.2 头⽂件包含 2.2.3 实践 2.2.4 库函数⽂档的⼀般格式 3. 自定义函数 3.1 函数的语法形式 3.2 函数的举例 ​编辑 4. 形参和实参 4.1 实参 4.2 形参 4.3 实参和形…

【dc-dc】世微AP5127平均电流型LED降压恒流驱动器 双色切换的LED灯驱动方案

这是一款双色切换的LED灯方案&#xff0c;12-50V 降压恒流,输出&#xff1a;6V 2.5A ​ 这是一款PWM工作模式 , 高效率、 外围简单、内置功率管&#xff0c;适用于 输入的 高 精度降压 LED 恒流驱动芯片。输出大功率可 达 25W&#xff0c;电流 2.5A。 可实现全亮/半亮功能切换…

Ansible Filter滤波器的使用(二)

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西&#xff0c;但是想来ansible不太可能有什么滤波操作&#xff0c;所以这个东西本质是一个数值筛选器&#xff0c;内置函数&#xff0c;本质是一个为了做区别化的工具…

“15个必备的自动化测试工具,助你构建2024年的自动化策略!“

以下为作者观点&#xff1a; 如何选择正确的自动化测试工具&#xff1f;自动化测试工具是旨在通过自动化测试脚本验证功能或非功能软件需求的应用程序&#xff0c;帮助加快发布速度、提高项目质量并强化成果。 自动化测试工具可以帮助开发测试人员轻松创建、运行和维护测试&a…

闲鱼宝库亮相!闲鱼商品详情关键词搜索电商API接口助你畅享无尽好货!

随着互联网的快速发展&#xff0c;电商平台的崛起已经改变了人们的购物习惯。而在众多电商平台中&#xff0c;闲鱼作为一款社区二手交易平台&#xff0c;一直备受用户喜爱。如今&#xff0c;闲鱼宝库正式亮相&#xff0c;为用户带来了更加全面、详细的商品详情关键词搜索电商AP…