我正在尝试从包含 68xx(类似 68hc12)微控制器的旧收音机中反汇编代码。问题是,我无法访问ROM顶部的micro的中断向量,所以我不知道从哪里开始看。我只有顶部下方的代码。有一些关于在哪里或如何在代码数据中找到有意义的例程的建议?
1 回答
在不知道复位向量指向的位置的情况下,您无法真正可靠地拆卸。但是,您可以做的是尝试通过消除所有其他不可能作为起点的地址来缩小可能的复位地址。
因此,鉴于内存映射中包含有效操作码的任何地址都是潜在的复位点,您需要消除它,或者保留它以供进一步分析。
对于 68HC11 的情况,您可以通过寻找具有合法操作数值的 LDS 指令来尝试猜测入口点(即,指向或靠近可用 RAM 的顶部——如果是多个 RAM 组,则指向其中的任何一个)。
如果您知道设备的完整内存映射,即,如果使用外部存储器,它的映射和可能映射的外围设备(例如,LCD)可能会有所帮助。你也知道CONFIG寄存器的内容吗?
LDS 指令通常是第一条指令,或者之后关闭(所以当你觉得你终于挑出了你的复位地址时,回顾一些指令)。这里的问题是某些数据可能会偶然显示为 LDS 指令,因此您最终可能会得到多个潜在有效的入口点。当然,其中只有一个是有效的。
您可以通过从这些 LDS 指令中的每一个开始反汇编一些指令来进一步消除,直到您遇到非法操作码(即显然不是有效的代码序列,而是看起来像操作码的意外数据排列),或者您看到一系列指令常用于68HC11初始化。这些涉及(通常)初始化任何一个或多个寄存器 BPROT、OPTION、SCI、INIT(大部分为 103D,但某些为 3D)等。
您可以编写一个相对较小的脚本(例如,在 Lua 中)来对内存映射进行基本扫描,并生成一组(希望很小的)潜在重置点,以便使用真正的反汇编程序进一步检查,以获取类似我提到的提示。
现在,一旦你弄清楚了复位向量,工作就会变得容易一些,但你仍然需要弄清楚任何中断处理程序的位置。为此,您的提示是 RTI 指令以及通常应该确认它处理的特定中断的任何前面的代码。
希望这可以帮助。