1

我使用 ghidra armv7 反向固件。

分析到地址0x0002843a看起来像 r0 加载地址 0x0002881c 的数据,地址0x0002881c addr 看起来像一条指令。

我阅读了 ARM®v7-M ArchitectureReference Manual 并没有看到 addr 指令。

我不明白 addr 是什么意思,请帮助我。

                         **************************************************************
                         *                          FUNCTION                          *
                         **************************************************************
                         undefined FUN_0002842e()
                           assume LRset = 0x0
                           assume TMode = 0x1
         undefined         r0:1               <RETURN>
                      FUN_0002842e                                         XREF[1]:     FUN_0002706c:00027168(c)  
   0002842e 10 b5                            push       { r4, lr }
   00028430 04 46                            mov        r4,r0
   00028432 20 46                            mov        r0,r4
   00028434 ff f7 52 fe                      bl         FUN_000280dc                                                                       undefined FUN_000280dc()
   00028438 04 46                            mov        r4,r0
   0002843a f8 48                            ldr        r0,[PTR_PTR_FUN_00028488+1_0002881c]                                               = 0066a66c**
   0002843c 20 60                            str        r0=>PTR_FUN_00028488+1_0066a66c,[r4,#0x0]                                          = 00028489
   0002843e 00 20                            mov        r0,#0x0
   00028440 60 60                            str        r0,[r4,#0x4]
   00028442 a0 60                            str        r0,[r4,#0x8]
   00028444 20 61                            str        r0,[r4,#0x10]
   00028446 e0 60                            str        r0,[r4,#0xc]
   00028448 60 61                            str        r0,[r4,#0x14]
   0002844a 00 21                            mov        r1,#0x0
   0002844c 5c 20                            mov        r0,#0x5c
   0002844e 01 55                            strb       r1,[r0,r4]
   00028450 5d 20                            mov        r0,#0x5d
   00028452 01 55                            strb       r1,[r0,r4]
   00028454 5e 20                            mov        r0,#0x5e
   00028456 01 55                            strb       r1,[r0,r4]
   00028458 00 20                            mov        r0,#0x0
   0002845a a0 63                            str        r0,[r4,#0x38]
   0002845c e1 63                            str        r1,[r4,#0x3c]
   0002845e a0 64                            str        r0,[r4,#0x48]
   00028460 02 21                            mov        r1,#0x2
   00028462 e1 64                            str        r1,[r4,#0x4c]
   00028464 ee 48                            ldr        r0,[DAT_00028820]                                                                  = 188DA314h
   00028466 00 6c                            ldr        r0,[r0,#0x40]=>DAT_188da354
   00028468 00 28                            cmp        r0,#0x0
   0002846a 03 d1                            bne        LAB_00028474
   0002846c ec 48                            ldr        r0,[DAT_00028820]                                                                  = 188DA314h
   0002846e 44 30                            add        r0,#0x44
   00028470 eb 49                            ldr        r1,[DAT_00028820]                                                                  = 188DA314h
   00028472 08 64                            str        r0,[r1,#0x40]=>DAT_188da354
                      LAB_00028474                                         XREF[1]:     0002846a(j)  
   00028474 eb 48                            ldr        r0,[DAT_00028824]                                                                  = 188DA494h
   00028476 80 6b                            ldr        r0,[r0,#0x38]=>DAT_188da4cc
   00028478 00 28                            cmp        r0,#0x0
   0002847a 03 d1                            bne        LAB_00028484
   0002847c e9 49                            ldr        r1,[DAT_00028824]                                                                  = 188DA494h
   0002847e 3c 31                            add        r1,#0x3c
   00028480 e8 48                            ldr        r0,[DAT_00028824]                                                                  = 188DA494h
   00028482 81 63                            str        r1,[r0,#0x38]=>DAT_188da4cc
                      LAB_00028484                                         XREF[1]:     0002847a(j)  
   00028484 20 46                            mov        r0,r4
   00028486 10 bd                            pop        { r4, pc }

                    PTR_PTR_FUN_00028488+1_0002881c                      XREF[1]:     FUN_0002842e:0002843a(R)  
   0002881c 6c a6 66 00                      addr       PTR_FUN_00028488+1_0066a66c                                                        = 00028489
                     PTR_FUN_00028488+1_0066a66c                          XREF[2]:     FUN_0002842e:0002843c(*), 
                                                                                       0002881c(*)  
   0066a66c 89 84 02 00                      addr       FUN_00028488+1
   0066a670 99 84 02 00                      addr       FUN_00028498+1
   0066a674 d5 90 02 00                      addr       FUN_000290d4+1
   0066a678 45 d8 02 00                      addr       FUN_0002d844+1
   0066a67c 73 da 02 00                      addr       LAB_0002da72+1
   0066a680 75 da 02 00                      addr       FUN_0002da74+1
   0066a684 c7 d9 02 00                      addr       DAT_0002d9c7                                                                       = B5h
   0066a688 fb 80 02 00                      addr       LAB_000280fa+1
4

1 回答 1

1

addr是一个汇编指令:它将接下来的四个字节(或 64 位模式下的八个字节)初始化为其参数的地址。(+1毕竟你的函数地址意味着你处于 Thumb 模式,这由 PC 的第 0 位设置为 1 表示。我承认我从未见过奇怪的PTR_FUN_00028488+1_0066a66c语法。也许其他人可以解释一下。)

pop由于指令的原因,这些地址在执行时永远不会到达。

于 2020-03-16T17:14:15.730 回答