Làm cách nào để phát hiện ứng dụng iOS đang chạy trên điện thoại đã bẻ khóa?


167

Nếu tôi muốn ứng dụng của mình hoạt động khác trên iPhone đã jailbreak, tôi sẽ làm thế nào để xác định điều này?


Bạn sẽ theo dõi một mục tiêu đang di chuyển, nhưng bạn có thể thử theo dõi tiến trình của các tài nguyên này để xem hiệu quả của kỹ thuật của bạn là: - theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection - theiphonewiki.com/wiki/XCon
Michael Giám mục

Câu trả lời:


90

Nó phụ thuộc vào những gì bạn có nghĩa là bẻ khóa. Trong trường hợp đơn giản, bạn sẽ có thể xem liệu Cydia đã được cài đặt và đi bằng cách đó - đại loại như

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

Đối với các hạt nhân bị hack, nó liên quan nhiều hơn một chút.


17
Sẽ không đủ để tìm kiếm bất kỳ tập tin / thư mục bên ngoài hộp cát của bạn? Thích / v.v?
Fistman nhịp điệu

58
Lưu ý rằng không phải tất cả người dùng đã cài đặt Cydia - đây không phải là một kiểm tra tốt và bạn nên kiểm tra một cái gì đó như / bin / bash mà / all / users / will / have.
Grant Paul

2
Trường hợp apt lưu thông tin của nó? Hoặc tôi có thể gọi lệnh system () và tìm hiểu. Tôi muốn tìm hiểu xem họ có ứng dụng nào không, và nếu họ có chúng, thì hãy hạn chế ứng dụng
conradev

2
@RazorSharp Tại thời điểm này, hầu hết tất cả người dùng đều có Cydia. Bây giờ có lẽ đủ để kiểm tra điều đó. Tuy nhiên, nếu bạn muốn kiểm tra đáng tin cậy 100%, bạn sẽ muốn sử dụng kiểm tra dựa trên kernel như bên dưới.
Cấp cho Paul

1
FWIW kiểm tra tập tin là không đáng kể để bỏ qua. Người ta có thể sử dụng mobilesubstrate để móc fileExistsAtPath:và làm cho nó trở lại NOcho đường dẫn cụ thể mà bạn kiểm tra.
to nướng_flakes

55

Đây là mã kết hợp một số câu trả lời tôi tìm thấy cho nhu cầu này và sẽ cho bạn tỷ lệ thành công cao hơn nhiều:

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
@Porizm, đây chỉ là sự kết hợp giữa một số câu trả lời tôi tìm thấy. Một số trong số họ không làm việc cho tôi, nhưng làm việc cho những người khác .. vì vậy với mã này, bạn không có cơ hội .. Nếu bạn sử dụng điều này, bạn có thể chắc chắn 99%. Về hiệu suất, bạn chỉ có thể chạy nó một lần trong mỗi lần chạy và lưu câu trả lời ở đâu đó, Bạn không phải chạy nó mỗi lần ..
Yossi

3
@yossi và porizm apple đã phê duyệt ứng dụng của bạn có chứa đoạn mã trên? vui lòng trả lời
karthikPrabhu Alagu

4
Phương thức này phải là hàm C nội tuyến, không phải Objective-C. Thật quá dễ dàng để khám phá và bỏ qua các phương thức Objective-C, đặc biệt nếu bạn gọi nóisJailbroken
progrmr

2
@Yossi thiết bị này có được jailbreak bằng Taig không?
Lakshay

3
@Lakshay Tôi không biết .. Bạn được mời nhiều hơn để kiểm tra và thêm vào đây một câu trả lời :)
Yossi

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

Kiểm tra đường dẫn tập tin /Applications/Cydia.appkhông được phép trên một điện thoại bình thường? Tôi chưa bao giờ nghe nói về việc Apple phát hiện ra điều này và từ chối một ứng dụng cho nó, nhưng Apple không thể đoán trước được. Cydia có lược đồ URL cydia: // có thể được kiểm tra hợp pháp với UIApplicationcanOpenURL:


1
Đây là một cách tuyệt vời để kiểm tra và nó không đi ra ngoài hộp cát của bạn. Chắc chắn, nếu công cụ bẻ khóa không cài đặt Cydia, nó sẽ trả về KHÔNG, nhưng tôi nghĩ rằng hầu hết các bản Bẻ khóa đều cài đặt Cydia.
Wim Haanstra

chuỗi này không thể bị thay đổi khi ứng dụng bị bẻ khóa?
NSRover 24/2/2015

8
Đối với iOS9.0 +, bạn cũng cần thêm khóa LSApplicationQueriesScheme trong phần ứng dụng. Nếu không, canOpenURL sẽ luôn trả về false.
David V

1
Điều này sẽ cung cấp dương tính giả nếu người dùng đã cài đặt ứng dụng phù hợp với sơ đồ cydia: // như InstantTV.
thattyson

