2012年2月3日 星期五

如何偵測手機是否JB

這篇的討論是用幾個常見 JB 過的行為來偵測是不是 JB 了,而沒辦法提供一個 100% 肯定的解決方法。首先我們來看一下 JB 過的 iOS 會有那幾個特色?
  1. 會有 Cyndia 這個 App
  2. 會需要背景執行
  3. info.plist 的SignerIdentity會被變動
我們就上面三點來假設都是 JB 需要做的行為,如果我們取得這些行為之後留下來的證據,就可以假設此手機是被 JB 了。我必需要再強調一次,這篇文章的行為我都還沒有真正測試過,只是收集網路上和書上的例子寫成,還請大家補充。
如何檢查此手機是不是安裝了 Cydia
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// 檢查是不是有 Cydia 這個程式
}
一般來說 iOS 現在是多工,方便切換程式而不是像 Mac 或 PC 作業系統的背景執行,通常 JB 後會把背景執行這個功能打開就會用到 fork() 這個指令,所以檢查有沒有背景執行的功能(fork())就可以知道有沒有 JB。
int result = fork();
if (result > 0) {
     NSLog(@"JBed");
}else{
     NSLog(@"NO JB");
}
JB 之後,就會有心人士把一些要付費的 App 給破解,從此之後這個 App 就會被放到網路頁讓人任意下載。而有心力在做這個行為的同時會破壞掉這個 App 裡 info.plist 的 SignerIdentity,於是我們就來檢查。
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil)
{
    // 此程式可能被破解
}
以上三種方法提供給大家參考用。但我們寫 App 的人要還要再想清楚,JB 的人是不是有可能也會花錢買我們的 App。此時第三個方法好像比較可以保護我們自己的資產。如果提到破解 App 的問題,一開始 App 免費,然後用 in app Purchase 也許也可以是另一條保護自己 App 的方法。歡迎大家提出來討論。