前言
用hopper打開macho文件可以看出你具體函數跳轉與字符串的使用,那么在項目中,你的加密Key就容易泄漏,你使用的加密方法如果是系統的,那么可以被fishhook給hook住,所以字符串和系統方法的隱藏可以作為安全防護的一環。
一 字符串加密
如果你使用對稱加密,你的秘鑰很可能被macho文件暴露
要想字符串不進常量區,可以先用一個字符去異或,然后再異或回來,字符串直接換算,就不會被macho暴露。
//測試環境static NSString * KEY(){ unsigned char key[] = { (pw_encrypt_key ^ 'a'),(pw_encrypt_key ^ '2'),(pw_encrypt_key ^ 's'),(pw_encrypt_key ^ '5'),(pw_encrypt_key ^ '4'),(pw_encrypt_key ^ 'b'), (pw_encrypt_key ^ 'e'),(pw_encrypt_key ^ '5'),(pw_encrypt_key ^ 'f'),(pw_encrypt_key ^ '3'),(pw_encrypt_key ^ 'f'),(pw_encrypt_key ^ '4'), (pw_encrypt_key ^ 'f'), (pw_encrypt_key ^ '/0') }; unsigned char *p = key; while (((*p) ^= pw_encrypt_key) != '/0') { p++; } return [NSString stringWithUTF8String:(const char *)key];}
二 隱藏系統函數
當你調用系統函數加密是,macho是可以找到對應的函數跳轉的:
要想隱藏系統函數,可以直接從庫里面找到函數句柄,然后調用函數指針進行加密。
1、找到庫
下符號斷點,找到自己的加密函數CCCryptorCreate;
然后lldb調試:(lldb) image list;
找到libcommonCrypto.dylib庫在:[ 39] 50EEB933-DCEB-3AA2-8A43-DD3A791139CE 0x0000000182e1e000 /Users/mac/Library/Developer/Xcode/iOS DeviceSupport/11.3 (15E216)/Symbols/usr/lib/system/libcommonCrypto.dylib
libcommonCrypto.dylib的位置是:/usr/lib/system/libcommonCrypto.dylib
2、獲取句柄
#import <dlfcn.h>//句柄 void * handle = dlopen("/usr/lib/system/libcommonCrypto.dylib",RTLD_LAZY);
RTLD_LAZY:懶加載表
3、獲取加密函數
unsigned char str[] = { ('a' ^ 'C'), ('a' ^ 'C'), ('a' ^ 'C'), ('a' ^ 'r'), ('a' ^ 'y'), ('a' ^ 'p'), ('a' ^ 't'), ('a' ^ 'o'), ('a' ^ 'r'), ('a' ^ 'C'), ('a' ^ 'r'), ('a' ^ 'e'), ('a' ^ 'a'), ('a' ^ 't'), ('a' ^ 'e'), ('a' ^ '/0') }; unsigned char * p = str; while (((*p) ^= 'a') != '/0') p++;CCCryptorStatus (* CCCryptorCreate_p)( CCOperation op, /* kCCEncrypt, etc. */ CCAlgorithm alg, /* kCCAlgorithmDES, etc. */ CCOptions options, /* kCCOptionPKCS7Padding, etc. */ const void *key, /* raw key material */ size_t keyLength, const void *iv, /* optional initialization vector */ CCCryptorRef *cryptorRef) /* RETURNED */ __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0) = dlsym(handle, (const char *)str);
4、用函數指針加密
status = CCCryptorCreate_p( kCCEncrypt, algorithm, options, [keyData bytes], [keyData length], [ivData bytes], &cryptor );
結果如下
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答