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?
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?
Câu trả lời:
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.
fileExistsAtPath:
và làm cho nó trở lại NO
cho đường dẫn cụ thể mà bạn kiểm tra.
Đâ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;
}
isJailbroken
+(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.app
khô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:
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.
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
}
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:
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 !
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
}
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.
deb
tệ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.
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.
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ỉ 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.
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.
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.
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 ...
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/"];
}
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()
}
}
}
}
Đâ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)
Hãy thử truy cập / Ứng dụng / ứng dụng