अगर मैं चाहता हूं कि मेरा ऐप एक जेलब्रेक iPhone पर अलग तरह से व्यवहार करे, तो मैं इसे कैसे निर्धारित करूंगा?
अगर मैं चाहता हूं कि मेरा ऐप एक जेलब्रेक iPhone पर अलग तरह से व्यवहार करे, तो मैं इसे कैसे निर्धारित करूंगा?
जवाबों:
यह निर्भर करता है कि आपको जेलब्रेक से क्या मतलब है। सरल मामले में, आपको यह देखने में सक्षम होना चाहिए कि क्या सीडिया स्थापित है और इसके द्वारा जाना जाता है - कुछ ऐसा
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// do something useful
}
हैक की गई गुठली के लिए, यह थोड़ा (बहुत) अधिक शामिल है।
fileExistsAtPath:
और इसे NO
आपके द्वारा चेक किए गए विशिष्ट पथ के लिए वापस कर सकता है।
यह एक कोड है जो इस आवश्यकता के लिए मुझे मिले कुछ उत्तरों को संयोजित करता है, और आपको बहुत अधिक सफलता दर देगा:
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;
}
isJailbroken
+(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:
जाँच कर रहा है कि कर्नेल टूट गया है या नहीं।
जेलब्रेकिंग साइन कोड की कर्नेल हस्ताक्षर जांच को हमेशा रिपोर्ट करता है कि कोड सही तरीके से हस्ताक्षरित है, अखंड फोन एक बुरे हस्ताक्षर के साथ कोड नहीं चला सकते हैं।
तो, एक खराब हस्ताक्षर के साथ ऐप में एक अलग निष्पादन योग्य शामिल करें। यह सिर्फ एक 3-लाइन प्रोग्राम हो सकता है जिसमें मुख्य () और एक वापसी मूल्य है। कोड हस्ताक्षर के बिना निष्पादन योग्य संकलित करें (इसे प्रोजेक्ट सेटिंग्स-> बिल्ड में बंद करें) और "कोडसाइन" कमांडलाइन उपयोगिता का उपयोग करके एक अलग कुंजी के साथ हस्ताक्षर करें।
अपने एप्लिकेशन को अलग निष्पादन योग्य निष्पादित करें। यदि आपके प्रोग्राम को खराब sig के साथ अलग निष्पादन योग्य चलाते समय रिटर्न मान नहीं मिल सकता है, तो यह निश्चित रूप से जेल है। यदि अलग-अलग निष्पादन योग्य ए-ओके देता है, तो फोन निश्चित रूप से जेलब्रेक है।
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
}
आप निम्न के लिए जाँच करके पता लगा सकते हैं कि कोई उपकरण जेलब्रोकेन है या नहीं:
एक खुला स्रोत पुस्तकालय है जिसे मैंने विभिन्न लेखों और पुस्तकों से बनाया है। GitHub पर इसे आज़माएं !
मैंने स्विफ्ट 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
}
सबसे परिष्कृत तरीका जो मुझे पता है कि objc_copyImageNames()
फ़ंक्शन का उपयोग कर रहा है । यह वर्तमान में भरी हुई पुस्तकालयों की सूची देता है और चूंकि अधिकांश लोगों के पास जेलब्रोकन उपकरणों पर MobileSubstrate है और अधिकांश iAP क्रैक टूल इस पर निर्भर करते हैं, कम से कम कुछ MobileSubstrate पुस्तकालय दिखाई देंगे।
deb
MobileSubstrate की फाइल को देख सकते हैं , इसे अनपैक कर सकते हैं और इसे लगभग ब्लैक लिस्ट कर सकते हैं .dylib
।
मुझे इसके लिए मौजूद किसी भी "एपीआई" के बारे में जानकारी नहीं है। अगर वहाँ थे, तो एक भागने-मास्किंग उत्पाद जल्दी से उन्हें कवर करेगा।
जैसा कि बहुत से लोग बताते हैं, यह एक बिल्ली और चूहे का खेल है। और दोनों खिलाड़ियों के विशेषज्ञ बनने के बाद, यह सब नीचे आता है कि पहला कदम कौन उठाता है। (डिवाइस पकड़े हुए व्यक्ति)
मुझे Zdziarski की नई किताब "हैकिंग एंड सिक्योरिंग आईओएस ऐप्स" में जेलब्रेक का पता लगाने के लिए कई अच्छे सुझाव मिले। (व्यक्तिगत रूप से, मैंने ओ'रेली ईबुक के लिए अधिक भुगतान किया क्योंकि वे कॉपी-और-पेस्ट की अनुमति देते हैं।)
नहीं, मैं प्रकाशकों से संबद्ध नहीं हूं। लेकिन मुझे यह एक अच्छी किताब लगी। मुझे केवल हैकर्स की गलतियों को प्रकाशित करना पसंद नहीं है, ताकि वे उन्हें ठीक कर सकें, इसलिए मैंने सोचा कि मैं पुस्तक की ओर इशारा करता हूं।
अपने एप्लिकेशन के माध्यम से अहस्ताक्षरित कोड निष्पादित करने का प्रयास करें।
एक जेलब्रेक उपकरणों में आमतौर पर निम्नलिखित विशेषताएं होती हैं:
जेलब्रेक का पता लगाने के लिए फ़ाइल के अस्तित्व की जाँच करना विफल होने का संकेत है। ये चेक बाईपास करना आसान है।
कुछ सामान्य फ़ाइलों के लिए जाँच करें:
/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 संबंधित फ़ाइलों के लिए सबसे अधिक जाँच करें।
मैं एक "वेनिला" iPhone पर मौजूद नहीं हैं फ़ाइलों की तलाश करने का सुझाव देता हूं। सभी भागने किट मैंने ssh स्थापित देखा है। यह एक जेलब्रेक फोन का एक अच्छा संकेतक हो सकता है।
हमने क्या किया है, हमारे पास अपने उपयोगकर्ताओं ( स्टॉक लाइव ) के साथ संवाद करने के लिए पहले से ही एक आरएसएस फ़ीड है , हम एक समाचार आइटम डालते हैं, जो बताता है कि इस तरह है:
कुछ जेलब्रोकन डिवाइसों में समस्याएँ हैं bla bla bla, हमने उन मुद्दों को हल करने के लिए एक हैक किया है, लेकिन हमें यह जानने की आवश्यकता है कि क्या यह जेलब्रेक डिवाइस है या नहीं, यहां दबाएं ताकि ऐप समस्या को ठीक कर दे। यदि आप कभी सामान्य लौटते हैं, तो जेलब्रेक को हटा दें, यहां दबाएं।
फिर आप उपयोगकर्ता के इंटरैक्शन की प्रक्रिया करते हैं और जो उचित है, जैसे अलग-अलग व्यवहार करते हैं ...
एक फाइल खोजने की कोशिश करें जो cydia या jailbroken डिवाइस बनाएं। या ऐप के ब्लैकबॉक्स के बाहर किसी फ़ाइल में लिखने का प्रयास करें। यदि आप ऐसा करने में सफल होते हैं, तो डिवाइस समझौता / जेलब्रेक :)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
कृपया स्विफ्ट 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
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)
/Application/Preferences.app/General.plist पर पहुंचने का प्रयास करें। आपको जेलब्रोकेन iPhone पर ऐसा करने में सक्षम होना चाहिए गैर-जेबी फोन पर आप इसे एक्सेस करने में सक्षम नहीं होंगे।