在 Radare2 中设置寄存器名称

逆向工程 固件 雷达2 嵌入式
2021-06-28 02:52:50

我正在对特定芯片的8051架构程序进行逆向工程。反汇编自然不包含任何函数名称,并且寄存器名称最少。例如,地址 0xb3 是一个名为“RTC2CON”的特定寄存器。由于寄存器名称特定于芯片,因此反汇编不会显示它,而是“0xb3”。

我的问题是如何设置规则,将反汇编中出现的某个字符串(在本例中为 0xb3)替换为另一个字符串(寄存器名称 RTC2CON)。

另一个例子

|           0x0000393b      c2e9           clr 0xe8.1                  ; 
|           0x0000393d      1239dd         lcall TRANSMIT_r7_AND_GET_r7=RF_STATUS
|           0x00003940      e4             clr a
|           0x00003941      ff             mov r7, a
|           0x00003942      1239dd         lcall TRANSMIT_r7_AND_GET_r7=RF_STATUS
|           0x00003945      8f36           mov 0x36, r7                ; 
|           0x00003947      d2e9           setb 0xe8.1                 ; 
\           0x00003949      22             ret

更清楚地说,芯片是nRF24LE1。在此示例中,对地址 0xe8 (RFCON) 上的特殊功能寄存器进行了操作,首先清除第 1 位,然后在某些操作后再次置位。

我想要的只是反汇编将显示 RFCON.1 而不是 0xe8.1

我遇到的另一个问题是使用 ljmp 而不是 lcall 调用的函数。当我尝试用 afn 重命名该函数时,新名称改为使用 ljmp 调用它的函数。被调用的函数有 58 个 XREFS,因此在调用时看到它的名称而不是地址对我来说非常重要。(函数默认名称是它们的 fcn.address)。

1个回答

不确定 b3 寄存器是什么

至于命名调用/跳转的目的地,你做这样的事情

[0x00000788]> pd~lcall
|           0x00000797      124ef3         lcall 0x4ef3
|       |   0x000007a7      124ac0         lcall 0x4ac0
[0x00000788]> f loc.somefun @0x4ef3
[0x00000788]> f loc.somefun2 @0x4ac0
[0x00000788]> pd~ljmp
        ,=< 0x000007cd      024ac4         ljmp 0x4ac4
[0x00000788]> f loc.somejump @0x4ac4
[0x00000788]> pd~ljmp
        ,=< 0x000007cd      024ac4         ljmp loc.somejump
[0x00000788]> pd~lcall
|           0x00000797      124ef3         lcall loc.somefun
|       |   0x000007a7      124ac0         lcall loc.somefun2
[0x00000788]>

是关于从 0x80 到 0xff 的特殊功能寄存器吗

你可能可以如上所示标记它们

[0x000000b3]> s 0xb3
[0x000000b3]> pd 2
            ;-- reg.RTC2CON:
            0x000000b3      00             nop
            0x000000b4      00             nop
[0x000000b3]> f reg.RTC2CONNED @ 0xb3
[0x000000b3]> pd 2
            ;-- reg.RTC2CON:
            ;-- reg.RTC2CONNED:
            0x000000b3      00             nop
            0x000000b4      00             nop
[0x000000b3]>

我记得它自动标记了 sfr,但它的实现似乎不完整,您可能必须添加所需的位并提交拉取请求或打开一个问题

它从可能的 16 位 src 中解码 8 位,这里8051 实现

我只是做了简单的测试结果如下

>xxd sfrtest.bin
0000000: c2e0 c2e1 c2e2 c2e3 c2e4 c2e5 c2e6 c2e7  ................
0000010: c2e8 c2e9 c2ea c2eb c2ec c2ed c2ee c2ef  ................
>radare2 -a 8051 sfrtest.bin
 -- This software is sold for home use only and all other rights are expressly reversed by the copyleft owner.
[0x00000000]> pd 10
            0x00000000      c2e0           clr acc.0                   ; [0x100001e0:1]=0
            0x00000002      c2e1           clr acc.1                   ; [0x100001e0:1]=0
            0x00000004      c2e2           clr acc.2                   ; [0x100001e0:1]=0
            0x00000006      c2e3           clr acc.3                   ; [0x100001e0:1]=0
            0x00000008      c2e4           clr acc.4                   ; [0x100001e0:1]=0
            0x0000000a      c2e5           clr acc.5                   ; [0x100001e0:1]=0
            0x0000000c      c2e6           clr acc.6                   ; [0x100001e0:1]=0
            0x0000000e      c2e7           clr acc.7                   ; [0x100001e0:1]=0
            0x00000010      c2e8           clr 0xe8.0                  ; [0x100001e8:1]=0
            0x00000012      c2e9           clr 0xe8.1                  ; [0x100001e8:1]=0
[0x00000000]>