【问题标题】:ARM Assembly: Need help calculating jump offset for BL opcodeARM 汇编:需要帮助计算 BL 操作码的跳转偏移量
【发布时间】: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


【解决方案1】:

问题在于算法示例本身。我使用调试器来查看跳转偏移量在内存中的样子,它与示例中提供的完全不同。从那里我可以摆弄这些位,直到我得到必要的跳转偏移。不幸的是,我仍然不知道我应该如何计算它,但是嘿,我得到了答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多