我使用ghidra armv7反向固件。
分析地址0x0002843a看起来就像r0加载地址0x0002881c的数据,但是地址0x0002881c addr看起来像一条指令。
我阅读了《ARM®v7-M体系结构参考手册》,没有看到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
addr
是一个汇编程序伪指令:它将接下来的四个字节(在64位模式下为八个字节)初始化为其参数的地址。 (所有功能地址之后的+1
表示您处于Thumb模式,这由PC的位0设置为1表示。我承认我从未见过奇怪的PTR_FUN_00028488+1_0066a66c
语法。也许其他人可以解释一下它) 。)
由于pop
指令,在执行时从未到达这些地址。