基于Internet存档中的一些罕见文档,RTOS实际上是一个微内核,用于管理任务,内存分配和进程间消息传递。在内核中,似乎有两个功能可以管理内存:
fmem_alloc
和fmem_free
。我试图在固件文件中找到这些功能。我可以估算RTOS代码的位置,以及在该代码段中查找函数。我的目标是找到
fmem_alloc
和fmem_free
函数以及使用IDA调用它们的函数。由于我的目标是TMS320C55x架构,并且我具有原始固件文件而不是纯净的COFF二进制文件,因此如果没有实际的仿真器,调试起来将非常困难,据我了解,该微处理器仅基于硬件。因此,似乎注定只能依靠静态分析。但是,如果有人知道用于调试原始固件的软件解决方案,我将非常感兴趣。 Code Composer Studio IDE仅调试COFF二进制文件。
我可以搜索一定距离内的任何技术或一组C55x指令来识别此功能吗?或者至少减少潜在功能的数量?我知道RTOS使用双链表来管理堆。我首先想到了将
malloc
函数用作潜在的模板,但发现它与我要查看的内容(即Intel组件到C55x)相差太远,尤其是考虑到冯·诺依曼和哈佛架构之间的差异。任何帮助赞赏。谢谢。
附言由于保密情况,我无法发布产品详细信息,固件文件或反汇编的代码。据我了解,由于这个原因,可能很难提供可靠的答案。目标RTOS是一个称为Byte-BOS RTOS的旧微内核,我在本文中对此进行了介绍。该操作系统中唯一可用的字符串是版权声明。但是,使用Seagate固件,我可以看到与堆有关的错误消息。我可能会尝试将这些8096代码段转换为C,然后在TMS320C55x上重新编译它们。
更新2简单的malloc()函数。我写了一个小的C程序,分配了一些内存,在附带的调试器中运行它并转储了机器代码。我在IDAPython中做了一个快速字节字符串搜索功能,并用“ ????”替换了非指令值。供IDA仅查看说明。不幸的是,它没有找到malloc()函数。我怀疑代码仅依赖于RTOS提供的内存分配功能,而不是库中的功能。我几乎不相信它们会有很大的不同,因为两者都依赖于链表。无论如何,这就是我的意思。我可能会尝试模糊字节字符串以从库中查找类似于malloc()函数的代码段。
#1 楼
我将按照以下方式解决此问题:检查日志字符串。可能会发现与分配有关的东西可以解决问题。
找到所有带有1个参数的函数(
malloc()
的大小和free()
的指针)。跟踪这些函数的结果。
malloc()
结果通常在使用后根据NULL
进行检查,很少在数学运算中使用。此外,将malloc()
函数的结果用于存储操作或memcpy()
。调用后不使用自由函数参数。
malloc()
和free()
应该位于紧密地址中。这些试探法应足以将可能的候选对象范围缩小到可观察范围。
祝你好运。
#2 楼
从TMS320C55x文档中可以明显看出,该芯片支持多种存储模式。因此,诸如malloc之类的函数可能对每个函数具有不同的定义。我认为最明智的做法是识别内存模式,并弄清楚如何在该模式下实现malloc。做的是模式匹配。如果您想变得聪明,请找出一种构建CFG的方法,并尝试确定可能需要malloc的位置,并检查目标模式是否足够冗余。希望这会有所帮助。
评论
不能将COFF标头添加到固件吗?从阅读规范来看,似乎COFF标头只有一个部分从地址0开始,没有可选标头,没有重定位,没有行号,没有符号表,没有字符串表,应该易于生成并放在原始二进制文件之前。您可以尝试研究AVR上的malloc实现,这基本上是哈佛ARCH。
将COFF文件写入固件后,有关符号的大多数信息都将被删除。还添加了中断服务程序和向量。中断向量被添加到0x0,然后是ISR。无论如何,添加COFF标头都不会简化反汇编。我将检查AVR。