iOS判斷設(shè)備是否越獄

http://blog.csdn.net/sakulafly/article/details/21159257

  蘋果是非常看重產(chǎn)品的安全性的,所以給用戶設(shè)計了一套復(fù)雜的安全機制。這讓喜愛自由,崇尚一切開放的程序員們極度不爽,于是越獄就成了蘋果和黑客們反復(fù)斗法的場所。總體來說,越獄可以讓我們隨意安裝、共享應(yīng)用,但確實也降低了設(shè)備的安全性,會給一些惡意應(yīng)用提供方便之門。
  有時我們的應(yīng)用希望知道安裝的設(shè)備是否已經(jīng)越獄了,顯然,蘋果官方不會給出解決方案來的,那么我們怎么辦呢?因為越獄后會自動安裝cydia,所以我們可以從這方面入手;也可以借助權(quán)限問題,去讀取應(yīng)用的列表;還可以去讀環(huán)境變量,不越獄的機器應(yīng)該是讀取不到任何內(nèi)容的。
  下面我們一個一個方法來講:
  1. 判定常見的越獄文件
    /Applications/Cydia.app
    /Library/MobileSubstrate/MobileSubstrate.dylib
    /bin/bash
    /usr/sbin/sshd
    /etc/apt
    這個表可以盡可能的列出來,然后判定是否存在,只要有存在的就可以認(rèn)為機器是越獄了。

[objc] view plain copy

派生到我的代碼片
派生到我的代碼片

define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])

const char* jailbreak_tool_pathes[] = {
"/Applications/Cydia.app",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/bin/bash",
"/usr/sbin/sshd",
"/etc/apt"
};

  • (BOOL)isJailBreak
    {
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
    if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
    NSLog(@"The device is jail broken!");
    return YES;
    }
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
    }
  1. 判斷cydia的URL scheme
    URL scheme是可以用來在應(yīng)用中呼出另一個應(yīng)用,是一個資源的路徑(詳見《iOS中如何呼出另一個應(yīng)用》),這個方法也就是在判定是否存在cydia這個應(yīng)用。

[objc] view plain copy

派生到我的代碼片
派生到我的代碼片

  • (BOOL)isJailBreak
    {
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
    NSLog(@"The device is jail broken!");
    return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
    }
  1. 讀取系統(tǒng)所有應(yīng)用的名稱
    這個是利用不越獄的機器沒有這個權(quán)限來判定的。

[objc] view plain copy

派生到我的代碼片
派生到我的代碼片

define USER_APP_PATH @"/User/Applications/"

  • (BOOL)isJailBreak
    {
    if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
    NSLog(@"The device is jail broken!");
    NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
    NSLog(@"applist = %@", applist);
    return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
    }
  1. 使用stat方法來判定cydia是否存在
    這個方法本身思路還是通過判定cydia應(yīng)用,但方法是用的stat函數(shù),同時會判定是否有注入動態(tài)庫。

[objc] view plain copy

派生到我的代碼片
派生到我的代碼片

define CYDIA_APP_PATH "/Applications/Cydia.app"

int checkInject()
{
int ret;
Dl_info dylib_info;
int (func_stat)(const char, struct stat*) = stat;

if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) {  
    return 0;  
}  
return 1;  

}

int checkCydia()
{
// first ,check whether library is inject
struct stat stat_info;

if (!checkInject()) {  
    if (0 == stat(CYDIA_APP_PATH, &stat_info)) {  
        return 1;  
    }  
} else {  
    return 1;  
}  
return 0;  

}

  • (BOOL)isJailBreak
    {
    if (checkCydia()) {
    NSLog(@"The device is jail broken!");
    return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
    }
  1. 讀取環(huán)境變量
    這個DYLD_INSERT_LIBRARIES環(huán)境變量,在非越獄的機器上應(yīng)該是空,越獄的機器上基本都會有Library/MobileSubstrate/MobileSubstrate.dylib

[objc] view plain copy

派生到我的代碼片
派生到我的代碼片

char* printEnv(void)
{
charchar *env = getenv("DYLD_INSERT_LIBRARIES");
NSLog(@"%s", env);
return env;
}

  • (BOOL)isJailBreak
    {
    if (printEnv()) {
    NSLog(@"The device is jail broken!");
    return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
    }

    當(dāng)然,判定一個設(shè)備是否越獄時,可以多種方法并用以確保準(zhǔn)確。這里我還想說的是越獄有完美越獄還有非完美越獄,這本身就不是官方有保證的行為,所以情況也是復(fù)雜多變。iOS7針對沙盒機制也有了改進(jìn)升級,有些情況對新的版本或許是不合適的,這點還需要實際情況實際處理。另外,還有fork一個子線程,看返回值等一些方法,這里也不再一一列舉。
    最后,越獄畢竟會帶來不安全因素的增加,尤其是金融工具裝的比較多的情況下,強烈不推薦越獄。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內(nèi)容