前言
此文旨在為iOS app開(kāi)發(fā)者提供最全的常用安全防護(hù)手段。涉及到如字符串加密,類名以及方法名混淆,程序結(jié)構(gòu)混淆加密,反調(diào)試、反注入等一些主動(dòng)保護(hù)策略,并配上逆向app之后的截圖進(jìn)行效果展示。(持續(xù)更新中)
字符串加密
對(duì)于字符串加解密,常規(guī)的方法就是進(jìn)行異或加解密。
來(lái)看下以下代碼:
#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
}
現(xiàn)在我們?cè)贗DA中看看反編譯之后的代碼:
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);
}
反調(diào)試
如何不讓別人使用LLDB+debugserver來(lái)動(dòng)態(tài)調(diào)試我們的app呢,阻止LLDB依附到app的常規(guī)辦法是:
#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]));
}
}
添加上述代碼后,通過(guò)LLDB+debugserver來(lái)對(duì)進(jìn)行動(dòng)態(tài)調(diào)試。

LLDB附加失敗.png