我正在尝试从一个包含68xx (类似68hc12)微控制器的旧无线电中反汇编代码。问题是,我无法访问ROM顶部的微处理器的中断向量,所以我不知道从哪里开始查找。我只有顶部下面的代码。这里有一些建议,我可以在哪里或者如何在代码数据中找到有意义的例程?
发布于 2017-06-02 23:55:01
在不知道重置向量指向何处的情况下,您无法真正可靠地进行反汇编。但是,您可以尝试通过删除所有其他不可能作为起点的地址来缩小可能的重置地址范围。
因此,假设内存映射中包含有效操作码的任何地址都是潜在的重置点,您需要消除它,或者保留它以供进一步分析。
对于68HC11的情况,您可以尝试通过查找具有合法操作数值的LDS指令来猜测入口点(即,指向或接近可用RAM的顶部-如果有多个RAM库,则指向其中任何一个)。
如果您知道设备的完整内存映射,即,如果使用外部内存,其映射和可能映射的外围设备(例如,LCD),它可能会有所帮助。你也知道配置寄存器的内容吗?
LDS指令通常要么是第一条指令,要么是之后的最后一条指令(所以当你觉得你最终选择了你的复位地址时,再回顾几条指令)。这里的问题是,一些数据可能偶然出现为LDS指令,因此您可能会得到多个潜在的有效入口点。当然,它们中只有一个是有效的。
您可以通过从这些LDS指令中的每条指令开始反汇编几条指令,直到遇到非法操作码(即,显然不是有效的代码序列,而是看起来像操作码的意外数据排列),或者看到68HC11初始化中常用的一系列指令,从而进一步消除。这包括(通常)初始化任何一个或多个寄存器BPROT、OPTION、SCI、INIT (大多数部分为$103d,但某些部分为$3D)等。
您可以编写一个相对较小的脚本(例如,在Lua中)来执行内存映射的基本扫描,并生成一组潜在的重置点(希望很小),以便使用真正的反汇编程序进一步检查我提到的提示。
现在,一旦计算出重置向量,工作就会变得更容易,但您仍然需要找出任何中断处理程序的位置。对于这一点,你的提示是一条RTI指令,以及通常应该确认它处理的特定中断的任何前面的代码。
希望这能有所帮助。
https://stackoverflow.com/questions/44317684
复制相似问题