前言
此文旨在为iOS app开发者提供最全的常用安全防护手段。涉及到如字符串加密,类名以及方法名混淆,程序结构混淆加密,反调试、反注入等一些主动保护策略,并配上逆向app之后的截图进行效果展示。(持续更新中)
字符串加密
对于字符串加解密,常规的方法就是进行异或加解密。
来看下以下代码:
#define XOR_KEY 0xBB
void xorString(unsigned char *str, unsigned char key)
{
unsigned char *p = str;
while( ((*p) ^= key) != '\0') p++;
}
- (void)xorTest
{
unsigned char str[] = {(XOR_KEY ^ 'w'),//welcome
(XOR_KEY ^ 'e'),
(XOR_KEY ^ 'l'),
(XOR_KEY ^ 'c'),
(XOR_KEY ^ 'o'),
(XOR_KEY ^ 'm'),
(XOR_KEY ^ 'e'),
(XOR_KEY ^ '\0')};
xorString(str, XOR_KEY);
static unsigned char result[7];
memcpy(result, str, 7);
NSLog(@"%@", [NSString stringWithFormat:@"%s",result]); //输出: welcome
}
现在我们在IDA中看看反编译之后的代码:
void __cdecl -[ViewController xorTest](ViewController *self, SEL a2)
{
void *v2; // rax
__int64 v3; // ST00_8
__int64 v4; // [rsp+20h] [rbp-10h]
v4 = -4909250334127825204LL;
xorString(&v4, 187LL);
xorTest_result = v4;
word_100003E9C = WORD2(v4);
byte_100003E9E = BYTE6(v4);
v2 = objc_msgSend(&OBJC_CLASS___NSString, "stringWithFormat:", CFSTR("%s"), &xorTest_result);
v3 = objc_retainAutoreleasedReturnValue(v2);
NSLog(CFSTR("%@"), v3);
objc_release(v3);
}
反调试
如何不让别人使用LLDB+debugserver来动态调试我们的app呢,阻止LLDB依附到app的常规办法是:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif
void disable_gdb() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
int main(int argc, char * argv[]) {
#ifndef DEBUG
disable_gdb();
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
添加上述代码后,通过LLDB+debugserver来对进行动态调试。