凡所有相,皆是虛妄。若見諸相非相,即見如來。
無加固的隱患
iOS系統相對于安卓平臺來說,在大家的觀念里一直是比較安全的。真實的情況是這樣的嗎,未必。在安卓上會遇到的破解、劫持、盜用等問題在iOS上幾乎都會遇到。只是很多時候,我們自以為被保護的太好了罷了。
1. 應用砸殼
App Store上的應用都使用了FairPlay DRM數字版權加密保護技術。使用AES 算法進行加密。解密所需的主密鑰也以加密形式存儲在容器文件中(FairPlay保護的文件)。解密主密鑰所需的密鑰稱為“用戶密鑰”。當用戶使用iTunes、App Store登陸新設備時,該設備向Apple服務器請求授權,從而獲得用戶密鑰。在試圖使用容器文件時,存儲在文件中的主密鑰隨后與用戶密鑰匹配,并且如果成功則允許使用。
第一種,最簡單的方法,就是從PP助手等相關平臺去下載已經砸過殼的應用。非常簡單。
第二種,自己砸殼
最早的砸殼工具是stefanesser寫的dumpdecrypted,通過手動注入然后啟動應用程序在內存進行dump解密后的內存實現砸殼,這種砸殼只能砸主App可執行文件。
對于應用程序里面存在framework的情況可以使用conradev的dumpdecrypted,通過_dyld_register_func_for_add_image注冊回調對每個模塊進行dump解密。但是這種還是需要拷貝dumpdecrypted.dylib,然后找路徑什么的,還是挺麻煩的。
比較簡單的做法是使用frida-ios-dump,該工具基于frida提供的強大功能通過注入js實現內存dump然后通過python自動拷貝到電腦生成ipa文件,通過以下方式配置完成之后真的就是一條命令砸殼。
環境配置:
首先上面也說了該工具基于frida,所以首先要在手機和mac電腦上面安裝frida,安裝方式參數官網的文檔:https://www.frida.re/docs/home/
如果mac端報如下錯:
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
然后將越獄設備通過USB連上電腦進行端口映射:
iproxy 2222 22
到此環境就配置好了(另當前python基于2.x的語法,先切換到python 2.x的環境)。
最簡單的方式直接使用./dump + 應用顯示的名字即可,如下:
./dump.py 微信
如果應用名稱重復了,可以使用如下命令查看安裝的應用的名字和bundle id:
./dump.py -l
然后使用如下命令對指定的bundle id應用進行砸殼即可:
./dump.py -b com.tencent.xin
其他方式如:Clutch,class-dump+ cycript + dumpdecrypted等大家可以自行研究。
2. 砸殼之后
使用命令查看ipa是否已砸殼
otool -l ShareCarProject | grep crypt
使用class-dump導出頭文件
class-dump -H ShareCarProject.app/ -o Headers
我們就可以在.h文件中查看所有公開方法的聲明,方便之后使用MonkeyDev hook該方法。
類似如下:
對ipa包重簽名后,就可以拿來玩了。
使用IDA工具靜態分析源碼
網盤鏈接 密碼:5sm3
選擇一個版本運行,然后點擊new,選擇自己要分析的應用(上面我們破解出來的.decrypted文件,.app文件,.ipa文件都可以選擇)。然后一直點下一步OK即可。
點擊F5 即可進入解析出來的源碼界面
MonKeyDev
MonkeyDev原文安裝鏈接,安裝完成后,新建項目時,關注以下界面:
緊接著.我們需要做的就是把我們的ipa文件放到指定位置(當然是放在工程目錄下了,這里就不多說了.).然后添加到工程中去.里面的put ipa or app here文件不要刪除。
在項目中,修改你想要控制的代碼。如果是動態庫,還需如下設置,不使用runtime庫。
如此,便成功修改了一個應用,常見的有微信搶紅包、修改運動步數等。應用的一切都被暴露出來了,危害不僅限于此。
簡單加固手段
-
完整性校驗
NSBundle *bundle = [NSBundle mainBundle]; NSDictionary *info = [bundle infoDictionary]; if ([info objectForKey:@"SignerIdentity"] != nil) { return YES; } return NO;
通過檢測SignerIdentity判斷是Mach-O文件否被篡改
原理是:SignerIdentity的值在info.plist中是不存在的,開發者不會加上去,蘋果也不會,只是當ipa包被反編譯后篡改文件再次打包,需要偽造SignerIdentity。
- 越獄判斷
嘗試使用NSFileManager判斷設備是否安裝了如下越獄常用工具:
/Applications/Cydia.app
/Library/MobileSubstrate/MobileSubstrate.dylib
/bin/bash
/usr/sbin/sshd
/etc/apt
但是不要寫成BOOL開關方法,給攻擊者直接鎖定目標hook繞過的機會。攻擊者可能會改變這些工具的安裝路徑,躲過你的判斷。
那么,你可以嘗試打開cydia應用注冊的URL scheme:
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
NSLog(@"Device is jailbroken");
}
但是不是所有的工具都會注冊URL scheme,而且攻擊者可以修改任何應用的URL scheme。
那么,你可以嘗試讀取下應用列表,看看有無權限獲取:
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
NSLog(@"Device is jailbroken");
NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"
error:nil];
NSLog(@"applist = %@",applist);
}
也可以通過檢測當前程序運行的環境變量:
void printEnv(void)
{
char *env = getenv("DYLD_INSERT_LIBRARIES");
NSLog(@"%s", env);
}
未越獄設備返回結果是null,越獄設備就各有各的精彩了,尤其是老一點的iOS版本越獄環境。
- 簡單加固手段
分為:
方法名混淆
明文字符串混淆
原理即字符串替換,使用#define定義,然后用腳步替換成不可預知的字符串。當然還有比較復雜的LLVM加固,這個單列一篇。