2012-08-31 24 views
6

我需要穩定的方式來嘗試在iOS設備上運行未簽名的可執行文件,以測試設備是否已越獄(即允許運行未簽名代碼)。在iOS應用程序中運行未簽名代碼以測試越獄

我寫了一個小的可執行文件,基本上什麼都不做。

int main(int argc, char *argv[]) { 
    return 23; 
} 

我已經編譯並在iOS設備上成功運行(都是Jailbroken而不是)。

我已經將這個可執行文件添加到應用程序包並將應用程序部署到iOS設備。

這會導致設備上的可執行文件的只讀版本。我試圖chmod這個文件來給它執行權限,但是這個失敗了,所以我把它複製到應用程序的tmp目錄中,在那裏我可以用可執行權限chmod。

其他問題已經建議使用execve調用可執行文件,但是這會用新文件替換正在運行的進程,這會殺死應用程序。叉()總是失敗,所以這不是一個選項。 System()需要一個shell,並且有可能在沒有shell的情況下進行越獄,這仍然允許未簽名的代碼運行,所以這已經結束了。 Popen()分叉,這樣就行不通了。

有趣的是,我發現了,要求我的可執行execv在一個正常的設備會導致「不允許操作」的錯誤,而稱這是一個越獄設備上導致「權限被拒絕」的錯誤。只有這樣才能用於越獄檢測,除了如果發生允許execv進行越獄的情況,應用程序將立即崩潰,因爲它的進程將被替換。

根據this,iBooks執行此操作執行越獄檢測,但似乎使用fairplayd二進制執行它的execve調用。

有沒有人對運行可執行文件或使用fairplayd有任何建議?

回答

3

您無法直接更改測試可執行文件的權限,因爲應用程序資源在安裝應用程序後無法修改。那將是一個安全漏洞。所以,這就是爲什麼你需要將它複製到tmp/caches/documents目錄,然後使其可運行。

我不知道,如果你的應用程序需要支持多任務處理,如果你需要檢測越獄在第一次運行的開始,或者如果它的確定要等到應用程序關閉。但是,如果你可以關閉多任務,那麼你可以實現此方法(小可執行在本例中名爲test):

- (void)applicationWillTerminate:(UIApplication *)application { 
    NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent: @"test"]; 
    int result = execlp([path UTF8String], [path UTF8String], NULL); 
    // if we got here, then the attempt to run the external process failed, so make a note of this: 
    [[NSUserDefaults standardUserDefaults] setValue: [NSNumber numberWithBool: NO] forKey: @"is_jailbroken"]; 
    NSLog(@"test returns %d", result); 
} 

如果execlp()調用成功,那麼,你的程序將被替換。但是,這個過程即將關閉。當我這樣做時,我沒有看到實際的崩潰日誌,所以我不確定蘋果是否會抱怨這一點。沒有外觀崩潰的用戶。

如果您無法執行單獨的過程,那麼您的應用程序將繼續顯示允許您記錄手機顯然未越獄的事實,這可以在下次啓動應用程序時注意到。

如果你需要支持多任務,那麼你可以嘗試把上面的代碼放入多任務回調,如applicationDidEnterBackground:。如果電話正常,exec調用失敗(並返回),所以你的應用不會終止(退出)。我會假設(?)蘋果公司的評論者不會在越獄手機上測試你的應用程序。對於越獄手機的用戶,您的應用將退出,而不是進入後臺。也許這足夠滿足您的需求?

此外,只是供參考,還有其他方法來測試越獄系統,這可能是相當可靠的(我不確定您是否希望能夠100%檢測到越獄手機,或者檢測到標準配置越獄)

Determining if an iPhone is Jail broken Programmatically

How do I detect that an iOS app is running on a jailbroken phone?

+0

系統傳遞到外殼和運行未簽名代碼並不一定意味着你必須有一個shell命令。 – richie

+0

對我來說,無論手機是否越獄,系統總是會返回32512,表示無法找到該文件。 – richie

+0

@richie,好的,抱歉。我必須在我的小越獄「hello world」程序(安裝在'/ Applications /')中運行這個,這是我通常在回答越獄問題時所做的。我用'system()'得到和你一樣的返回碼。我已經使用'execlp'更新了我的答案。我確保使用安裝到'/ var/mobile/Applications'的應用程序來測試這個。再次,我的道歉。 – Nate

相關問題