मैं कैसे पता लगाऊं कि एक आईओएस ऐप जेलब्रेक फोन पर चल रहा है?


167

अगर मैं चाहता हूं कि मेरा ऐप एक जेलब्रेक iPhone पर अलग तरह से व्यवहार करे, तो मैं इसे कैसे निर्धारित करूंगा?


आप एक चलते लक्ष्य का अनुसरण करने जा रहे हैं, लेकिन आप इन संसाधनों की प्रगति का अनुसरण करके यह देखने की कोशिश कर सकते हैं कि आपकी तकनीक कितनी प्रभावी है: - theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection - theiphonewiki.com/wiki/XCon
माइकल बिशप

जवाबों:


90

यह निर्भर करता है कि आपको जेलब्रेक से क्या मतलब है। सरल मामले में, आपको यह देखने में सक्षम होना चाहिए कि क्या सीडिया स्थापित है और इसके द्वारा जाना जाता है - कुछ ऐसा

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

हैक की गई गुठली के लिए, यह थोड़ा (बहुत) अधिक शामिल है।


17
क्या आपके सैंडबॉक्स के बाहर किसी फाइल / डायर को देखना पर्याप्त नहीं होगा ? जैसे / आदि?
रिदमिक फिस्टमैन

58
ध्यान दें कि सभी उपयोगकर्ताओं के पास Cydia स्थापित नहीं है - यह एक अच्छा चेक नहीं है, और आपको / बिन / बैश की तरह कुछ के लिए जांच करनी चाहिए कि / सभी / उपयोगकर्ताओं / होगा / है।
पॉल

2
उपयुक्त अपनी जानकारी कहाँ संग्रहीत करता है? या मैं सिर्फ एक सिस्टम () कमांड को कॉल कर सकता हूं और पता लगा सकता हूं। मैं यह पता लगाना चाहता हूं कि क्या उनके पास कुछ ऐप हैं, और अगर उनके पास है, तो ऐप को प्रतिबंधित करें
conradev

2
@RazorSharp इस बिंदु पर, लगभग सभी उपयोगकर्ताओं के पास Cydia है। शायद अब उसके लिए जाँच करना काफी है। हालाँकि, यदि आप 100% विश्वसनीय जाँच चाहते हैं, तो नीचे दिए गए कर्नेल-आधारित चेक का उपयोग करना चाहेंगे।
पॉल

1
FWIW फाइल चेक बाईपास के लिए तुच्छ हैं। एक हुक करने के लिए मोबाइलों का उपयोग कर सकता है fileExistsAtPath:और इसे NOआपके द्वारा चेक किए गए विशिष्ट पथ के लिए वापस कर सकता है।
toasted_flakes

55

यह एक कोड है जो इस आवश्यकता के लिए मुझे मिले कुछ उत्तरों को संयोजित करता है, और आपको बहुत अधिक सफलता दर देगा:

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
@ पॉरिज़्म, यह मेरे द्वारा पाए गए कुछ उत्तरों से सिर्फ एक संयोजन है। उनमें से कुछ ने मेरे लिए काम नहीं किया, लेकिन दूसरों के लिए काम किया .. इसलिए इस कोड के साथ आप संभावना नहीं लेते हैं .. यदि आप इसका उपयोग करते हैं तो आप 99% सुनिश्चित हो सकते हैं। प्रदर्शन के संबंध में, आप इसे प्रत्येक रन पर केवल एक बार चला सकते हैं और उत्तर को कहीं न कहीं सहेज सकते हैं, आपको इसे हर बार चलाना नहीं है ..
Yossi

3
@yossi और पोरिज़्म ऐप्पल ने आपके ऐप को मंजूरी दी जिसमें उपरोक्त कोड शामिल है? कृपया जवाब दें
karthikPrabhu Alagu

4
यह विधि एक इन-लाइन C फ़ंक्शन होनी चाहिए, न कि ऑब्जेक्टिव-सी। ऑब्जेक्टिव-सी विधियों की खोज करना और उन्हें दरकिनार करना बहुत आसान है, खासकर यदि आप इसे कहते हैंisJailbroken
1

