如何让旧的 IDA 理解环绕映射的 68k RAM?

逆向工程 艾达 地址 摩托罗拉
2021-06-11 11:32:54

更新 3:我了解到一种方法是简单地创建一个新的处理器定义,将现有的 68k 反汇编器移植到 IDA SDK 应该相当简单。在我的情况下仍然太麻烦,因为我只有一个 68k 项目需要分析。此解决方案将适用于较旧的 IDA 版本,以防免费更新期已过并且更新太少而无法刷新 IDA 许可证。

更新 2:Igor Skochinsky 指出有一个错误修正。我仍然想知道旧 IDA (6.1) 的最佳解决方法是什么。

更新:我发现更高版本的 IDA,例如 6.8(我无权访问)在机器 .cfg 文件中有一个“mapaddr”命令。不知道mapaddr具体是做什么的,可以多映射地址吗?

原帖:

在这个问题中:https : //stackoverflow.com/questions/30987128/m68k-ida-pro-24-bit-addressing/38314561用户遇到了与我类似的问题,但从未解决。

许多 68000 系统将 64kb 的 RAM 映射到两个 32kb 段,FF8000-FFFFFF 和 0-7FFF,因此您可以使用字寻址更快地到达整个 RAM,因为分支偏移量是 15 位+符号。这在当时在其他处理器上也很常见。

我像这样将代码转储分成两部分,但是实际上并没有起作用,因为摩托罗拉 68k 在寻址时有点精神分裂。是 16 位、24 位还是 32 位?这真的是一次性的。

IDA 没有考虑到这一点,这意味着它不会理解这样的指令:

movea.w #$8234, a0
move.l (a0.w), d0

这应该将 FFFF8234 处的双字移动到 d0。我希望 IDA 了解 $8234 与 $ffff8234 相同并使用符号等。

我所做的是找到每条 movea 和 lea 指令,如果它们加载时环绕地址,我将它们更改为引用 FFxxxx 空间的手动操作数。

然而,虽然这让我检查引用(通过单击它们)IDA 并没有真正理解寻址是如何工作的,这意味着我从环境中得到的其他帮助很少,并且没有正确检测到子例程和调用。

作为记录,我不是高级 IDA 用户。

编辑:对于非 68k 人来说,movea 和 lea 只是可以将内容放入地址寄存器的移动指令,(几乎)所有寻址都使用地址寄存器 a0-a7。

1个回答

IDA 6.9 中添加了对 68k 的 24 位地址空间的支持:https : //www.hex-rays.com/products/ida/6.9/

BUGFIX:mc68k:mc68000、mc68010、cpu32 的地址总线宽度减少到 24 位