我最近制作了一个工具,使 8051 逆向工程中的早期内容更容易,称为at51,并将无耻地使用这个答案作为展示。
首先,您希望图像正确对齐。很少有 8051 固件对齐,对于这个文件也是如此。通过使用 base 子命令,您可以获得最有可能是文件加载位置的偏移量:
$ at51 base rtl8188efw.bin
Index by likeliness:
1: 0x3fe0 with 139
2: 0x2526 with 63
3: 0x6a5 with 58
请注意,第一场比赛的得分是第二场比赛的两倍多,因此它可能在 0x3fe0 处加载(由于 32 字节的标头,实际上在 0x4000 处)。
您现在可以使用 ghidra 或radare2,它们都支持 8051。为了帮助解决这个问题,由于该固件似乎与大多数 8051 固件一样使用 C51 编译,因此您还可以使用 libfind 子命令在映像中查找标准库函数。为此,您使用 C51*.LIB 形式的 C51 库文件(您可以通过下载 C51 的试用版来获取它们,因为没有人会在 Internet 上的任何位置留下名为 C51L.LIB 的文件)。
无论如何,使用对齐的图像(例如通过使用dd if=rtl8188efw.bin of=fw_aligned bs=$((0x3fe0)) seek=1)和库文件,可以得到
$ at51 libfind fw_aligned /path/to/lib/C51*.LIB
Address | Name | Description
0x42dd (MAIN)
0x44a9 ?C?IILDX
0x44bf ?C?LAND long (32-bit) bitwise and
0x44cc ?C?LOR long (32-bit) bitwise or
0x44d9 ?C?LLDXDATA long (32-bit) load from xdata
0x44e5 ?C?LLDXDATA0 long (32-bit) load from xdata into r3-r0
0x44f1 ?C?OFFXADD
0x44fd ?C?PLDXDATA general pointer load from xdata
0x4506 ?C?PSTXDATA general pointer store to xdata
0x450f ?C?CCASE
0x4573 ?C_START
现在您有一些函数开始的偏移量以及其中一些函数的描述,这应该会有所帮助。请注意,MAIN 位于括号中,因为它不是在库本身中找到的,而是由它引用的。
最后一件事是由 C51 生成的固件通常包含一个结构,其中存储要在启动时初始化的内存位置的值。可以使用 kinit 子命令读取该结构。您可以轻松找到该结构的偏移量,因为它是在 ?C_START 的开头加载的mov dptr, #0x45b8。但似乎对于这个固件映像,这实际上是禁用的(通过在该位置插入 0)?或者也许链接器搞砸了并在结构之前而不是之后插入了 0?无论如何,如果他们没有将其归零(该结构实际上存在于它后面的一个字节),你会得到
$ at51 kinit -o $((0x45b9)) fw_aligned
xdata[0x8197] = 0x00
xdata[0x8198] = 0x00
xdata[0x81a4] = 0x00
xdata[0x3457..0x3468] = [0x4a, 0x57, 0x36, 0x58, 0x29, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0]
最后一个似乎是垃圾,因为它包含 8051 代码,所以也许终止 0 不小心落在了开头。