@thattyson cảm ơn! Tôi đang tìm kiếm để kiểm tra lý do tại sao tôi nhận được dương tính giả
rickrvo

52

Kiểm tra xem kernel có bị hỏng không THẬT nhiều hơn.

Bẻ khóa làm cho kiểm tra chữ ký của hạt nhân mã đã ký luôn báo cáo rằng mã được ký chính xác, điện thoại không bị phá vỡ không thể chạy mã có chữ ký xấu.

Vì vậy, bao gồm một thực thi riêng trong ứng dụng có chữ ký xấu. Nó chỉ có thể là một chương trình 3 dòng có giá trị chính () và giá trị trả về. Biên dịch tệp thực thi mà không cần ký mã (tắt nó trong Cài đặt dự án-> Xây dựng) và ký tên bằng một khóa khác bằng cách sử dụng tiện ích dòng lệnh "Codeign".

Có ứng dụng của bạn thực thi các thực thi riêng biệt. Nếu chương trình của bạn không thể nhận được giá trị trả về khi chạy chương trình thực thi riêng biệt với sig xấu, thì nó chắc chắn bị bỏ tù. Nếu tệp thực thi riêng biệt trả về A-OK, điện thoại chắc chắn đã được bẻ khóa.


13
Bạn có thể có được một (phụ) thực thi có chữ ký không hợp lệ như thế thông qua App Store không?
fbrereto

34
Có lẽ mọi thứ đã thay đổi nhưng sẽ không thực thi một tệp thực thi riêng biệt ngăn bạn không được chấp thuận vào cửa hàng ứng dụng?
Peter Zich

4
Ai đó có thể trả lời trên trước để bình luận? Đây là câu hỏi quan trọng.
Petr

Không ai thực sự ngăn bạn viết Mach-O vào đĩa có chữ ký không hợp lệ. Tuy nhiên, tôi không đồng ý với câu trả lời rằng việc kiểm tra xem kernel có bị hỏng không liên quan hay đây là kiểm tra dứt khoát bằng mọi cách.
saagarjha

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
}

Đó là một giải pháp tốt, nhưng xCon và các công cụ khác như nó có thể dễ dàng bỏ qua kiểm tra này. Vì vậy, tôi đang tìm kiếm một giải pháp tốt hơn.
Alexei Robsky

7
@AlexeiRobsky không có giải pháp hoàn hảo. Sẽ luôn có ai đó tìm cách bỏ qua sự bảo vệ của bạn, đó chỉ là sự thật.
Richard J. Ross III

14

Bạn có thể phát hiện xem một thiết bị có phải là JailBroken hay không bằng cách kiểm tra các mục sau:

  • Cydia đã được cài đặt
  • Xác minh một số đường dẫn hệ thống
  • Thực hiện kiểm tra tính toàn vẹn của hộp cát
  • Thực hiện xác minh symlink
  • Xác minh xem bạn có tạo và ghi tệp bên ngoài Hộp cát của bạn không

Có một thư viện mã nguồn mở tôi tạo ra từ nhiều bài báo và sách khác nhau. Hãy dùng thử trên GitHub !


14

Tôi đã làm lại trong Swift 2.3 giải pháp được cung cấp bởi @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

Phương pháp tinh vi nhất mà tôi biết là sử dụng objc_copyImageNames()chức năng. Nó trả về một danh sách các thư viện hiện đang tải và vì hầu hết mọi người đều có MobileSubstrate trên các thiết bị đã bẻ khóa và hầu hết các công cụ bẻ khóa iAP đều phụ thuộc vào nó, ít nhất một số thư viện MobileSubstrate sẽ xuất hiện.


Bạn có bất kỳ liên kết nào về các thư viện MobileSubstrate / CydiaSubstrate trông như thế nào không? Tôi không có điện thoại bẻ khóa để chơi xung quanh vì vậy đang lái xe "mù" và các tìm kiếm của Google về cơ bản đưa ra nhận xét của bạn ở trên.
chadbag

@chadbag Tôi cũng không có nhưng bạn có thể tìm debtệp của MobileSubstrate, giải nén nó và danh sách đen (gần như) tất cả đều .dylibđược đóng gói.
Maxthon Chan

Cảm ơn, tôi đã nhận được một số mã và tôi có thể thêm vào một số nội dung khác dựa trên nhận xét của bạn. Cảm ơn nhiều!
chadbag

4

Tôi không biết về bất kỳ "API" nào tồn tại cho việc này. Nếu có, thì một sản phẩm mặt nạ bẻ khóa sẽ nhanh chóng che đậy chúng.

Như nhiều người chỉ ra, đây là một trò chơi mèo vờn chuột. Và sau khi cả hai người chơi trở thành chuyên gia, tất cả đều thuộc về người được di chuyển đầu tiên. (Người cầm thiết bị.)

