我目前正在为旧的 TMS320C5 16 位微处理器反转固件文件。我正在使用 IDA pro 来执行此操作,我需要为文件中包含的每个对象手动创建段。我要求一个循序渐进的程序来做到这一点。以下是有关原因/内容的更多信息。
与许多其他处理器一样,TMS320C5 访问内部缓存,称为“快速内存”,它是单个 64K 页面。它从外部更大和更慢的内存中加载此内存。
固件文件包含一个内存映像,该映像直接写入设备的慢速内存中。它使用多任务实时操作系统运行。每个任务/进程都存储在二进制文件中的不同位置,并且似乎没有任何特定的顺序。根据我的理解,文件中的每个任务前面都有 4 个字,其中一个表示当前任务将在快速内存中加载的基地址。在某些情况下,可以在快速内存中的相同基址加载 2 或 3 个任务。
任务中的每个分支/调用指令似乎都使用当前页面中的直接地址(见图 3)。所以它们与 PC(程序计数器)或其他寄存器的内容无关。
当然,我现在希望分支和调用指令与其段内的适当功能和部分保持一致。虽然我对 IDA 中的分段没有很好的掌握,但我阅读了一些其他线程,例如如何处理在不同执行中更改其地址的代码、IDA 分段问题和IDA 中的分段。如何克服 NONAME 问题,但没有一个能提供我需要的完整解决方案,因为我不相信 CS/DS 和其他英特尔细分市场适用于此。我在 IDA PRO 书中也找不到任何真正有用的东西。
到目前为止,通过执行以下操作,我似乎已经完成了所需的 50%:
- 使用 Selector 子视图创建一个新的选择器:View > Open Subviews > Selectors。
- 在子视图中右键单击,选择Add Selector。
- 按照下面的图 1 创建了一些示例。
- 使用命令行和SetSegmentAttr函数,我更改了其中一个段的选择器:SetSegmentAttr(ScreenEA(), SEGATTR_SEL, 1)
例如,固件中有一个从线性地址0xCAEFD开始的任务。此任务在快速内存中的0x2C00处加载。因此,我想创建一个包含此任务的段,其基地址为 0x2C00。当我使用上述过程更改块的段时,偏移量从0x9EF02开始(见图 2)。我希望它从0x0开始。
我怀疑我有点需要以某种方式更改偏移量。我知道Move Segment选项,但它似乎“物理地”将段更改为地址,这是我不想要的,因为某些任务在快速内存中共享相同的基地址(或者彼此接近并会覆盖另一个任务)。我需要完成哪些步骤才能将每个任务隔离到自己的段中,以便分支和调用对齐?例如,在图 3 中,我希望 IDA 链接BCND 2C1Dh, geq到段内相应的0x2C1D位置,而不是相应的线性地址。
谢谢你的帮助


