iOS APP反重签名技术详解
轉載請注明出處,作者:秦偉
什么是簽名?
簡單的說,簽名(signature)是蘋果公司的一種安全機制,APP的簽名有效才被iOS系統允許執行。
簽名包含了開發者證書的信息等,如下圖所示:
在Xcode中,找到?Build Settings -> Code Signing ,在此處設置簽名。
什么是重簽名?
重簽名,就是在APP原來的基礎上,用現有的簽名替換原來的簽名。
為什么要重簽名?
1.在沒有源代碼的情況下,你已經對某個應用進行了資源修改(比如修改了啟動圖或圖標等)。修改完成以后,如果想要讓APP可以正常使用,該APP一定要重新簽名然后壓縮成IPA文件。
2.如果你想讓你的APP不經過蘋果審核,就可以私自發布到HTTPS服務器上,不越獄也能安裝,且沒有設備臺數限制,那么你就要把個人開發者簽名,替換成企業開發者In-House證書簽名,之后OTA發布就行了。
3.一個開發者的應用,需要在另一個開發者帳號下發布到App Store。上傳的ipa包,是重簽名后的包。
4.過期或者失效簽名的應用,正常使用需要重新簽名。
如何重簽名?
多數時候,當你有源代碼,你想怎么設置簽名就怎么設置,你可以把你的開發者證書換成別人的,或者把別人的開發者證書換成你自己的。
可是沒有源碼的情況下,你只有一個.app文件或者.ipa文件,這個時候,簽名已經無法通過Xcode來修改了。你需要一個叫codesign的命令行工具來實現重簽名。
codesign的語法就不介紹了,不在本文介紹范圍內。
為什么要反重簽名?
有沒有想過,當你辛辛苦苦開發的APP,可能上架了App Store,也可能小范圍內部傳播,但你想過沒有,別有用心之人可以想方設法篡改你的APP資源。
不要認為這沒什么。往嚴重一點說吧,改改啟動圖、圖標,算是輕的,如果連APP名也改了,把你的APP改頭換面,再提交到AppStore,這就是盜版行為 !
如何實現反重簽名?
原理:
1.每個簽名都含有開發者證書的ID信息。
2.開發者證書的ID沒有相同的。
首先,我們的開發者證書的ID字符串,在開發者證書導入鑰匙串以后,可以在鑰匙串中查到(10位大寫字母加數字)。
Xcode工程里面,把這個字符串保存起來,宏定義一下。
APP啟動時,檢查APP的簽名,讀取開發者證書的ID字符串。
然后做對比,如果和預設的不一樣,則視為簽名被篡改了。
實現:
#import "AppDelegate.h"// 證書ID #define kIdentifier @"55R3QD4LZ2"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 反重簽名[self checkCodesign];return YES; }- (void)checkCodesign {// 描述文件路徑NSString *embeddedPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"];if ([[NSFileManager defaultManager] fileExistsAtPath:embeddedPath]) {// 讀取application-identifierNSString *embeddedProvisioning = [NSString stringWithContentsOfFile:embeddedPath encoding:NSASCIIStringEncoding error:nil];NSArray *embeddedProvisioningLines = [embeddedProvisioning componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];for (int i = 0; i < [embeddedProvisioningLines count]; i++) {if ([[embeddedProvisioningLines objectAtIndex:i] rangeOfString:@"application-identifier"].location != NSNotFound) {NSInteger fromPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@"<string>"].location+8;NSInteger toPosition = [[embeddedProvisioningLines objectAtIndex:i+1] rangeOfString:@"</string>"].location;NSRange range;range.location = fromPosition;range.length = toPosition - fromPosition;NSString *fullIdentifier = [[embeddedProvisioningLines objectAtIndex:i+1] substringWithRange:range];// NSLog(@"%@", fullIdentifier);NSArray *identifierComponents = [fullIdentifier componentsSeparatedByString:@"."];NSString *appIdentifier = [identifierComponents firstObject];// 對比簽名IDif (![appIdentifier isEqual:kIdentifier]) {UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"codesign verification failed." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];[alert show];}break;}}}}#pragma mark - UIAlertViewDelegate- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {exit(0); }@end
以上代碼基本無需修改,僅需要在宏定義處,替換成你自己打包要用的開發者證書ID即可。
經過真機測試,重簽名后,運行效果如下:
點擊OK直接退出。
想要不帶提示直接退出,請自行修改代碼。
注意:模擬器上無效(因為模擬器上沒有真機的環境,系統找不到描述文件,所以里面的代碼不會執行)
總結
以上是生活随笔為你收集整理的iOS APP反重签名技术详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【科创人】慧安金科马宇翔:人生级决策总会
- 下一篇: 使用AutoFac组织多项目应用程序