Tôi đã tìm thấy nhiều đề xuất tốt để phát hiện jailbreak trong cuốn sách mới "Hack và bảo mật ứng dụng iOS" của Zdziarski. (Cá nhân tôi đã trả nhiều tiền hơn cho Sách điện tử O'Reilly vì họ cho phép sao chép và dán.)

Không, tôi không liên kết với các nhà xuất bản. Nhưng tôi đã tìm thấy nó một cuốn sách tốt. Tôi không muốn chỉ xuất bản những sai lầm của tin tặc để họ có thể sửa chúng, vì vậy tôi nghĩ tôi đã chỉ vào cuốn sách.


4

Hãy thử thực thi mã không dấu thông qua ứng dụng của bạn.

Một thiết bị đã bẻ khóa thường có các đặc điểm sau:

  • chạy mã không dấu
  • đã cài đặt Cydia
  • có tập tin bẻ khóa
  • truy cập r / w đầy đủ vào toàn bộ hệ thống tập tin
  • một số tệp hệ thống sẽ được sửa đổi (nội dung và vì vậy sha1 không khớp với các tệp gốc)
  • bị kẹt với phiên bản cụ thể (phiên bản bẻ khóa)

Chỉ cần kiểm tra sự tồn tại của tập tin để phát hiện jailbreak là thất bại. Những kiểm tra rất dễ bỏ qua.


3
Cố gắng thực thi mã không dấu sẽ làm cho ứng dụng của bạn bị từ chối khỏi cửa hàng ứng dụng
Frederic Yesid Peña Sánchez

4

Một số tệp phổ biến để kiểm tra: /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

Hầu hết kiểm tra các tập tin liên quan đến Cydia.


3

Tôi khuyên bạn nên tìm kiếm các tệp không có trên iPhone "vanilla". Tất cả các bộ dụng cụ bẻ khóa tôi đã thấy cài đặt ssh. Đó có thể là một chỉ báo tốt của một chiếc điện thoại đã bẻ khóa.


18
ssh không bao giờ được cài đặt tự động, người dùng phải tự cài đặt nó.
Grant Paul

1
Tôi đã không thực sự theo kịp với cảnh bẻ khóa. Nhưng như tôi nhớ, khi tôi viết bài này (Jan '09), Ziphone và những người khác đã cài đặt ssh và hệ thống con bsd theo mặc định. Có lẽ điều đó không còn đúng nữa.
Gordon Wilson

12
hãy tin tôi khi tôi nói rằng chpwn đã theo kịp cảnh bẻ khóa.
Đường mòn Winfield

3

Những gì chúng tôi đã làm là, chúng tôi đã có một nguồn cấp dữ liệu RSS để liên lạc với người dùng của mình ( Stocks Live ), chúng tôi đặt một mục tin tức có nội dung như sau:

Một số thiết bị đã bẻ khóa có vấn đề bla bla bla, chúng tôi đã thực hiện một bản hack để giải quyết những vấn đề đó nhưng chúng tôi cần biết đây có phải là thiết bị đã bẻ khóa hay không, nhấn vào đây để ứng dụng khắc phục sự cố. Nếu bạn trở lại bình thường, tức là đã gỡ bỏ bản bẻ khóa, hãy nhấn vào đây.

Sau đó, bạn xử lý tương tác người dùng và làm những gì phù hợp, như hành xử khác nhau, v.v ...


3

Cố gắng tìm một tập tin mà cydia hoặc thiết bị đã bẻ khóa tạo ra. Hoặc cố gắng viết vào một tệp bên ngoài hộp đen của ứng dụng. Nếu bạn thành công để làm điều đó, thiết bị bị xâm nhập / bẻ khóa :)

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

2
Apple đã phê duyệt ứng dụng của bạn có chứa đoạn mã trên?
karthikPrabhu Alagu

3

Vui lòng sử dụng mã sau cho Swift 4 trở lên: Thêm mã sau vào appdelegate:

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 (_ application: 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

Đây là giải pháp của tôi: Bước 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
    }
}

Bước 2: Gọi nó bên trong bên viewDidLoad()trong bộ điều khiển xem màn hình khởi chạy của bạn (hoặc bất kỳ VC nào bạn đang gọi lần đầu tiên):

       // 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

Hãy thử truy cập / Ứng dụng / ứng dụng


3
Câu trả lời này sẽ thú vị hơn với mã nguồn. IMHO: Điều này sẽ kiếm cho bạn một upvote.
Johan Karlsson

5
-1 = Các thiết bị không bị lỗi cũng có thể mở và đọc tệp này. (Đã kiểm tra)
thắn

@JohanKarlsson Tôi cho rằng độc giả ở đây có thể viết mã nguồn của riêng họ. Nếu họ không thể - họ đang làm gì ở đây?
gnasher729
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.