在 ARM 中计算字符串的长度

逆向工程 手臂
2021-06-10 12:42:46

我试图反转以下 ARM 代码。

mystery7
02 46            MOV R2, R0
08 B9            CBNZ R0, loc_100E1D8
00 20            MOVS R0, #0
70 47            BX LR
loc_100E1D8
90 F9 00 30      LDRSB.W R3, [R0]
02 E0            B loc_100E1E4
loc_100E1DE
01 32            ADDS R2, #1
92 F9 00 30      LDRSB.W R3, [R2]
loc_100E1E4
00 2B            CMP R3, #0
FA D1            BNE loc_100E1DE
10 1A            SUBS R0, R2, R0
6F F3 9F 70      BFC.W R0, #0x1E, #2
70 47            BX LR
; End of function mystery7

我可以看到它是一个计算字符串长度的函数。然而,该BFC.W指令似乎清除了最高有效的 2 位。因此,符号位及其紧邻的位被清除。为什么要这样做?

1个回答

我将此作为“答案”发布,因为我的声誉还不允许我发表评论。

该问题是从 Bruce Dang 等人的《实用逆向工程》一书中复制而来的。为“mystery7”,见图2.13。作者本人不对奇怪的 BFC.W 声明发表评论。此处的另一篇博客对此声明进行了评论,因为“我不明白将差异的两个最高有效位设置为零的目的。对于任何合理的字符串,首先不应设置这些位。”

也许这句话有一定的用途。如果是的话,它可能会相当晦涩。