2
@ Yossi Taig का उपयोग करके इस कवर डिवाइस को जेलब्रेक करता है?
लक्सय

3
@ लखेशी मुझे नहीं पता .. आप से अधिक की जाँच करने के लिए आमंत्रित किया जाता है और यहाँ एक उत्तर जोड़ने के लिए :)
योसी

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

/Applications/Cydia.appसामान्य फोन पर फ़ाइल पथ की जाँच करने की अनुमति नहीं है? मैंने Apple का कभी पता नहीं लगाया है और इसके लिए किसी ऐप को अस्वीकार कर दिया है, लेकिन Apple अप्रत्याशित है। Cydia में एक URL स्कीम है cydia: // जिसे कानूनी रूप से UIApplication के साथ चेक किया जा सकता हैcanOpenURL:


1
यह जांचने का एक शानदार तरीका है, और यह आपके सैंडबॉक्स के बाहर नहीं जाता है। निश्चित रूप से, अगर जेलब्रेकर में Cydia स्थापित नहीं है, तो यह NO नहीं लौटेगा, लेकिन मुझे लगता है कि ज्यादातर Jailbreaks ,ydia को स्थापित करते हैं।
विमन हैनस्ट्रा

क्या ऐप के क्रैक होने पर इस स्ट्रिंग को बदला नहीं जा सकता है?
NSRover

8
IOS9.0 + के लिए आपको ऐप प्लिस्ट में LSApplicationQueriesSchemes कुंजी भी जोड़ना होगा। अन्यथा canOpenURL हमेशा गलत वापस आ जाएगी।
डेविड वी।

1
यदि उपयोगकर्ता के पास कोई एप्लिकेशन इंस्टॉल है जो झूठा-पॉजिटिव प्रदान करेगा, जो कि cydia: // स्कीम जैसे InstantTV के अनुरूप हो।
thattyson

@thattyson धन्यवाद! मैं यह
देखना चाह

52

जाँच कर रहा है कि कर्नेल टूट गया है या नहीं।

जेलब्रेकिंग साइन कोड की कर्नेल हस्ताक्षर जांच को हमेशा रिपोर्ट करता है कि कोड सही तरीके से हस्ताक्षरित है, अखंड फोन एक बुरे हस्ताक्षर के साथ कोड नहीं चला सकते हैं।

तो, एक खराब हस्ताक्षर के साथ ऐप में एक अलग निष्पादन योग्य शामिल करें। यह सिर्फ एक 3-लाइन प्रोग्राम हो सकता है जिसमें मुख्य () और एक वापसी मूल्य है। कोड हस्ताक्षर के बिना निष्पादन योग्य संकलित करें (इसे प्रोजेक्ट सेटिंग्स-> बिल्ड में बंद करें) और "कोडसाइन" कमांडलाइन उपयोगिता का उपयोग करके एक अलग कुंजी के साथ हस्ताक्षर करें।

अपने एप्लिकेशन को अलग निष्पादन योग्य निष्पादित करें। यदि आपके प्रोग्राम को खराब sig के साथ अलग निष्पादन योग्य चलाते समय रिटर्न मान नहीं मिल सकता है, तो यह निश्चित रूप से जेल है। यदि अलग-अलग निष्पादन योग्य ए-ओके देता है, तो फोन निश्चित रूप से जेलब्रेक है।


13
क्या आप एक (उप-) निष्पादन योग्य प्राप्त कर सकते हैं जिसका हस्ताक्षर ऐप स्टोर के माध्यम से अमान्य है?
fbrereto

34
शायद चीजें बदल गई हैं, लेकिन एक अलग निष्पादन योग्य निष्पादित नहीं कर रहा है जो आपको ऐप स्टोर पर अनुमोदित होने से रोक देगा?
पीटर ज़िच

4
क्या कोई पिछली टिप्पणियों पर जवाब दे सकता है? यह महत्वपूर्ण प्रश्न है।
पेट्र

