1嘲叔、通過embeded.mobileprovision驗證
if let embeddedPath = Bundle.main.path(forResource: "_CodeSignature/CodeResources", ofType: ""),
let dic = NSMutableDictionary.init(contentsOfFile: embeddedPath),let files = dic["files"] as? [String:Any],let hashData = files["embedded.mobileprovision"] as? Data{
let hashValue = hashData.base64EncodedString()
let localHashValue = getHashValue()
if hashValue != localHashValue{//文件被篡改懦砂,退出
Toast.showInfo(content: "檢測到非法簽名蜒犯,程序即將退出",duration: 3)
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
exit(0) // (1)
}
}
}
embeded.mobileprovision文件會在上架appStore后被蘋果刪除,因為該文件中包含了證書相關信息荞膘,ipa包上傳到appstore后罚随,蘋果會驗證證書的合法性,驗證通過后會刪除該文件羽资,并對ipa包進行重簽后上架appstore淘菩,這樣才能保證開發(fā)者自己的證書過期后依然可以通過appstore進行下載。
但是如果ipa包被越獄手機二次簽名后屠升,embeded.mobileprovision文件會重新生成潮改,這時則可以監(jiān)測到文件是否被篡改來判斷是否被二次簽名。
2腹暖、判斷embeded.mobileprovision是否存在
基于上述原理汇在,線上包是不存在embeded.mobileprovision這個文件的,如果是上架appstore的包脏答,則可以通過判斷embeded.mobileprovision是否存在則可以判斷是否被二次打包糕殉。
3、其他方案
還有一些網上搜索到的方案以蕴,我沒有驗證過
通過判斷info.plist中是否存在SignerIdentity
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil)
{
return YES;
}
return NO;
通過對重要文件的hash值進行校驗
可以在app中重要文件的hash值存儲到服務器糙麦,在app啟動是計算重要文件的hash值與服務器進行對比辛孵。