街机模拟游戏逆向工程(HACKROM)教程:[19]思路的多样性

news/2024/5/18 14:27:17 标签: 经验分享, 游戏程序, 汇编

在上一章,我们找到了检测敌人出现条件的地方,并测试成功,但是找到这个位置的思路并不只有这个方法,这里我们提供另一个思路。

我们已经知道,敌人出现需要一个条件,当这个条件满足时,敌人的出现,程序会需要初始化这个敌人出现的位置,也就是说,我们可以利用敌人的坐标位置来一步步找到敌人出现的条件检测位置。

首先,我们需要找到敌人坐标位置的地址,进入游戏,向前走,让敌人出现,我们初始化搜索:

ci sw

我们回到游戏观察敌的走动,我们猜测敌人向左走时敌人的坐标会减少,向右时会增加,我们发现敌人移动了,就进入调试器,如果敌人向左移动了,使用

cn -

如果向右移动了,使用

cn +

同样循环多次,筛选出足够少的地址:

我们可以测试这些数据,当改变数据时敌人会发生突然的移动,那这个地址就是敌人的坐标数据:

通过测试,我们找到了ffd7dc这个地址为敌人的坐标数据。

我们回到游戏开始,向前走一点,走到敌人马上就要出现的临界点,为什么要走到临界点,是因为在敌人出现前,会出现两个飞龙,因为敌人的内存很多是共享的,这两个飞龙很可能会占用掉这个地方的内存。我们需要确保这两个飞龙消失后,再让这个敌人出现。

我们需要注意,这些不起眼的元素,很可以会景响我们的测试结果。

这时,该地址应该为0

我们监控这个位置

wp ffd7dc,1,w

然后,我们向前走,让这个敌人出现,会出现中断

我们可以猜测,这里是设置敌人一些出现数据的子程序。我们查看运行历史:

00FC98: move.w  ($744,A5), D1
00FC9C: cmp.w   D1, D0                    //
00FC9E: bhi     $fd02
00FD02: movea.l ($c,A4), A2
00FD06: tst.b   ($4dc,A5)
00FD0A: beq     $fd1e
00FD1E: move.w  (A2), D0
00FD20: move.w  ($744,A5), D1
00FD24: cmp.w   D1, D0                    //
00FD26: bhi     $fd44
00FD2A: bsr     $fdae
00FDAE: move.w  ($2,A2), D0
00FDB2: btst    #$7, D0
00FDB6: beq     $fdc0
00FDC0: move.w  D0, D1
00FDC2: andi.w  #$60, D1
00FDC6: beq     $fdec
00FDEC: move.w  D0, D1
00FDEE: andi.w  #$18, D1
00FDF2: beq     $fe1a
00FE1A: andi.w  #$7, D0
00FE1E: add.w   D0, D0
00FE20: add.w   D0, D0
00FE22: lea     (-$de,PC) ; ($fd46), A0
00FE26: movea.l (A0,D0.w), A0
00FE2A: jsr     (A0)
00483C: tst.w   ($65f8,A5)                //
004840: beq     $485a
004844: move.l  A4, -(A7)
004846: movea.w ($6602,A5), A4
00484A: movea.w (A4)+, A0
00484C: move.w  A4, ($6602,A5)
004850: subq.w  #1, ($65f8,A5)
004854: movea.l (A7)+, A4
004856: or.b    D0, D0
004858: rts
00FE2C: bcs     $fe64
00FE30: move.b  #$1, ($0,A0)
00FE36: move.w  ($4,A2), ($20,A0)
00FE3C: move.w  ($6,A2), ($8,A0)
00FE42: move.w  ($8,A2), ($10,A0)

我们向上寻找,找到数据对比的指令,很可能就是我们要找的地方,因为我们在上一章已经找到了这个地址,我们很容易就可以看出来:

00FD1E: move.w  (A2), D0
00FD20: move.w  ($744,A5), D1
00FD24: cmp.w   D1, D0                    //

所以,找到自已希望的程序位置并不是只有一个方法,如果一个方法很难找到想要的位置,可以尝试换一个思路,也许可能更快地找到你想要的。


http://www.niftyadmin.cn/n/5342509.html

相关文章

ffmpeg实现视频解码

参考100行代码实现最简单的基于FFMPEGSDL的视频播放器(SDL1.x) 雷神的代码用在VS2022编译需要做些调整 平台环境:windows VS 2022 #pragma comment(lib, "legacy_stdio_definitions.lib") //此为添加的代码 extern "C"…

java截取视频最后一帧照片作为封面

引言 我们在日常工作中经常会遇到上传视频&#xff0c;而产品还会要求截取视频某一帧作为封面展示&#xff0c;对于这种情况新手还是比较头疼的&#xff0c;那我们直接世界上最简单的实现方案。 怎么搞 1.提前引入包 <!--视频多媒体工具包 包含 FFmpeg、OpenCV--><…

08-微服务Seata分布式事务使用

一、分布式事务简介 1.1 概念 事务ACID&#xff1a; A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失 败的情况。 C&#xff08;Consistency&…

机器视觉系统选型-参数-镜头各个参数之间相互关系

焦距越小&#xff0c;景深越大&#xff1b;焦距越小&#xff0c;畸变越大&#xff1b; 光圈越大&#xff0c;图像亮度越高&#xff1b;光圈越大&#xff0c;景深越小&#xff1b; 光圈越大&#xff0c;分辨率越高&#xff1b; 一般像场中心较边缘分辨率高&#xff0c;像场中心较…

【分布式技术专题】「分布式技术架构」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)

探索Tomcat技术架构设计模式的奥秘 Tomcat系统架构分析Tomcat 整体结构Tomcat总体结构图以 Service 作为“婚姻”1) Service 接口方法列表 2) StandardService 的类结构图方法列表 3) StandardService. SetContainer4) StandardService. addConnector 以 Server 为“居”1) Ser…

WPF引用halcon的HSmartWindowControlWPF控件一加上Name属性就,无缘无故运行后报错

报错内容&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MC1000 未知的生成错误“Could not find assembly System.Drawing.Common, Version0.0.0.0, Cultureneutral, PublicKeyTokencc7b13ffcd2ddd51. Either explicitly load this assembly using a method …

如何测试python 版本与 torch 、 torchvision 版本是否对应?

python 版本与 torch 、 torchvision 版本的对应关系如下图所示&#xff1a; 打开 anaconda powershell prompt&#xff0c;输入如下命令&#xff1a; >python>>>import torch>>>c torch.ones((3,1)) //创建矩阵>>>c c.cuda(0) …

你知道Mysql的架构吗?

msyql分为server曾和存储引擎层 server层包括了连接器(管理连接&#xff0c;权限验证)、查询缓存&#xff08;命中直接返回结果&#xff09;、分析器&#xff08;词法分析&#xff0c;语法分析&#xff09;、优化器&#xff08;执行计划生成&#xff0c;索引选择&#xff09;、…