iOS安全防護(hù)系列之字符串及系統(tǒng)函數(shù)隱藏詳解
前言
用hopper打開(kāi)macho文件可以看出你具體函數(shù)跳轉(zhuǎn)與字符串的使用,那么在項(xiàng)目中,你的加密Key就容易泄漏,你使用的加密方法如果是系統(tǒng)的,那么可以被fishhook給hook住,所以字符串和系統(tǒng)方法的隱藏可以作為安全防護(hù)的一環(huán)。
一 字符串加密
如果你使用對(duì)稱加密,你的秘鑰很可能被macho文件暴露
要想字符串不進(jìn)常量區(qū),可以先用一個(gè)字符去異或,然后再異或回來(lái),字符串直接換算,就不會(huì)被macho暴露。
//測(cè)試環(huán)境 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]; }
二 隱藏系統(tǒng)函數(shù)
當(dāng)你調(diào)用系統(tǒng)函數(shù)加密是,macho是可以找到對(duì)應(yīng)的函數(shù)跳轉(zhuǎn)的:
要想隱藏系統(tǒng)函數(shù),可以直接從庫(kù)里面找到函數(shù)句柄,然后調(diào)用函數(shù)指針進(jìn)行加密。
1、找到庫(kù)
下符號(hào)斷點(diǎn),找到自己的加密函數(shù)CCCryptorCreate;
然后lldb調(diào)試:(lldb) image list;
找到libcommonCrypto.dylib庫(kù)在:[ 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、獲取加密函數(shù)
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、用函數(shù)指針加密
status = CCCryptorCreate_p( kCCEncrypt, algorithm, options, [keyData bytes], [keyData length], [ivData bytes], &cryptor );
結(jié)果如下
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS10實(shí)現(xiàn)推送功能時(shí)的注意點(diǎn)和問(wèn)題總結(jié)
很多朋友都反饋,發(fā)現(xiàn)了iOS9升級(jí)到iOS10推送功能不正常的問(wèn)題,所以這篇文章總結(jié)了一下要點(diǎn),親們可以根據(jù)以下步驟,逐步排查問(wèn)題,也可以逐步實(shí)現(xiàn)iOS10的推送功能。下面來(lái)一起看看吧。2016-09-09分享一個(gè)iOS下實(shí)現(xiàn)基本繪畫板功能的簡(jiǎn)單方法
這篇文章主要介紹了iOS下實(shí)現(xiàn)基本繪畫板功能的簡(jiǎn)單方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-10-10iOS開(kāi)發(fā)之銀行卡號(hào)識(shí)別
本文給大家分享ios開(kāi)發(fā)之銀行卡號(hào)識(shí)別功能,思路明確,需要的朋友參考下吧2016-12-12iOS實(shí)現(xiàn)控制屏幕常亮不變暗的方法示例
最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關(guān)于利用iOS如何實(shí)現(xiàn)控制屏幕常亮不變暗的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10IOS開(kāi)發(fā)實(shí)現(xiàn)錄音功能
本文給大家分享的是一個(gè)IOS開(kāi)發(fā)中實(shí)現(xiàn)錄音功能的實(shí)例,并簡(jiǎn)單給大家解析一下,有需要的小伙伴可以參考下2016-03-03iOS Xcode自定義代碼塊及遷移的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于iOS Xcode自定義代碼塊及遷移的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用iOS Xcode具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04