逆向工程ARM PIC

逆向工程 手臂 ios
2021-06-26 23:39:03

我开始学习逆向工程,所以我正在尝试逆向为 ARM(iOS) 编译的示例应用程序,现在我正在研究代码。

此部分WHILE正好位于函数开始值的开头和之前但我找不到原始值。

这是函数 .h 文件:

#import "NSObject.h"

@interface SampleCalc : NSObject

+ (double)doCalc:(double)arg1;

@end

这是ARM代码:

+[SampleCalc doCalc:]:
0002f198         movw       sb, #0x6cb4      ; Objective C Implementation defined at 0x95db8 (class method), :lower16:(0xc5e60 - 0x2f1ac)
0002f19c         vmov.i32   d18, #0x0
0002f1a0         movt       sb, #0x9         ; :upper16:(0xc5e60 - 0x2f1ac)
0002f1a4         vmov       d16, r2, r3
0002f1a8         add        sb, pc           ; 0xc5e60
0002f1aa         movs       r2, #0x0
0002f1ac         add.w      r3, sb, #0x8     ; 0xc5e68
0002f1b0         vldr       d17, [sb]

如果我理解正确,这是 ARM PIC(位置无关代码)。

但我不明白这里的逻辑0002f1b0- 括号是否意味着sb存储地址并加载值d17地址是什么 -0xc5e68正确吗?

其中0xc5e60包含:

000c5e60         db  0x00 ;
000c5e61         db  0x00 ; '.'
000c5e62         db  0x00 ; '.'
000c5e63         db  0x00 ; '.'
000c5e64         db  0x00 ; '.'
000c5e65         db  0x00 ; '.'
000c5e66         db  0x33 ; '3'
000c5e67         db  0x40 ; '@'
000c5e68         db  0x00 ;
000c5e69         db  0x00 ; '.'
000c5e6a         db  0x00 ; '.'
000c5e6b         db  0x00 ; '.'
000c5e6c         db  0x00 ; '.'
000c5e6d         db  0x00 ; '.'
000c5e6e         db  0x34 ; '4'
000c5e6f         db  0x40 ; '@'
000c5e70         db  0x00 ; '.'
000c5e71         db  0x00 ; '.'
000c5e72         db  0x00 ; '.'
000c5e73         db  0x00 ; '.'
000c5e74         db  0x00 ; '.'
000c5e75         db  0x00 ; '.'
000c5e76         db  0x35 ; '5'

那么这是否意味着D17获得价值0x00

额外的问题,如果可能的话,所有这些.@.

谢谢。

1个回答

sbR9某些反汇编程序使用的 ARM 寄存器的替代名称,类似于ipfor R12spforR13PCfor R15

您需要查看的主要内容是:

0002f1a8         add        sb, pc  

此时,sb由于movwmovt之前的值已经为0x96cb4 在 ARM 中,该pc值指向前面两条指令,因此这里的值为 0x002f1a8+4 = 0x002f1ac。因此,我们得到 0x002f1ac+0x96cb4=0xC5E60,它与反汇编器添加的注释相匹配。接下来,vldr d17, [sb]执行加载双sb精度(或 0xC5E60)。Double 值的长度为 8 个字节,因此将从 0xC5E60 到 0xC5E67 的所有字节都将被加载。它的十六进制是 0x4033000000000000对应于 19.0