凡所有相伪货,皆是虛妄们衙。若見諸相非相钾怔,即見如來。
無加固的隱患
iOS系統(tǒng)相對于安卓平臺來說蒙挑,在大家的觀念里一直是比較安全的宗侦。真實(shí)的情況是這樣的嗎,未必忆蚀。在安卓上會遇到的破解矾利、劫持、盜用等問題在iOS上幾乎都會遇到蜓谋。只是很多時(shí)候梦皮,我們自以為被保護(hù)的太好了罷了。
1. 應(yīng)用砸殼
App Store上的應(yīng)用都使用了FairPlay DRM數(shù)字版權(quán)加密保護(hù)技術(shù)桃焕。使用AES 算法進(jìn)行加密剑肯。解密所需的主密鑰也以加密形式存儲在容器文件中(FairPlay保護(hù)的文件)。解密主密鑰所需的密鑰稱為“用戶密鑰”观堂。當(dāng)用戶使用iTunes让网、App Store登陸新設(shè)備時(shí),該設(shè)備向Apple服務(wù)器請求授權(quán)师痕,從而獲得用戶密鑰溃睹。在試圖使用容器文件時(shí),存儲在文件中的主密鑰隨后與用戶密鑰匹配胰坟,并且如果成功則允許使用因篇。
第一種,最簡單的方法笔横,就是從PP助手等相關(guān)平臺去下載已經(jīng)砸過殼的應(yīng)用竞滓。非常簡單。
第二種吹缔,自己砸殼
最早的砸殼工具是stefanesser寫的dumpdecrypted商佑,通過手動注入然后啟動應(yīng)用程序在內(nèi)存進(jìn)行dump解密后的內(nèi)存實(shí)現(xiàn)砸殼,這種砸殼只能砸主App可執(zhí)行文件厢塘。
對于應(yīng)用程序里面存在framework的情況可以使用conradev的dumpdecrypted茶没,通過_dyld_register_func_for_add_image注冊回調(diào)對每個(gè)模塊進(jìn)行dump解密。但是這種還是需要拷貝dumpdecrypted.dylib晚碾,然后找路徑什么的抓半,還是挺麻煩的。
比較簡單的做法是使用frida-ios-dump格嘁,該工具基于frida提供的強(qiáng)大功能通過注入js實(shí)現(xiàn)內(nèi)存dump然后通過python自動拷貝到電腦生成ipa文件琅关,通過以下方式配置完成之后真的就是一條命令砸殼。
環(huán)境配置:
首先上面也說了該工具基于frida讥蔽,所以首先要在手機(jī)和mac電腦上面安裝frida涣易,安裝方式參數(shù)官網(wǎng)的文檔:https://www.frida.re/docs/home/
如果mac端報(bào)如下錯:
Uninstalling a distutils installed project (six) has been deprecated` `and` `will be removed` `in` `a future version. This` `is` `due to the fact that uninstalling a distutils project will only partially uninstall the project.
使用如下命令安裝即可:
sudo pip install frida –upgrade –ignore-installed six
然后將越獄設(shè)備通過USB連上電腦進(jìn)行端口映射:
iproxy 2222 22
到此環(huán)境就配置好了(另當(dāng)前python基于2.x的語法,先切換到python 2.x的環(huán)境)冶伞。
最簡單的方式直接使用./dump + 應(yīng)用顯示的名字即可新症,如下:
./dump.py 微信
如果應(yīng)用名稱重復(fù)了,可以使用如下命令查看安裝的應(yīng)用的名字和bundle id:
./dump.py -l
然后使用如下命令對指定的bundle id應(yīng)用進(jìn)行砸殼即可:
./dump.py -b com.tencent.xin
其他方式如:Clutch响禽,class-dump+ cycript + dumpdecrypted等大家可以自行研究徒爹。
2. 砸殼之后
使用命令查看ipa是否已砸殼
otool -l ShareCarProject | grep crypt
使用class-dump導(dǎo)出頭文件
class-dump -H ShareCarProject.app/ -o Headers
我們就可以在.h文件中查看所有公開方法的聲明,方便之后使用MonkeyDev hook該方法芋类。
類似如下:
對ipa包重簽名后隆嗅,就可以拿來玩了。
使用IDA工具靜態(tài)分析源碼
網(wǎng)盤鏈接 密碼:5sm3
選擇一個(gè)版本運(yùn)行侯繁,然后點(diǎn)擊new胖喳,選擇自己要分析的應(yīng)用(上面我們破解出來的.decrypted文件,.app文件贮竟,.ipa文件都可以選擇)丽焊。然后一直點(diǎn)下一步OK即可。
點(diǎn)擊F5 即可進(jìn)入解析出來的源碼界面
MonKeyDev
MonkeyDev原文安裝鏈接咕别,安裝完成后技健,新建項(xiàng)目時(shí),關(guān)注以下界面:
緊接著.我們需要做的就是把我們的ipa文件放到指定位置(當(dāng)然是放在工程目錄下了,這里就不多說了.).然后添加到工程中去.里面的put ipa or app here文件不要刪除惰拱。
在項(xiàng)目中雌贱,修改你想要控制的代碼。如果是動態(tài)庫偿短,還需如下設(shè)置欣孤,不使用runtime庫。
如此翔冀,便成功修改了一個(gè)應(yīng)用导街,常見的有微信搶紅包、修改運(yùn)動步數(shù)等纤子。應(yīng)用的一切都被暴露出來了搬瑰,危害不僅限于此。
簡單加固手段
-
完整性校驗(yàn)
NSBundle *bundle = [NSBundle mainBundle]; NSDictionary *info = [bundle infoDictionary]; if ([info objectForKey:@"SignerIdentity"] != nil) { return YES; } return NO;
通過檢測SignerIdentity判斷是Mach-O文件否被篡改
原理是:SignerIdentity的值在info.plist中是不存在的控硼,開發(fā)者不會加上去泽论,蘋果也不會,只是當(dāng)ipa包被反編譯后篡改文件再次打包卡乾,需要偽造SignerIdentity翼悴。
- 越獄判斷
嘗試使用NSFileManager判斷設(shè)備是否安裝了如下越獄常用工具:
/Applications/Cydia.app
/Library/MobileSubstrate/MobileSubstrate.dylib
/bin/bash
/usr/sbin/sshd
/etc/apt
但是不要寫成BOOL開關(guān)方法,給攻擊者直接鎖定目標(biāo)hook繞過的機(jī)會。攻擊者可能會改變這些工具的安裝路徑鹦赎,躲過你的判斷谍椅。
那么,你可以嘗試打開cydia應(yīng)用注冊的URL scheme:
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
NSLog(@"Device is jailbroken");
}
但是不是所有的工具都會注冊URL scheme古话,而且攻擊者可以修改任何應(yīng)用的URL scheme雏吭。
那么,你可以嘗試讀取下應(yīng)用列表陪踩,看看有無權(quán)限獲日让恰:
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
NSLog(@"Device is jailbroken");
NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"
error:nil];
NSLog(@"applist = %@",applist);
}
也可以通過檢測當(dāng)前程序運(yùn)行的環(huán)境變量:
void printEnv(void)
{
char *env = getenv("DYLD_INSERT_LIBRARIES");
NSLog(@"%s", env);
}
未越獄設(shè)備返回結(jié)果是null,越獄設(shè)備就各有各的精彩了肩狂,尤其是老一點(diǎn)的iOS版本越獄環(huán)境摘完。
- 簡單加固手段
分為:
方法名混淆
明文字符串混淆
原理即字符串替換,使用#define定義傻谁,然后用腳步替換成不可預(yù)知的字符串孝治。當(dāng)然還有比較復(fù)雜的LLVM加固,這個(gè)單列一篇栅螟。