【发布时间】:2021-11-18 01:50:28
【问题描述】:
我正在研究破解游戏以允许隆隆声。这需要将现有 rom 中的一行代码替换为我要调用的新函数的 bl,但是我很难计算必要的偏移量。
我要替换的函数位于地址:0x080011b0
我想跳转到的地址是:0x0817d7c0
我还得到了以下示例:
Calculate the jump address from 0xA20C0 to 0x3E7900. Here it is important to distinguish between arm32bit
code or thumb16bit code. This game is 16bit.
0x3E7900-0xA20C0=0x345840
0x345840-4=0x34583C
High=0x34583C>>12=0x345
Low=(0x34583C&0xFFF)/2=0xC1E
machineCode = ((0xFF00 | low) << 16) | (0xF000 | high)= 0xFC1EF345
我相当肯定游戏是 16 位的,但是我什至无法重现示例的结果,更不用说生成我自己的跳转偏移了。我相信这些值是用 little-endian 编码的,但我已经尝试过大运气和小运气(我可能在这里做错了)。具体来说,当我执行按位运算(& 和 |)时,计算开始中断。
如果有人可以引导我完成示例以生成提供的偏移量,或者可以计算我需要的偏移量并引导我完成它,我将非常感激。如果你能告诉我如何在 32 位 ARM 模式下也可以加分。
【问题讨论】:
-
您为什么处理器编程?这是GBA吗?另外:您自己的代码也是 16 位(拇指)代码吗?你能打败LR吗?您能否在要修补的站点周围显示内存转储?
-
我自己在调试器中挖掘内存时能够弄清楚,但如果你仍然愿意,我可以得到一个转储。编辑:是的,这是为了将闪存卡的隆隆声功能破解到 GBA 游戏中。
-
你需要将两半分开。从除法(右移 1)开始,然后提取字段。你上次做的时候面具是错的。
-
据我所知,Game Boy Advance 始终是 little-endian
标签: assembly arm offset machine-code instruction-encoding