कोई भी आपको अमान्य हस्ताक्षर के साथ मच-ओ को डिस्क पर लिखने से रोकने वाला नहीं है। हालाँकि, मैं इस जवाब से असहमत हूं कि जाँच करना कि कर्नेल टूटा हुआ नहीं है या यह किसी भी तरह से एक निश्चित जाँच है।
21

20
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
}

यह एक अच्छा समाधान है, लेकिन xCon और इसके जैसे अन्य उपकरण इस चेक को आसानी से बायपास कर सकते हैं। इसलिए, मैं एक बेहतर समाधान की तलाश कर रहा हूं।
अलेक्सी रोब्स्की

7
@AlexeiRobsky कोई सही समाधान नहीं है। हमेशा कोई ऐसा व्यक्ति होगा जो आपकी सुरक्षा को दरकिनार करने का रास्ता खोज लेगा, यह एक सच्चाई है।
रिचर्ड जे। रॉस III

14

आप निम्न के लिए जाँच करके पता लगा सकते हैं कि कोई उपकरण जेलब्रोकेन है या नहीं:

  • Cydia स्थापित है
  • सिस्टम पथ के कुछ सत्यापित करें
  • सैंडबॉक्स अखंडता जांच करें
  • सिम्लिंक सत्यापन करें
  • सत्यापित करें कि क्या आप अपने सैंडबॉक्स के बाहर फाइल बनाते हैं और लिखते हैं

एक खुला स्रोत पुस्तकालय है जिसे मैंने विभिन्न लेखों और पुस्तकों से बनाया है। GitHub पर इसे आज़माएं !


14

मैंने स्विफ्ट 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
}

6

सबसे परिष्कृत तरीका जो मुझे पता है कि objc_copyImageNames()फ़ंक्शन का उपयोग कर रहा है । यह वर्तमान में भरी हुई पुस्तकालयों की सूची देता है और चूंकि अधिकांश लोगों के पास जेलब्रोकन उपकरणों पर MobileSubstrate है और अधिकांश iAP क्रैक टूल इस पर निर्भर करते हैं, कम से कम कुछ MobileSubstrate पुस्तकालय दिखाई देंगे।


क्या आपके पास कोई लिंक है जो MobileSubstrate / CydiaSubstrate पुस्तकालयों की तरह दिखता है? मेरे पास जेलब्रेक फोन नहीं है जिससे मैं "अंधा" चला रहा हूं और Google खोज मूल रूप से आपकी टिप्पणी के साथ ऊपर आती है।
चाडबाग

@chadbag मेरे पास एक भी नहीं है, लेकिन आप debMobileSubstrate की फाइल को देख सकते हैं , इसे अनपैक कर सकते हैं और इसे लगभग ब्लैक लिस्ट कर सकते हैं .dylib
मैक्सथन चान

धन्यवाद, मुझे कुछ कोड मिला और मैं आपकी टिप्पणी के आधार पर कुछ और चीजें जोड़ सकता हूं। बहुत धन्यवाद!
चडबाग

4

मुझे इसके लिए मौजूद किसी भी "एपीआई" के बारे में जानकारी नहीं है। अगर वहाँ थे, तो एक भागने-मास्किंग उत्पाद जल्दी से उन्हें कवर करेगा।

जैसा कि बहुत से लोग बताते हैं, यह एक बिल्ली और चूहे का खेल है। और दोनों खिलाड़ियों के विशेषज्ञ बनने के बाद, यह सब नीचे आता है कि पहला कदम कौन उठाता है। (डिवाइस पकड़े हुए व्यक्ति)

