2009-01-05 77 views

回答

77

這取決於你的越獄意味着什麼。在簡單情況下,你應該能夠看到是否安裝Cydia的和由去 - 有點像

NSString *filePath = @"/Applications/Cydia.app"; 
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
{ 
    // do something useful 
} 

對於黑客攻擊的內核,這是一個有點(很多)更多地參與。

+14

在沙箱外尋找_any_文件/目錄不夠嗎?像/ etc一樣? – 2009-08-01 04:53:02

+50

請注意,並非所有用戶都安裝了Cydia - 這不是一個很好的檢查,而應該檢查/ bin/bash/all/users /將會擁有的東西。 – 2010-02-21 07:03:21

+0

apt在哪裏存儲它的信息?或者我可以只調用一個system()命令並找出答案。我想知道他們是否有特定的應用程序,如果他們有這些應用程序,那麼應該限制應用程序 – conradev 2010-03-06 20:16:31

3

我建議尋找「香草」iPhone上不存在的文件。我見過的所有越獄工具包都安裝了ssh。這可能是越獄手機的一個很好的指標。

+16

ssh永遠不會自動安裝,用戶必須自行安裝。 – 2010-02-21 07:03:50

+1

我沒有真正跟上越獄現場。但是據我記得,當我寫這個(2009年1月)時,Ziphone和其他人默認安裝了ssh和bsd子系統。也許這不再是事實。 – 2010-03-04 06:06:01

+12

相信我,當我說chpwn跟上了越獄現場。 – 2011-07-14 00:45:02

48

檢查內核是否損壞並不是那麼重要。

越獄使內核對已簽名代碼的簽名檢查始終報告代碼已正確簽名,未中斷的手機無法運行具有錯誤簽名的代碼。

因此,在應用程序中包含一個單獨的可執行文件,簽名不正確。它可能只是一個具有main()和返回值的3行程序。在沒有代碼簽名的情況下編譯可執行文件(在Project Settings-> Build中將其關閉),並使用「codesign」命令行工具使用不同的密鑰對其進行簽名。

讓您的應用程序執行單獨的可執行文件。如果你的程序在運行帶有壞信號的單獨可執行文件時無法獲得返回值,那麼它肯定會被監禁。如果單獨的可執行文件返回A-OK,則手機肯定會越獄。

18
BOOL isJailbroken() 
{ 
#if TARGET_IPHONE_SIMULATOR 
    return NO; 
#else 
    FILE *f = fopen("/bin/bash", "r"); 

    if (errno == ENOENT) 
    { 
     // device is NOT jailbroken 
     fclose(f); 
     return NO; 
    } 
    else { 
     // device IS jailbroken 
     fclose(f); 
     return YES; 
    } 
#endif 
} 
2

我不知道有任何「API」存在這個。如果有的話,那麼一個越獄屏蔽產品會很快覆蓋它們。

很多人指出,這是一個貓捉老鼠的遊戲。在雙方都成爲專家之後,這一切都歸結爲誰是第一步。 (持有該設備的人)

我發現了許多關於在Zdziarski的新書「Hacking and Securing iOS Apps」中檢測越獄的好建議。 (就我個人而言,我爲O'Reilly電子書支付更多費用,因爲他們允許複製粘貼。)

不,我不隸屬於出版商。但我確實發現它是一本好書。我不喜歡發佈黑客的錯誤,以便他們能夠修復它們,所以我認爲我會指出這本書。

-2

嘗試訪問/Application/Preferences.app/General.plist 你應該能夠在越獄iPhone 在非JB電話做,你將無法訪問它

49
+(BOOL)isJailbroken { 
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"]; 
    return [[UIApplication sharedApplication] canOpenURL:url]; 
} 

在普通電話上不允許檢查文件路徑/Applications/Cydia.app?我從來沒有聽說過蘋果檢測到這一點,並拒絕爲它的應用程序,但蘋果是不可預知的。蘋果蠹具有a URL scheme cydia://可與UIApplication的canOpenURL:

2

在法律上查了一下,我們所做的是,我們已經有一個RSS feed與我們的用戶(Stocks Live)進行交流,我們把,指出這樣的一條新聞:

一些越獄設備有問題bla bla bla,我們做了一個黑客來解決這些問題,但我們需要知道,如果這是一個越獄設備,請按這裏,所以該應用程序修復這個問題。如果您恢復正常,即刪除越獄,請按此處。

然後你處理用戶交互,做什麼是適當的,喜歡錶現不同等...

3

試圖找到其中的Cydia越獄或設備創建一個文件。或者嘗試在應用程序黑盒外的文件中寫入。如果你成功做到這一點,該設備是妥協/越獄:)

