หากฉันต้องการให้แอปของฉันทำงานแตกต่างไปจาก iPhone ที่ถูกเจลเบรคแล้วฉันจะพิจารณาสิ่งนี้ได้อย่างไร
หากฉันต้องการให้แอปของฉันทำงานแตกต่างไปจาก iPhone ที่ถูกเจลเบรคแล้วฉันจะพิจารณาสิ่งนี้ได้อย่างไร
คำตอบ:
มันขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยการเจลเบรค ในกรณีง่าย ๆ คุณควรเห็นว่า Cydia ได้รับการติดตั้งแล้วหรือยัง
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
ไม่ได้รับอนุญาตในโทรศัพท์ปกติหรือไม่? ฉันไม่เคยได้ยินว่าแอปเปิ้ลตรวจพบสิ่งนี้และปฏิเสธแอปสำหรับแอปนี้ แต่แอปเปิ้ลคาดเดาไม่ได้ Cydia มีรูปแบบ URL cydia: // ซึ่งสามารถตรวจสอบได้อย่างถูกกฎหมายด้วย UIApplicationcanOpenURL:
การตรวจสอบว่าเคอร์เนลเสียหรือไม่
การแหกคุกทำให้การตรวจสอบลายเซ็นของเคอร์เนลของรหัสที่เซ็นชื่อเสมอรายงานว่ารหัสถูกลงนามอย่างถูกต้องโทรศัพท์ที่ไม่เสียหายไม่สามารถเรียกใช้รหัสที่มีลายเซ็นไม่ดี
ดังนั้นให้รวมไฟล์ปฏิบัติการแยกต่างหากในแอปด้วยลายเซ็นที่ไม่ดี มันอาจเป็นโปรแกรม 3 บรรทัดที่มี main () และค่าส่งคืน รวบรวมการปฏิบัติการโดยไม่ต้องมีการเซ็นรหัส (ปิดใน Project Settings-> Build) และเซ็นชื่อด้วยคีย์อื่นโดยใช้ยูทิลิตี commandline "codesign"
ให้แอปของคุณเรียกใช้งานแยกจากกัน หากโปรแกรมของคุณไม่สามารถรับค่าส่งคืนได้เมื่อเรียกใช้โปรแกรมแยกต่างหากด้วย sig ที่ไม่ดีแสดงว่ามันถูกจำคุก หากปฏิบัติการแยกส่งกลับ A-OK โทรศัพท์จะถูกเจลเบรค
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
}
คุณสามารถตรวจสอบว่าอุปกรณ์ JailBroken หรือไม่โดยตรวจสอบสิ่งต่อไปนี้:
มีห้องสมุดโอเพ่นซอร์สที่ฉันสร้างขึ้นจากบทความและหนังสือต่าง ๆ ลองใช้กับ GitHub !
ฉันทำใหม่ใน Swift 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 บนอุปกรณ์ที่ถูกเจลเบรคและเครื่องมือ crack iAP ส่วนใหญ่ขึ้นอยู่กับมันอย่างน้อยไลบรารี MobileSubstrate บางอันจะปรากฏขึ้น
deb
ไฟล์ของ MobileSubstrate, แกะมันออกและบัญชีดำ (เกือบ) ทั้งหมด.dylib
มันบรรจุอยู่
ฉันไม่ทราบ "APIs" ใด ๆ ที่มีอยู่สำหรับสิ่งนี้ หากมีอยู่แล้วผลิตภัณฑ์ปิดบังแหกคุกจะปิดบังพวกเขาอย่างรวดเร็ว
เมื่อผู้คนจำนวนมากชี้ให้เห็นว่ามันเป็นเกมแมวและเมาส์ และหลังจากผู้เล่นทั้งสองกลายเป็นผู้เชี่ยวชาญมันก็ขึ้นอยู่กับว่าใครจะได้รับการเคลื่อนไหวครั้งแรก (ผู้ที่ถืออุปกรณ์)
ฉันพบคำแนะนำที่ดีมากมายสำหรับการตรวจจับการแหกคุกในหนังสือเล่มใหม่ของ Zdziarski "การแฮ็กและการรักษาความปลอดภัยแอป iOS" (โดยส่วนตัวแล้วฉันจ่ายมากขึ้นสำหรับ eReilly เพราะพวกเขาอนุญาตให้คัดลอกและวาง)
ไม่ฉันไม่ได้มีส่วนเกี่ยวข้องกับผู้เผยแพร่ แต่ฉันพบว่ามันเป็นหนังสือที่ดี ฉันไม่ชอบเพียงแค่เผยแพร่ความผิดพลาดของแฮ็กเกอร์เพื่อให้พวกเขาสามารถแก้ไขได้ดังนั้นฉันคิดว่าฉันจะชี้ไปที่หนังสือ
ลองเรียกใช้งานโค้ดที่ไม่ได้ลงชื่อผ่านแอปพลิเคชันของคุณ
อุปกรณ์ที่ถูกเจลเบรคจะมีคุณสมบัติดังต่อไปนี้:
เพียงแค่ตรวจสอบการมีอยู่ของไฟล์สำหรับการตรวจจับการแหกคุกก็ล้มเหลว การตรวจสอบเหล่านี้ง่ายต่อการข้าม
ไฟล์ทั่วไปบางไฟล์ที่ต้องตรวจสอบ:
/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 "vanilla" ชุดแหกคุกทั้งหมดที่ฉันเคยเห็นติดตั้ง ssh นั่นอาจเป็นตัวบ่งชี้ที่ดีสำหรับโทรศัพท์ที่ถูกเจลเบรค
สิ่งที่เราทำคือเรามีฟีด RSS เพื่อสื่อสารกับผู้ใช้ของเรา ( Stocks Live ) เราใส่รายการข่าวที่ระบุสิ่งนี้:
อุปกรณ์ที่ถูกเจลเบรคบางตัวมีปัญหา bla bla bla เราทำการแฮกเพื่อแก้ไขปัญหาเหล่านั้น แต่เราจำเป็นต้องรู้ว่านี่เป็นอุปกรณ์ที่เจลเบรคหรือไม่กดที่นี่เพื่อที่แอพจะแก้ไขปัญหา หากคุณกลับสู่ภาวะปกติเช่นลบการเจลเบรคออกให้กดที่นี่
จากนั้นคุณประมวลผลการโต้ตอบของผู้ใช้และทำสิ่งที่เหมาะสมเช่นทำพฤติกรรมต่าง ๆ
ลองค้นหาไฟล์ที่อุปกรณ์ cydia หรือ jailbroken สร้าง หรือลองเขียนไฟล์นอก Blackbox ของแอพ หากคุณประสบความสำเร็จในการทำเช่นนั้นอุปกรณ์จะถูกโจมตี / เจลเบรคที่ :)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
โปรดใช้รหัสต่อไปนี้สำหรับ Swift 4 ขึ้นไป: เพิ่มรหัสต่อไปนี้ใน 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
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()
ตัวควบคุมมุมมองหน้าจอเรียกใช้งานของคุณ (หรือ VC ที่คุณใช้เป็นครั้งแรก):
// 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 ที่เจลเบรคในโทรศัพท์ที่ไม่ใช่ Jb คุณจะไม่สามารถเข้าถึงได้