मुझे Zdziarski की नई किताब "हैकिंग एंड सिक्योरिंग आईओएस ऐप्स" में जेलब्रेक का पता लगाने के लिए कई अच्छे सुझाव मिले। (व्यक्तिगत रूप से, मैंने ओ'रेली ईबुक के लिए अधिक भुगतान किया क्योंकि वे कॉपी-और-पेस्ट की अनुमति देते हैं।)

नहीं, मैं प्रकाशकों से संबद्ध नहीं हूं। लेकिन मुझे यह एक अच्छी किताब लगी। मुझे केवल हैकर्स की गलतियों को प्रकाशित करना पसंद नहीं है, ताकि वे उन्हें ठीक कर सकें, इसलिए मैंने सोचा कि मैं पुस्तक की ओर इशारा करता हूं।


4

अपने एप्लिकेशन के माध्यम से अहस्ताक्षरित कोड निष्पादित करने का प्रयास करें।

एक जेलब्रेक उपकरणों में आमतौर पर निम्नलिखित विशेषताएं होती हैं:

  • अहस्ताक्षरित कोड चलाएँ
  • ने Cydia स्थापित किया है
  • जेलब्रेक फाइलें हैं
  • पूरे फाइल सिस्टम के लिए पूर्ण आर / डब्ल्यू का उपयोग
  • कुछ सिस्टम फ़ाइलों को संशोधित किया जाएगा (सामग्री और इसलिए sha1 मूल फ़ाइलों के साथ मेल नहीं खाता है)
  • विशिष्ट संस्करण के लिए अटक गया (जेलब्रेक संस्करण)

जेलब्रेक का पता लगाने के लिए फ़ाइल के अस्तित्व की जाँच करना विफल होने का संकेत है। ये चेक बाईपास करना आसान है।


3
अहस्ताक्षरित कोड को अंजाम देने की कोशिश करने से आपका ऐप
ऐपस्टोर

4

कुछ सामान्य फ़ाइलों के लिए जाँच करें: /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

Cydia संबंधित फ़ाइलों के लिए सबसे अधिक जाँच करें।


3

मैं एक "वेनिला" iPhone पर मौजूद नहीं हैं फ़ाइलों की तलाश करने का सुझाव देता हूं। सभी भागने किट मैंने ssh स्थापित देखा है। यह एक जेलब्रेक फोन का एक अच्छा संकेतक हो सकता है।


18
ssh कभी भी अपने आप इंस्टॉल नहीं होता है, उपयोगकर्ताओं को इसे स्वयं इंस्टॉल करना होगा।
पॉल

1
मैं वास्तव में भागने के दृश्य के साथ नहीं रखा है। लेकिन जैसा कि मुझे याद है, जब मैंने इसे (जनवरी '09) लिखा था, तो जिपफोन और अन्य ने ssh और bsd सबसिस्टम को डिफ़ॉल्ट रूप से स्थापित किया था। शायद अब यह सच नहीं है।
गॉर्डन विल्सन

12
मुझे विश्वास है जब मैं कहता हूँ कि chpwn जेलब्रेक दृश्य के साथ रखा है।
विनफील्ड ट्रेल

3

हमने क्या किया है, हमारे पास अपने उपयोगकर्ताओं ( स्टॉक लाइव ) के साथ संवाद करने के लिए पहले से ही एक आरएसएस फ़ीड है , हम एक समाचार आइटम डालते हैं, जो बताता है कि इस तरह है:

कुछ जेलब्रोकन डिवाइसों में समस्याएँ हैं bla bla bla, हमने उन मुद्दों को हल करने के लिए एक हैक किया है, लेकिन हमें यह जानने की आवश्यकता है कि क्या यह जेलब्रेक डिवाइस है या नहीं, यहां दबाएं ताकि ऐप समस्या को ठीक कर दे। यदि आप कभी सामान्य लौटते हैं, तो जेलब्रेक को हटा दें, यहां दबाएं।

फिर आप उपयोगकर्ता के इंटरैक्शन की प्रक्रिया करते हैं और जो उचित है, जैसे अलग-अलग व्यवहार करते हैं ...


3

एक फाइल खोजने की कोशिश करें जो cydia या jailbroken डिवाइस बनाएं। या ऐप के ब्लैकबॉक्स के बाहर किसी फ़ाइल में लिखने का प्रयास करें। यदि आप ऐसा करने में सफल होते हैं, तो डिवाइस समझौता / जेलब्रेक :)

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

2
Apple ने आपके ऐप को मंजूरी दे दी है जिसमें उपरोक्त कोड है?
कार्तिकप्रभु आलगू

3

कृपया स्विफ्ट 4 और इसके बाद के संस्करण के लिए निम्नलिखित कोड का उपयोग करें: ऐपडेलीगेट में निम्नलिखित कोड जोड़ें:

private func getJailbrokenStatus() -> Bool {
    if TARGET_IPHONE_SIMULATOR != 1 {
        // Check 1 : existence of files that are common for jailbroken devices
        if FileManager.default.fileExists(atPath: "/Applications/Cydia.app")
            || FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib")
            || FileManager.default.fileExists(atPath: "/bin/bash")
            || FileManager.default.fileExists(atPath: "/usr/sbin/sshd")
            || FileManager.default.fileExists(atPath: "/etc/apt")
            || FileManager.default.fileExists(atPath: "/private/var/lib/apt/")
            || UIApplication.shared.canOpenURL(URL(string:"cydia://package/com.example.package")!) {
            return true
        }
        // Check 2 : Reading and writing in system directories (sandbox violation)
        let stringToWrite = "Jailbreak Test"
        do {
            try stringToWrite.write(toFile:"/private/JailbreakTest.txt", atomically:true, encoding:String.Encoding.utf8)
            //Device is jailbroken
            return true
        } catch {
            return false
        }
    }
    else {
        return false
    }
}

func applicationDidBecomeActive (_ एप्लिकेशन: UIApplication) {

    if getJailbrokenStatus() {
        let alert = UIAlertController(title: LocalizedKeys.Errors.jailbreakError, message: LocalizedKeys.Errors.jailbreakErrorMessage, preferredStyle: UIAlertController.Style.alert)
        let jailBrokenView = UIViewController()

        jailBrokenView.view.frame = UIScreen.main.bounds
        jailBrokenView.view.backgroundColor = .white
        self.window?.rootViewController = jailBrokenView
        jailBrokenView.present(alert, animated: true, completion: nil)
    }

    if #available(iOS 11.0, *) {
        if !UIScreen.main.isCaptured {
            DispatchQueue.main.async {
                self.blockImageView.removeFromSuperview()
            }
        }
    }
}

