- 博客(64)
- 收藏
- 关注
原创 街机模拟游戏逆向工程(HACKROM)教程:[19]思路的多样性
我们回到游戏开始,向前走一点,走到敌人马上就要出现的临界点,为什么要走到临界点,是因为在敌人出现前,会出现两个飞龙,因为敌人的内存很多是共享的,这两个飞龙很可能会占用掉这个地方的内存。我们已经知道,敌人出现需要一个条件,当这个条件满足时,敌人的出现,程序会需要初始化这个敌人出现的位置,也就是说,我们可以利用敌人的坐标位置来一步步找到敌人出现的条件检测位置。我们回到游戏观察敌的走动,我们猜测敌人向左走时敌人的坐标会减少,向右时会增加,我们发现敌人移动了,就进入调试器,如果敌人向左移动了,使用。
2024-01-23 19:30:48
924
原创 街机模拟游戏逆向工程(HACKROM)教程:[18]分析的思路
首先,敌人的出现是需要一个条件的,我们在游戏中可以发现,游戏开始后,我们如果不向前移动,或者向后移动,敌人是不会出现的,只有我们向前移动了一定的距离后,敌人才会出现,那么,我们可以猜测,敌人出现的条件就是场景的位置,只有玩家移动到场景一定的位置时,敌人才会出现。那么,我们如果需要找到其它的一些数据,我们应该如何理清其中的思路呢,我们下面用一个实例来实现改变出现的敌人。但是,我们同时看到,这些地址有多个地址的数值和FF8744的值是一样的,也就是说,这些地方所存的,也有可能是场景的坐标值。
2024-01-23 19:30:34
1330
原创 街头霸王II神经网络AI训练项目
该项目通过对街头霸王II进行足够的人工或自动训练,最终生成的神经网络可以让对局双方在AI的掌控下自动进行对局。要求:一、MAME版本:MAME01850b-64位二、ROM版本: “街头霸王Ⅱ加速终极格斗日版”(sf2hfj)三、同时,还需要先保存一个对局中的存档(用Shift+F7保存一个存档)
2024-01-22 17:53:18
828
原创 街机模拟游戏逆向工程(HACKROM)教程:[17]实战分析程序运行逻辑
在之前我们已经测试过,在"恐龙新世纪"这个游戏中,我们在使用扣血技能时,之所以可以实现减少血量,是利用sub指令来减少血量所对应的内存的值。那么,经过这个测试,我们又可以猜测,当我们拾取回血道具时,用来增加血量的指令是否为和sub相反的add指令呢,我们同样可以测试这个情况,我们硬重启一下游戏,默认硬重启为shift+F3。我们可以看到,这句sub指令和之前的一样,占用了4个字节空间,所以,因为每个nop指令是占用2个字节空间,要让这句sub指令完全失去做用,我们需要用两个nop指令来替换这句指令。
2024-01-22 10:19:35
1292
原创 街机模拟游戏逆向工程(HACKROM)教程:[16]68K汇编-条件分支指令
第二个逻辑,N(负结果)标志为1,V(溢出)标志为0,所以第二个逻辑成立。第二个罗辑,虽然V(溢 出)标志为0,但是N(负结果)标志为1,所以第二个逻辑也不成立。第一个逻辑,虽然N(负结果)标志为1,但是V(溢 出)标志为0,所以第一个逻辑不成立。但是只要有一个逻辑成立,就会发生跳转,这里,因为第二个逻辑已经成立,所以,这里会发生跳转。第三个逻辑,N(负结果)标志为1,V(溢出)标志为0,所以第三个逻辑不成立。第一个逻辑,Z(零结果)标志为0,所以第一个逻辑不成立。二、[为负] 与 [非溢出]
2024-01-22 10:19:19
725
翻译 MAME模拟器debug帮助文档汉化五(断点调试器命令)
通过可选的 参数,可以指定一个表达式,该表达式将在每次断点地址被击中时进行评估。如果指定了 ,则只会列出该 CPU 的断点。请注意,禁用断点并不会删除断点,只是暂时将断点标记为非活动。禁用的断点不会导致执行停止,其相关的条件表达式不会被求值,其相关的命令也不会被执行。如果指定了 ,所指的断点将被禁用。如果未指定 ,则将禁用所有断点。如果指定了 ,将清除所指的断点。如果指定了 ,将启用所指的断点。
2024-01-22 10:15:44
92
翻译 MAME模拟器debug帮助文档汉化四(执行调试器命令)
启动或停止跟踪指定 的执行,如果未指定 CPU,则跟踪当前可见的 CPU。忽略调试器中指定的 CPU。开始或停止跟踪指定的 ,如果没有指定 CPU,则开始或停止跟踪当前可见的 CPU。通过可选的 参数,可以指定一个表达式,每次指定的异常条件触发时,都会对该表达式进行评估。需要注意的是,由于它能检测从异常返回的条件,如果试图跳出子程序,而在子程序完成前发生了中断/异常,执行可能会在异常处理程序结束时提前停止。 参数是可选的,如果省略,默认值为 1。
2024-01-22 10:13:13
135
原创 街机模拟游戏逆向工程(HACKROM)教程:[15]68K汇编-测试对比指令
测试或对比指令会检查源操作数 和 目标操作数的某些特定条件的状态,然后设置相对应的CCR的某些状态标志,这些指令通常不会对源操作数和目标操作数产生改变。
2024-01-21 11:59:42
1263
原创 街机模拟游戏逆向工程(HACKROM)教程:[14]68K汇编-标志寄存器
在M68K中,有许多条件分支指令,和jmp指令一样也会修改PC达到程序跳转或分支的目的,不过这些会根据一些情况或状态来选择是否跳转。而在M68K中,有一个特别的寄存器来标记这些情况。
2024-01-21 11:59:28
1173
原创 街机模拟游戏逆向工程(HACKROM)教程:[13]68K汇编-jmp指令
如:move.w d0,-(sp),执行时,sp寄存器的值会先减少.w长度,也就是2个字节,这时,sp的值为$10000 - $2 = $FFFE,然后才会把数据传递到sp所指向的地址。我们要理解该指令的作用,先要理解堆栈(stack),堆栈是一块可以用来临时存储重要信息的内存空间,你可以指定 m68k 的堆栈的地址在哪,也可以随时地修改堆栈的地址。bsr与jsr指令的关系,和jmp和bra的关系是一样的,bsr与jsr指令的作用基本相同,不同之处和bra指令一样,bsr指令的寻址范围是有限制的。
2024-01-20 02:05:12
692
原创 街机模拟游戏逆向工程(HACKROM)教程:[12]68K汇编-程序流控制
PC寄存器也是M68K的一个寄存器,他的作用是存储当前运行程序的位置,我们在之前的所有测试程序,都是存在“只读存储器”中的,也就是常常说到的ROM。这里需要注意,我们PC值的选择必须为指令的开始,如果设置了比如$1002,那么机器会执行:0000 0325这段指令,这种情况下,计算机不会正常运行完整的指令,这会造成两种情况,运行错误或者不能实现指令的功能。那么,也就是说,这句我们输入的指令,经过编译器的翻译,生成了一段长度为6个字节的16进制的数值。比如该段代码的第二句,是生成了长度为4个字节的数值。
2024-01-20 02:04:53
1570
原创 街机模拟游戏逆向工程(HACKROM)教程:[11]68K汇编sub指令
该指令的作用是[源操作数]减[目的操作数],结果传递至[目的操作数],[源操作数]保持不变。如果d0里原本是00000010,那么指令执行后d0里的内容会变成00000000。如果d0里原本是0000002E,那么指令执行后d0里的内容会变成0000001E。如果d0里原本是000000E4,那么指令执行后d0里的内容会变成000000D4。如果d0里原本是00000008,那么指令执行后d0里的内容会变成000000F8。sub -减法指令。
2024-01-19 13:52:17
666
原创 街机模拟游戏逆向工程(HACKROM)教程:[10]68K汇编add指令
add :加法指令该指令的作用是[源操作数]加[目的操作数],结果传递至[目的操作数],[源操作数]保持不变。
2024-01-19 13:52:00
679
原创 街机模拟游戏逆向工程(HACKROM)教程:[9]68K汇编move指令
我们可以把这段内存看成是一个对象(OBJ),在这个对象中,保存了玩家人物比如:血量,动作,位置,速度,人物ID,颜色,等所有数值。在之前的文章中,我们已经多次测试过move这个指令,move指令可以说是68000汇编中最常用的一个指令,该指令可以把源操作数传递到所有寄存器以及所有的内存地址。如:$10(a1)的格式,这个我们在之前并没有见过,其实,带有偏移值的代码格式如:($10,a1) 和$10(a1)的格式都是正确,并且作用都是一模一样的。而上面的部份指令,我们已经在之前的测试中尝试过了。
2024-01-18 10:35:53
778
原创 街机模拟游戏逆向工程(HACKROM)教程:[7]68K汇编寄存器
在之前的章节中,我们测试了一些程序代码,代码中很常见的一些比如D0,D1,D2....A0,A1,A2......之类的代码。这些代码中的字符是告诉汇编程序,这里是指向一个寄存器。寄存器是处理器的内部也有一些存储的空间,不同类型处理器根据其设计结构和设计目的的不同,各自有着不同类型的寄存器。在寄存器中,因为与CPU联系密切,数据的移动,加减操作,读取写入要比任何其他的存储设备(比如高速缓存,内存,硬盘等) 效率更高,速度更快(但是由于是集成在处理器内部,造价更高,存储空间也更小)。
2024-01-17 15:05:18
1392
原创 街机模拟游戏逆向工程(HACKROM)教程:[6]68K汇编简介
对于ADD,还有ADDA(加地址,不会影响标志位)、ADDI(加立即数)、ADDQ(快速加,加数不大于8以便于直接放在操作码中,比x86的INC指令书写麻烦但功能更强)、ADDX(影响进位符,用于大数运算)等。自增间址,如(A0)+。目的操作数的内容会随着执行指令而改变的操作数,也就是说,在该指令运行后,该操作数的值会产生不同的改变。可以观察到,和之前的结果不同,这次运行的结果为:FFFF0016,是因为这次的指令操作长度比之前的指令由单字节增加到了双字节,所以,这次的指令的影响范围也增加到了两个字节。
2024-01-17 15:05:04
1604
原创 街机模拟游戏逆向工程(HACKROM)教程:[5]中断
在上一章中,我们搜索到了"恐龙新世纪"模拟游戏中1号机台玩家血量的地址,那么,这个地址在对该游戏的逆向工程中可以起到什么作用呢?我们可以考虑,玩家血量的变动有多少种情况:1、被敌人攻击- 得到敌人某个技能的攻击力,自身的防御力。2、被队友攻击- 得到队友的攻击力。3、被道具击中- 得到道具的攻击力。4、使用扣血技能- 得到使用技能扣除的血量值。5、拾取回血道具- 得到某个回血道具回复的血量值。也许有更多的情况,这里只列出常见的几种情况。
2024-01-16 16:04:03
1589
原创 街机模拟游戏逆向工程(HACKROM)教程:[4]MAME的作弊功能
回到游戏,我们会发现,血条并未发生变化,因为血量发生变化后,游戏的显示并未发生变化,这其中的逻辑为,当血量发生变化后,会调用血条显示的程序。2、我们再次进入游戏,利用敌人或其它方式让玩家的血量发生变化,再次搜索之前保存下来的数据,因为血量已经发生了变化,相对于之前的数据,血量的内存数据也必定发生了变化,我们把之前的数据与已变化的数据进行对比,筛选出已经发生变化的数据。在一个游戏的运行过程中,游戏中所有的变动,比如玩家的血量,敌人的血量,玩家所在位置,场景的位置,剩余时间,等等一切,都在内存中有所体现。
2024-01-16 16:03:40
2189
原创 街机模拟游戏逆向工程(HACKROM)教程:[3]街机的ROM与RAM
在街机模拟器中运行一个街机游戏,我们除了需要一个模拟器工具 ,也需要有一个街机的ROM文件。街机的ROM文件,称之为Read-Only Memory,可以理解为只读存储器。在 ROM文件中,包括了游戏运行所需要的指令代码,声音,图像,等内容。而RAM全称为Random Access Memory,也叫主存,是与CPU直接交换数据的内部存储器,速度较快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。与ROM的最大区别是数据的易失性,断电或重启时,RAM所存储的数据将随之丢失。
2024-01-15 15:13:01
2371
原创 街机模拟游戏逆向工程(HACKROM)教程:[2]68K汇编的一些规则
在指令中,我们最常见到的符号有#和$。这其中的"#"符号是告诉汇编程序,这个符号后面的数值为一个立即数,而不是一个偏移值或一个地址。立即数可以理解为"单纯的一个数值"。我们会在后面通过一些实例来更详细说明什么叫立即数。而$符号是告诉汇编程序,这个符号后的数值为一个16进制数值;如果符号为%,那它后面的数值为一个2进制的数值;如果没有任何符号,它后面的数为一个10进制数值。上面这几条指令的意思是一样的,第一行是2进制数值(%),第二行是10进制数值,最后一行是16进制数值($)
2024-01-15 15:12:45
1704
原创 街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取
在计算机中,数据存储的介质一直在变化,从最早的穿孔纸带,到现在的固态硬盘。但存储的原理是一直没有变化的,在计算机中,我们所存储的数据,一直都是以二进制的形式被存储存在不同的介质中。计算机用位 (bits) 来存储数据,每一位可以是两种状态之一:0或1,这就是二进制数字。而这种形式十分不方便记忆,所以,为了方便记忆,每个二进制数字,都可以转换为十六进制数字或十进制数字。二进制十六进制十进制0001$0110010$0220011$0330100$0440101$055。
2024-01-14 22:45:13
1872
原创 街机模拟游戏逆向工程(HACKROM)教程:[0]工具
此时,我们只能看到游戏的运行,并不能观察到游戏的程序代码,我们如果需要查看游戏的程序代码,需要加入一些参数来启运MAME。该游戏下载到的ROM文件文件名为dino.zip的压缩包,和之前的游戏一样,我们同样把该文件放到roms文件夹下。要运行需要的游戏,我们还需要要下载对应的ROM文件,我们去MAME官网下载一些网友原创非商业用途的游戏来进行测试。我们想要对游戏进行逆向分析,首先我们需要的是一个可以查看游戏中的汇编代码的工具,这里选择也只能选择的是一款比较流行的多机种模拟器工具,MAME。
2024-01-14 22:44:59
3189
1
原创 在javascript环境实现web多标签页
JavaScript(简称“JS”)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。本例一共有1个主页面,6个标签页面,1个js脚本文件,1个CSS层叠式样式表文件。来实现多标签页功能,当选择某一个标签时,显示不同的标签页文件。这6个标签页文件可以一样,也可以稍作改动,方便测试页面的变化。
2024-01-02 20:38:51
946
原创 使用MQTT.JS创建一个网页版的MQTT客户端
MQTT.js 是一个开源的 MQTT 协议的客户端库,使用 JavaScript 编写,主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库。可以用于微信小程序、支付宝小程序等定制浏览器环境。
2024-01-02 20:22:07
4267
4
原创 ESP32入门九(超声波测距传感器)
超声波测距模块可提供非接触式距离感测功能;模块包括超声波发射器、接收器和控制电路。其工作原理为当接收到信号后,发射器发出音速的超声波信号,信号在受到物品阻挡时会返回并被接收器检测到,当接收器检测信号返回;通过计算信号发送的时间与接收到信号的时间差,配合音速的速度值,计算出传感器与阻挡物体之间的距离。
2023-12-31 15:20:13
2266
3
原创 ESP32入门八(DHT温湿度传感器)
DHT11是一款有已校准数字信号输出的温湿度传感器。精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃图样:以下为对应引脚定义:pin名称注释1VDD供电 3-5.5VDC2DATA串行数据,单总线3NC空脚4GND接地,电源负极因为量程问题,在大部份情况下,该传感器的工作范围主要集中在检测正常环境下的温湿度。如果需要测量更高的温度,可以选择比如NTC热敏电阻,或热电偶等传感器。
2023-12-31 15:20:07
2383
原创 ESP32入门七(中断)
中断用于处理在程序正常执行期间通过外部事件或者响应软件指令触发时发生的事件。比如,在一段呼吸灯的代码中,正常运行时的结果为LED从暗到亮,再从亮到暗持续地运行。我们可以通过一个中断来控制呼吸灯的运行和停止。使用中断功能,我们就不需要不停地监控一个引脚的状态,当中断被触发,内部控制器停止执行主程序,并调用中断服务例程 (ISR)。
2023-12-31 15:19:57
2502
原创 ESP32入门六(读取引脚的模拟信号[4]:Arduino-ESP32 ADC API详解)
在之前的章节中,我们测试了读取引脚的模拟值,ADC功能在实际中用途十分广泛,在本章中,我们把一些常用的ADC函数做一个详细的说明。
2023-12-31 15:19:32
1936
1
原创 ESP32入门六(读取引脚的模拟信号[3]:信号出现误差的原因[硬件篇])
在之前的文章中,我们介绍了ESP32在读取模拟信号时出现的误差的软件方面原因,在这一篇中,将会介绍并测试由于硬件或其它方面导致数据出现误差的原因。
2023-12-30 23:04:27
967
原创 ESP32入门六(读取引脚的模拟信号[2]:信号出现误差的原因)
也就是说,在默认设置下,我们可以读取的电压范围为0.15V~3.1V,但是我们在上一章中所使用的是3.3V的引脚,也就是说,当电压为3.1V时,我们读取到的数据已经等于4095,但电压继续上升时,我们读取到的数据并不会继续增加。在上一篇中,我们测试了用ESP32来接收模拟电压信号,在测试中,读取到的数据与现实存在一定的误差,在这一篇中,我们尝试了解出现误差的原因和解决方法。在观察过程中,误差慢慢增加,当输出电压到达2.47V时,读取到的电压为2.12V,误差达到最大误差值,为0.35。
2023-12-30 23:03:59
1306
原创 ESP32入门六(读取引脚的模拟信号[1.9]:生成一个模拟信号)
在之前的章节中,我们测试了读取一个模拟信号,同时根据模拟信号的值以pwm的方式控制一个LED的亮度。在之前的文章中,我们已经介绍过pwm信号和模拟信号。我们已经测试了生成pwm信号,而在之后的章节中,pwm信号已经无法满足测试要求,所以,在这里插入一个小章节,介绍在引脚生成一个模拟信号。我们在之后会用到该函数来生成一个模拟信号,可以更方便地测试ESP32的ADC功能。25号引脚会生成一个慢慢增加的模拟信号,而4号引脚会读取到该信号值。电路十分简单,只要将4号和25号引脚直接短接就可以了。
2023-12-29 23:38:49
563
原创 ESP32常用库之<WiFi.h>库详解
将给定的主机名解析为一个IP地址。如果传递的主机名是一个IP地址,它将被解析为IPAddress结构。输出网络设置信息到print接口(比如从串口输出)设置新的WIFI接口,可以设置多个SSID和密码。连接所有addAP函数所设定的WIFI。发送数据以流的方式到已连接的服务器。获取当前连接WIFI的SSID。获取连接到AP上的设备数量。通过TCP协议连接网络服务器。通过TCP协议连接网络服务器。通过TCP协议连接网络服务器。通过TCP协议连接网络服务器。删除最后扫描到的WIFI信息。
2023-12-29 23:15:45
2441
原创 ESP32入门六(读取引脚的模拟信号[1]:信号的误差)
在之前的文章,我们介绍了模拟信号,在本章中,我们用实例来详细介绍如何用ESP32来读取一个电压信号。模拟信号的读取对于很多传感器来说是十分重要的知识点,ESP32的模拟信号读取功能在硬件和软件上都存在一定的问题,我们需要一定的了解才能正确地解决这个问题,所以,本篇会分成几章来介绍。
2023-12-28 23:51:56
1610
原创 ESP32入门五(读取引脚的数字信号)
该代码选择了4号引脚为输入引脚,4号引脚通过一个开关与GND连接,当开关按下时,4号引脚与GND发生短接,把4号引脚的电平下拉为低电平。当放开开关时,4号引脚与GND断开,4号引脚的电平恢复为高电平,当4号引脚的电平为高时,13号引脚的电平设置为低,关闭LED。本文中,我们需要了解,并非所有的引脚都可以通过上拉或下拉模式来控制高低电平,因为各个版本不同,需要详细了解哪些引脚为特殊引脚,可以用上面的方法测试或下载官方文档了解更多。文档中说明了2号引脚默认的状态为下拉状态,而5号引脚的说明默认状态为上拉状态。
2023-12-28 23:51:39
2365
原创 一个简单的esp32温控器
本文用ESP32来制作一个简单的温控器,功能包括:可以检测并显示当前温度,可以设置最高温度和最低温度,设置升(如电热炉,电水壶)降(如冷水机,冰箱)温功能,可以显示当前设置的最高温度和最低温度。
2023-12-25 15:19:13
1844
1
原创 ESP32入门四(arduino或ESP32入门后一些新手难于理解的点)
网络上关于arduion或ESP32入门的文章多不胜数,大多数都是贴一个源码,很少会对实现原理做出说明,这里把一些入门后一些比较难于理解的点做一些说明。
2023-12-25 14:47:06
1117
原创 基于ESP32搭建物联网十六(用树莓派建立MQTT服务器[下])
因为版本的更新,每次下载,安装包的名字不一定相同,请记住安装包的名字"phddns_5.1.0_rapi_armhf.deb"外网域名可以在列表中选择,内网主机对应你的你的路由器分配给树莓派的IP,可以进入你的路由器中找到。在这,你需要先行注册一个花生壳的账号,并通过实名认证,后续用来绑定该SN码。服务器地址中填入你的外网域名,端口填入你随机生成的端口号,本例中生成的端口号为"54972"。至此,我们已经介绍完成用ESP32来搭建一个物联网所需要的大部份要素,在之后的文章中,列表中会有你刚刚添加的树莓派。
2023-09-10 19:28:36
394
原创 基于ESP32搭建物联网十六(用树莓派建立MQTT服务器[中])
我们已经成功为树莓派安装好系统,在本章中,我们将在该树莓派系统中安装MQTT服务器并测试使用。
2023-09-10 18:34:47
560
原创 基于ESP32搭建物联网十六(用树莓派建立MQTT服务器[上])
树莓派,(英语:Raspberry Pi,简写为RPi,别名为RasPi / RPI) 是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。随着Windows 10 IoT的发布,用户可以用上运行Windows的树莓派。在选择树莓派时,最好优先选择带有无线网卡的版本,从树莓派3B型开始,所以树莓派基本都会有无线网卡功能。树莓派系统安装树莓派系统的安装我们需要准备一个microSD卡和一个读卡器。下载后安装该工具,运行我们把SD卡插入读卡器,连接到电脑上,点击选择SD卡。
2023-09-09 19:30:00
826
恐龙新世纪jack所有动作数据
2024-01-15
恐龙新世纪hackrom资料敌方出现条件和初始化数据
2024-01-15
恐龙新世纪hackrom资料-所有人物动作对应的值
2024-01-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人