Что такое инструкция addr после обратной - PullRequest
0 голосов
/ 16 марта 2020

Я использую обратную прошивку ghidra armv7.

Анализ по адресу 0x0002843a выглядит так, будто r0 загружает данные адреса 0x0002881 c, но адрес 0x0002881 c addr выглядит как инструкция.

Я читаю Руководство по архитектуре ARM®v7-M и не вижу инструкции 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

1 Ответ

0 голосов
/ 16 марта 2020

addr - это директива ассемблера: она инициализирует следующие четыре байта (или восемь байтов в 64-битном режиме) адресом своего аргумента. (+1 после всех ваших адресов функций означает, что вы находитесь в режиме большого пальца, что обозначается битом 0 P C, установленным в 1. Признаюсь, я никогда не видел странный синтаксис PTR_FUN_00028488+1_0066a66c. Возможно, другие может объяснить это.)

Эти адреса никогда не достигаются во время выполнения из-за инструкции pop.

...