我正在研究嵌入式系统 Coldfire ROM。目前,我正在尝试对其进行逆向工程,以获得有关其结构的更深入的知识。
ROM 代码质量似乎很低,我看到很多冗余和死代码,好像代码是用非常低的优化级别编译的。
我之所以告诉你,是因为我不明白这个事实是否与我即将提出的问题有某种关系。
经常检查代码,我进入了单个多字节指令内的跳转。我是这项技术的新手,所以我想知道是否有人可以让我正确理解这一点,我认为这是一个奇怪的问题。
这是我所指的一个例子:我有一个从ROM开始的函数:
[...]
.ROM:00005490 30 07 movew %d7,%d0
.ROM:00005492 4a 80 tstl %d0
.ROM:00005494 66 0c bnes 0x0000000c :12
.ROM:00005496 70 00 moveq #0,%d0
.ROM:00005498 60 00 00 a8 braw 0x000000b2
.ROM:0000549c 4e b9 00 00 36 f8 jsr 0x000036f8 : the jump points inside here
.ROM:000054a2 32 06 movew %d6,%d1
.ROM:000054a4 48 c1 extl %d1
.ROM:000054a6 20 01 movel %d1,%d0
[...]
在 ROM 的另一个区域,我有另一个函数,它从ROM:00012016开始
[...]
.ROM:000120c0 72 00 moveq #0,%d1
.ROM:000120c2 12 00 moveb %d0,%d1
.ROM:000120c4 20 3c 00 00 00 ff movel #255,%d0
.ROM:000120ca b2 80 cmpl %d0,%d1
.ROM:000120cc 66 00 01 92 bnew 0x00012260
.ROM:000120d0 4e b9 00 00 54 9e jsr 0x0000549e :here the jump I do not understand
.ROM:000120d6 72 00 moveq #0,%d1
.ROM:000120d8 12 00 moveb %d0,%d1
.ROM:000120da 20 3c 00 00 00 ff movel #255,%d0
[...]
如果我尝试跟随跳转并从地址ROM:0000549e开始反汇编函数,我会得到一个翻译,导致以下解释。我知道它是可执行的,但我没有得到这个动作的大图。
[...]
.ROM:0000549e 00 00 36 f8 orib #-8,%d0
.ROM:000054a2 32 06 movew %d6,%d1
.ROM:000054a4 48 c1 extl %d1
.ROM:000054a6 20 01 movel %d1,%d0
[...]
在这项技术的背后,是否有一些我应该知道的旧做法。为什么这个ROM开发者应该使用这种奇怪的技术?减少代码大小?如果是这样,它就不适合其余的代码,这些代码非常冗余,并且其中包含永远不会执行的死代码!
编辑.20190214
在字节 0xc000 处,它开始一段代码扩展到 0x40000,其第一个函数在其开始部分似乎不完整。
怪异似乎从这一点开始,并延伸到固件第二部分开始的字节 0x40000。
在这个代码块中,大约有 200 个不同维度的函数,并且这个块中的所有函数中都没有出现具有奇怪绝对地址的JSR。
此块中的功能似乎相互无缝交互,但它们偶尔会出现地址不一致的情况。