1

यहाँ मेरा समाधान है: चरण 1

extension UIDevice {
    func isJailBroken() -> Bool {
        let cydiaPath = "/Applications/Cydia.app"
        let aptPath = "/private/var/lib/apt/"
        if FileManager.default.fileExists(atPath: cydiaPath) || FileManager.default.fileExists(atPath: aptPath) {
            return true
        }
        return false
    }
}

चरण 2: इसे viewDidLoad()अपने लॉन्च स्क्रीन व्यू कंट्रोलर (या जो भी कुलपति आप पहली बार कॉल कर रहे हैं) के अंदर कॉल करें :

       // show a blank screen or some other view controller
       let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
       self.navigationController?.present(viewController, animated: true, completion:nil)

-2

/Application/Preferences.app/General.plist पर पहुंचने का प्रयास करें। आपको जेलब्रोकेन iPhone पर ऐसा करने में सक्षम होना चाहिए गैर-जेबी फोन पर आप इसे एक्सेस करने में सक्षम नहीं होंगे।


3
स्रोत कोड के साथ यह उत्तर अधिक दिलचस्प होगा। IMHO: यह आपको एक लाभ अर्जित करेगा।
जोहान कार्लसन

5
-1 = Unjailbroken डिवाइस भी इस फ़ाइल को खोल और पढ़ सकते हैं। (परीक्षित)
फ्रैंक

@JohanKarlsson मेरा मानना ​​है कि यहाँ पाठक अपना सोर्स कोड लिख सकते हैं। अगर वे नहीं कर सकते हैं - वे यहाँ क्या कर रहे हैं?
gnasher729
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.