Jika saya ingin aplikasi saya berperilaku berbeda pada iPhone yang sudah di-jailbreak, bagaimana cara saya menentukan ini?
Jika saya ingin aplikasi saya berperilaku berbeda pada iPhone yang sudah di-jailbreak, bagaimana cara saya menentukan ini?
Jawaban:
Itu tergantung apa yang Anda maksud dengan jailbreak. Dalam kasus sederhana, Anda harus dapat melihat apakah Cydia diinstal dan pergi dengan itu - sesuatu seperti
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// do something useful
}
Untuk kernel yang diretas, ini sedikit (banyak) lebih banyak terlibat.
fileExistsAtPath:
dan membuatnya kembali NO
untuk jalur spesifik yang Anda periksa.
Ini adalah kode yang menggabungkan beberapa jawaban yang saya temukan untuk kebutuhan ini, dan akan memberi Anda tingkat keberhasilan yang jauh lebih tinggi:
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];
}
Memeriksa jalur file /Applications/Cydia.app
tidak diizinkan di ponsel biasa? Saya belum pernah mendengar Apple mendeteksi ini dan menolak aplikasi untuk itu, tetapi Apple tidak dapat diprediksi. Cydia memiliki skema URL cydia: // yang dapat diperiksa secara hukum dengan aplikasi UIAcanOpenURL:
Memeriksa apakah kernelnya rusak tidak banyak yang terlibat.
Jailbreaking membuat pemeriksaan tanda tangan kernel terhadap kode yang ditandatangani selalu melaporkan bahwa kode tersebut ditandatangani dengan benar, telepon yang tidak terputus tidak dapat menjalankan kode dengan tanda tangan yang buruk.
Jadi, sertakan executable terpisah dalam aplikasi dengan tanda tangan yang buruk. Itu bisa saja program 3-line yang memiliki main () dan nilai pengembalian. Kompilasi yang dapat dieksekusi tanpa menandatangani kode (matikan di Pengaturan Proyek-> Bangun) dan menandatanganinya dengan kunci yang berbeda menggunakan utilitas commandline "codesign".
Apakah aplikasi Anda mengeksekusi executable terpisah. Jika program Anda tidak bisa mendapatkan nilai kembali saat menjalankan executable terpisah dengan sig buruk, itu pasti dipenjara. Jika executable yang terpisah mengembalikan A-OK, ponsel ini pasti sudah di-jailbreak.
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
}
Anda dapat mendeteksi apakah suatu perangkat adalah JailBroken atau tidak dengan memeriksa yang berikut ini:
Ada perpustakaan open source yang saya buat dari berbagai artikel dan buku. Cobalah di GitHub !
Saya mengerjakan ulang di Swift 2.3 solusi yang disediakan oleh @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
}
Metode paling canggih yang saya tahu adalah menggunakan objc_copyImageNames()
fungsi. Ini mengembalikan daftar pustaka yang saat ini dimuat dan karena kebanyakan orang memiliki MobileSubstrate pada perangkat yang di-jailbreak dan sebagian besar alat crack iAP bergantung padanya, setidaknya beberapa pustaka MobileSubstrate akan muncul.
deb
file MobileSubstrate, membongkar dan blacklist (hampir) semua .dylib
itu dikemas.
Saya tidak mengetahui adanya "API" yang ada untuk ini. Jika ada, maka produk mask-jailbreak akan segera menutupinya.
Seperti yang ditunjukkan oleh banyak orang, ini adalah permainan kucing-dan-tikus. Dan setelah kedua pemain menjadi ahli, semuanya tergantung siapa yang mendapatkan langkah pertama. (Orang yang memegang perangkat.)
Saya menemukan banyak saran bagus untuk mendeteksi jailbreak di buku baru Zdziarski "Meretas dan Mengamankan Aplikasi iOS". (Secara pribadi, saya membayar lebih untuk eBook O'Reilly karena mereka mengizinkan salin dan tempel.)
Tidak, saya tidak berafiliasi dengan penerbit. Tetapi saya menemukan buku yang bagus. Saya tidak suka hanya mempublikasikan kesalahan peretas sehingga mereka bisa memperbaikinya, jadi saya pikir saya akan menunjuk ke buku itu.
Coba jalankan kode yang tidak ditandatangani melalui aplikasi Anda.
Perangkat yang di-jailbreak biasanya memiliki karakteristik sebagai berikut:
Hanya memeriksa keberadaan file untuk deteksi jailbreak pasti gagal. Pemeriksaan ini mudah dilewati.
Beberapa file umum untuk diperiksa:
/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
Sebagian besar memeriksa file terkait Cydia.
Saya sarankan mencari file yang tidak ada di iPhone "vanilla". Semua kit jailbreak yang saya lihat menginstal ssh. Itu mungkin indikator yang baik untuk telepon yang rusak.
Apa yang kami lakukan adalah, kami sudah memiliki umpan RSS untuk berkomunikasi dengan pengguna kami ( Stocks Live ), kami menempatkan item berita yang menyatakan sesuatu seperti ini:
Beberapa perangkat jailbroken memiliki masalah bla bla bla, kami melakukan peretasan untuk menyelesaikan masalah tersebut, tetapi kami perlu tahu apakah ini perangkat yang di-jailbreak atau tidak, tekan di sini sehingga aplikasi memperbaiki masalah tersebut. Jika Anda pernah kembali ke normal, yaitu menghapus jailbreak, tekan di sini.
Kemudian Anda memproses interaksi pengguna dan melakukan apa yang sesuai, seperti berperilaku berbeda dll ...
Cobalah untuk menemukan file yang dibuat oleh cydia atau perangkat yang sudah di-jailbreak. Atau coba tulis dalam file di luar kotak hitam aplikasi. Jika Anda berhasil melakukannya, perangkat ini akan dikompromikan / jailbreak :)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
Silakan gunakan kode berikut untuk Swift 4 dan di atas: Tambahkan kode berikut di delegasi app:
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()
}
}
}
}
Inilah solusi saya: Langkah 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
}
}
Langkah 2: Sebut di viewDidLoad()
dalam di dalam controller tampilan layar peluncuran Anda (atau VC apa pun yang Anda panggil untuk pertama kalinya):
// show a blank screen or some other view controller
let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
self.navigationController?.present(viewController, animated: true, completion:nil)
Cobalah Untuk Mengakses / Aplikasi / Preferensi.app/General.plist Anda harus dapat melakukannya pada iPhone yang sudah di-jailbreak Pada telepon non-Jb Anda tidak akan dapat mengaksesnya