我正在对 IDA Pro 7.0 中的嵌入式 Z80 应用程序进行逆向工程。目标系统将一个地址范围映射到一对扩展板中的任何一个。地址解码逻辑根据内存映射寄存器中的一位来决定映射哪块板。我想我已经弄清楚如何映射这些段,但我无法弄清楚如何让 IDA 使用银行交换区域。
我已经像这样设置了我的细分市场:
Segment Start End Base
ROM1 00000 02000 0000
ROM2 02000 04000 0000
ROM3 04000 06000 0000
ROM4 06000 08000 0000
ROM5 08000 0A000 0000
IO 0A000 0B000 0000
RAM 0B000 0C000 0000
DREG 1C000 1D000 1000
DRAM 1D000 1E000 1000
DROM 1E000 20000 1000
CROM 2C000 30000 2000
我已经为始终映射的事物(ROM1-5、IO、RAM)分配了基数 0x0000,为一块板上的组交换事物(DREG、DRAM、DROM)分配了基数 0x1000,并为板上的组交换事物分配了基数 0x2000其他板 (CROM)。这导致 (DREG, DRAM, DROM) 和 CROM 都具有虚拟地址范围 0xC000-0xFFFF,这是正确的。
我不知道如何手动或自动告诉 IDA 使用哪个银行/基地。每当它遇到对不同基数的引用时,它会将地址显示为一个问题,并用五位数字而不是四位数字(例如0E018h
)来呈现它,我找不到任何手动解析引用的方法。我通读了很少的官方文档,并尝试在谷歌上搜索各种相关术语,但无济于事。
理想情况下,我希望 IDA 能够识别银行选择寄存器并自动选择正确的段,就像它为具有本机段寄存器的处理器所做的那样。如果这是不可能的,手动指定每个参考的目标银行/基地是可以接受的。有人可以提供有关如何实现其中任何一个的指导,或者更一般地指导如何处理 IDA 中的外部银行转换?
编辑:我设置了段翻译以使所有段中的固定段都可用,现在从切换段到固定段的代码引用工作。从固定到切换的数据引用仍然无法解析。我猜测将一组或另一组切换段添加到固定段的翻译列表将使所有对切换范围的引用解析为该库,但我需要能够将一些解析为一个库,一些解析为另一个所以这不是解决方案。
编辑:我发现我可以使用“手动”选项,从右键菜单中更改jp
或call
操作数从如0E018h
到1E018h
,从而手动选择的银行。这确实使链接解析,但它似乎更像是一个黑客而不是一个正确的解决方案,因为 IDA 不像通常那样在呼叫站点显示名称和可重复的评论。