在 ARM 汇编里函数调用是使用 bl 指令跳转到函数地址,攻击者逆向分析很容易找到调用过程,分析参数和返回值。
可以将一些敏感的函数,比如将加密函数写成 inline 内联,无论代码里调用了多少次函数,编译器会将整个函数代码拷贝到需要调用的地方,而不会使用 bl 指令跳转,不能明显的看出函数参数传递和返回值,大大增加了分析的难度。
以下是一个简单的异或加密函数:
char* xor_encrypt (char *inbuf, int len){
char *outbuf = malloc(len);
for (int i=0; i <= len; i++) {
outbuf[i] = inbuf[i] ^ 0x33;
}
return outbuf;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
char *str1 = xor_encrypt("123", 3);
char *str2 = xor_encrypt("456", 3);
char *str3 = xor_encrypt("789", 3);
}
反汇编的效果如下:
xor_encrypt 函数的反汇编代码如下:
inlineTest`xor_encrypt:
0x7b3f0 <+0>: push {r7, lr}
0x7b3f2 <+2>: mov r7, sp
0x7b3f4 <+4>: sub sp, #0x10
0x7b3f6 <+6>: str r0, [sp, #0xc]
0x7b3f8 <+8>: str r1, [sp, #0x8]
-> 0x7b3fa <+10>: ldr r0, [sp, #0x8]
0x7b3fc <+12>: blx 0x7efd8 ; symbol stub for: malloc
0x7b400 <+16>: movs r1, #0x0
0x7b402 <+18>: str r0, [sp, #0x4]
0x7b404 <+20>: str r1, [sp]
0x7b406 <+22>: ldr r0, [sp]
0x7b408 <+24>: ldr r1, [sp, #0x8]
0x7b40a <+26>: cmp r0, r1
0x7b40c <+28>: bgt 0x7b42c ; <+60> at ViewController.m:324
0x7b40e <+30>: ldr r0, [sp]
0x7b410 <+32>: ldr r1, [sp, #0xc]
0x7b412 <+34>: add r0, r1
0x7b414 <+36>: