在反编译 Texas Instruments ARM (Thumb 2) Cortex-M4f 处理器 (CC2652RB) 的十六进制文件时,我遇到了一个我无法理解的操作码。 “90 FF FF 00”有什么作用(也许下面的上下文有帮助)?如果 ARM 标准中没有声明,德州仪器 (TI) 是否可以使用自定义操作码?
19 46 mov r1, r3
06 4A ldr r2, [pc, #0x18]
00 28 cmp r0, #0
11 60 str r1, [r2]
18 BF it ne
01 20 movne r0, #1
BC BD pop {r2, r3, r4, r5, r7, pc}
90 FF FF 00 ?
14 20 movs r0, #0x14
02 40 ands r2, r0
04 04 lsls r4, r0, #0x10
00 20 movs r0, #0
30 72 strb r0, [r6, #8]
05 00 movs r5, r0
08 04 lsls r0, r1, #0x10
00 20 movs r0, #0
F0 B5 push {r4, r5, r6, r7, lr}
40 F6 FF 7C movw ip, #0xfff
10 F8 01 3B ldrb r3, [r0], #1
00 24 movs r4, #0
08 2C cmp r4, #8
我的猜测是,这根本不是指令,而是数据。前面的指令是
pop {..., pc}
,通常是函数结束时的返回。所以这个“指令”不能通过直线执行到达。你只能通过其他地方的分支来执行它,我敢打赌你找不到一个。
但是在函数结束之后是寻找文字池的自然位置。事实上,我怀疑从神秘单词到下面几行的
push { ..., lr}
(这将是下一个函数的自然第一条指令)的所有内容都是文字池。请注意,例如上面的 ldr r2, [pc, #0x18]
,这绝对是来自文字池的加载,也将从该区域内加载。
神秘词后面的字节的反汇编乍一看像是合理的代码,但进一步检查是有问题的。它会破坏通常会被调用保留的寄存器(r4,r5),并且进一步向下有
lsls r0, ...
,其结果立即被 mov r0, #0
覆盖。正如前面提到的,陷入一个更合理的函数序言会很奇怪。
我怀疑如果你反汇编前面函数的其余部分,你会在某个地方找到一个与电脑相关的负载,它将神秘单词作为数据加载。