- (BOOL)jailbroken 
{ 
    NSFileManager * fileManager = [NSFileManager defaultManager]; 
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"]; 
} 
3

嘗試通過您的應用程序執行未簽名的代碼。

越獄設備通常具有以下特點:

  • 運行未簽名代碼
  • 有Cydia中安裝
  • 有越獄文件
  • 全R/W訪問整個文件系統
  • 一些系統文件將被修改(內容,所以sha1與原始文件不匹配)
  • 卡住sp (越獄版)

只是檢查越獄檢測文件的存在是註定要失敗。 這些檢查很容易繞過。

5

我知道的最複雜的方法是使用objc_copyImageNames()函數。它返回當前加載的庫的列表,並且由於大多數人在越獄設備上都有MobileSubstrate,並且大多數iAP破解工具都依賴於它,所以至少會顯示一些MobileSubstrate庫。

12

您可以檢測設備是否越獄或不通過檢查以下內容:

  • Cydia中安裝
  • 驗證系統的一些路徑
  • 執行沙箱完整性檢查
  • 執行符號鏈接驗證
  • 驗證您是否在Sandbox外部創建和寫入文件

我從各種文章和書籍中創建了一個開源庫。 Try it out on GitHub

44

這是結合了一些答案,我發現了這個話題的代碼,並給你更高的成功率:

BOOL isJailbroken() 
{ 
#if !(TARGET_IPHONE_SIMULATOR) 

    if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"] || 
     [[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/MobileSubstrate.dylib"] || 
     [[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"] || 
     [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/sbin/sshd"] || 
     [[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"] || 
     [[NSFileManager defaultManager] fileExistsAtPath:@"/private/var/lib/apt/"] || 
     [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]) { 
     return YES; 
    } 

    FILE *f = NULL ; 
    if ((f = fopen("/bin/bash", "r")) || 
     (f = fopen("/Applications/Cydia.app", "r")) || 
     (f = fopen("/Library/MobileSubstrate/MobileSubstrate.dylib", "r")) || 
     (f = fopen("/usr/sbin/sshd", "r")) || 
     (f = fopen("/etc/apt", "r"))) { 
     fclose(f); 
     return YES; 
    } 
    fclose(f); 

    NSError *error; 
    NSString *stringToBeWritten = @"This is a test."; 
    [stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error]; 
    [[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil]; 
    if(error == nil) 
    { 
     return YES; 
    } 

#endif 

    return NO; 
} 
1

一些常見的文件來檢查: /Library/MobileSubstrate/MobileSubstrate.dylib

/Applications/Cydia.app

/var/cache/apt

/var/lib/apt

/var/lib/cydia

/var/log/syslog

/var/tmp/cydia.log

/bin/bash

/bin/sh

/usr/sbin/sshd

/usr/libexec/ssh-keysign

/etc/ssh/sshd_config

/etc/apt

蘋果蠹相關的文件大多數檢查。

8

我在Swift 2.3中重做了@Yossi提供的解決方案

public static func jailbroken(application: UIApplication) -> Bool { 
    guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return isJailbroken() } 
    return application.canOpenURL(cydiaUrlScheme) || isJailbroken() 
} 


static func isJailbroken() -> Bool { 

    if isSimulator { 
     return false 
    } 

    let fileManager = NSFileManager.defaultManager() 
    if fileManager.fileExistsAtPath("/Applications/Cydia.app") || 
     fileManager.fileExistsAtPath("/Library/MobileSubstrate/MobileSubstrate.dylib") || 
     fileManager.fileExistsAtPath("/bin/bash") || 
     fileManager.fileExistsAtPath("/usr/sbin/sshd") || 
     fileManager.fileExistsAtPath("/etc/apt") || 
     fileManager.fileExistsAtPath("/usr/bin/ssh") { 
     return true 
    } 

    if canOpen("/Applications/Cydia.app") || 
     canOpen("/Library/MobileSubstrate/MobileSubstrate.dylib") || 
     canOpen("/bin/bash") || 
     canOpen("/usr/sbin/sshd") || 
     canOpen("/etc/apt") || 
     canOpen("/usr/bin/ssh") { 
     return true 
    } 

    let path = "/private/" + NSUUID().UUIDString 
    do { 
     try "anyString".writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding) 
     try fileManager.removeItemAtPath(path) 
     return true 
    } catch { 
     return false 
    } 
} 

static func canOpen(path: String) -> Bool { 
    let file = fopen(path, "r") 
    guard file != nil else { return false } 
    fclose(file) 
    return true 
} 
相關問題