Bagaimana cara mendeteksi bahwa aplikasi iOS berjalan di ponsel yang sudah di-jailbreak?

Jawaban:

90

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.

bijaksana
sumber
17
Bukankah akan cukup untuk mencari setiap file / dir luar sandbox Anda? Suka / etc?
Rhythmic Fistman
58
Perhatikan bahwa tidak semua pengguna memasang Cydia - ini bukan pemeriksaan yang baik, dan Anda sebaiknya memeriksa sesuatu seperti / bin / bash yang / semua / pengguna / akan / miliki.
Berikan Paul
2
Di mana apt menyimpan informasinya? Atau bisakah saya memanggil perintah system () dan mencari tahu. Saya ingin mengetahui apakah mereka memiliki aplikasi tertentu, dan jika mereka memilikinya, maka batasi aplikasinya
conradev
2
@RazorSharp Pada titik ini, hampir semua pengguna memiliki Cydia. Mungkin cukup untuk memeriksanya sekarang. Namun, jika Anda ingin cek 100% andal, Anda ingin menggunakan cek berbasis kernel seperti di bawah ini.
Berikan Paul
1
FWIW pemeriksaan file sepele untuk memotong. Satu dapat menggunakan ponsel substrat untuk menghubungkan fileExistsAtPath:dan membuatnya kembali NOuntuk jalur spesifik yang Anda periksa.
toasted_flakes
55

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;
}
Yossi
sumber
1
@Porizm, ini hanya kombinasi dari beberapa jawaban yang saya temukan. Beberapa dari mereka tidak bekerja untuk saya, tetapi bekerja untuk orang lain .. jadi dengan kode ini Anda tidak mengambil risiko .. Jika Anda menggunakan ini, Anda dapat 99% yakin. Mengenai kinerja, Anda dapat menjalankannya hanya sekali di setiap lari dan menyimpan jawabannya di suatu tempat, Anda tidak harus menjalankannya setiap kali ..
Yossi
3
@yossi dan apel porizm menyetujui aplikasi Anda yang berisi kode di atas? tolong balas
karthikPabab Alagu
4
Metode ini harus berupa fungsi C inline, bukan Objective-C. Terlalu mudah untuk menemukan dan mem-bypass metode Objective-C, terutama jika Anda menyebutnyaisJailbroken
progrmr
2
@Yossi apakah perangkat penutup ini di-jailbreak menggunakan Taig?
Lakshay
3
@Lakshay Saya tidak tahu .. Anda lebih dari diundang untuk memeriksa dan menambahkan di sini jawaban :)
Yossi
54
+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}

Memeriksa jalur file /Applications/Cydia.apptidak 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:

Mark Johnson
sumber
1
Ini adalah cara yang bagus untuk memeriksa, dan itu tidak pergi ke luar kotak pasir Anda. Tentu, jika jailbreaker tidak menginstal Cydia, itu akan mengembalikan TIDAK, tapi saya pikir sebagian besar Jailbreak menginstal Cydia.
Wim Haanstra
dapatkah string ini tidak diubah ketika aplikasi di-crack?
NSRover
8
Untuk iOS9.0 + Anda juga perlu menambahkan kunci LSApplicationQueriesSchemes dalam daftar aplikasi. Kalau tidak, canOpenURL akan selalu mengembalikan false.
David V
1
Ini akan memberikan false-positive jika pengguna menginstal aplikasi yang sesuai dengan skema cydia: // seperti InstantTV.
thattyson
@ terima kasih terima kasih! Saya mencari tahu mengapa saya mendapatkan hasil positif palsu
rickrvo
52

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.

Greg
sumber
13
Bisakah Anda mendapatkan (sub-) executable yang tanda tangannya tidak valid seperti itu melalui App Store?
fbrereto
34
Mungkin banyak hal telah berubah tetapi tidakkah mengeksekusi executable terpisah mencegah Anda dari disetujui ke app store?
Peter Zich
4
Bisakah seseorang menjawab sebelum komentar? Ini pertanyaan penting.
Petr
Tidak ada yang benar-benar akan menghentikan Anda dari menulis Mach-O ke disk dengan tanda tangan yang tidak valid. Namun, saya tidak setuju dengan jawaban bahwa memeriksa bahwa kernel rusak tidak terlibat atau bahwa ini adalah pemeriksaan definitif dengan cara apa pun.
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
}
Richard J. Ross III
sumber
Itu solusi yang bagus, tetapi xCon dan alat lain seperti itu dapat dengan mudah melewati pemeriksaan ini. Jadi, saya mencari solusi yang lebih baik.
Alexei Robsky
7
@AlexeiRobsky tidak ada solusi yang sempurna. Akan selalu ada seseorang yang akan menemukan cara untuk melewati perlindungan Anda, itu hanya fakta.
Richard J. Ross III
14

Anda dapat mendeteksi apakah suatu perangkat adalah JailBroken atau tidak dengan memeriksa yang berikut ini:

  • Cydia diinstal
  • Verifikasi beberapa jalur sistem
  • Lakukan pemeriksaan integritas kotak pasir
  • Lakukan verifikasi symlink
  • Verifikasi apakah Anda membuat dan menulis file di luar Sandbox Anda

Ada perpustakaan open source yang saya buat dari berbagai artikel dan buku. Cobalah di GitHub !

pengguna3088680
sumber
14

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
}
Alex Peda
sumber
6

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.

Maxthon Chan
sumber
Apakah Anda memiliki tautan tentang seperti apa perpustakaan MobileSubstrate / CydiaSubstrate? Saya tidak punya ponsel yang sudah di-jailbreak untuk dimainkan sehingga saya mengemudi "buta" dan pencarian Google pada dasarnya muncul dengan komentar Anda di atas.
chadbag
@chadbag Saya tidak punya satu juga, tetapi Anda dapat mencari debfile MobileSubstrate, membongkar dan blacklist (hampir) semua .dylibitu dikemas.
Maxthon Chan
Terima kasih, saya menemukan beberapa kode dan saya dapat menambahkan beberapa hal lagi berdasarkan komentar Anda. Terimakasih banyak!
chadbag
4

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.

Penjual Walt
sumber
4

Coba jalankan kode yang tidak ditandatangani melalui aplikasi Anda.

Perangkat yang di-jailbreak biasanya memiliki karakteristik sebagai berikut:

  • jalankan kode yang tidak ditandatangani
  • telah menginstal Cydia
  • memiliki file jailbreak
  • akses penuh r / w ke seluruh sistem file
  • beberapa file sistem akan telah dimodifikasi (konten dan sha1 tidak cocok dengan file asli)
  • macet ke versi tertentu (versi jailbreakable)

Hanya memeriksa keberadaan file untuk deteksi jailbreak pasti gagal. Pemeriksaan ini mudah dilewati.

kurapixel
sumber
3
Mencoba mengeksekusi kode yang tidak ditandatangani akan membuat aplikasi Anda ditolak dari appstore
Frederic Yesid Peña Sánchez
4

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.

DevC
sumber
3

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.

Gordon Wilson
sumber
18
ssh tidak pernah diinstal secara otomatis, pengguna harus menginstalnya sendiri.
Berikan Paul
1
Saya belum benar-benar mengikuti adegan jailbreak. Tapi seingat saya, ketika saya menulis ini (Jan '09), Ziphone dan yang lainnya menginstal ssh dan subsistem bsd secara default. Mungkin itu tidak benar lagi.
Gordon Wilson
12
percayalah ketika saya mengatakan bahwa chpwn telah mengikuti adegan jailbreak.
Jalur Winfield
3

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

Ilam
sumber
3

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/"];
}
karim
sumber
2
Apple menyetujui aplikasi Anda yang berisi kode di atas?
karthikPrabhu Alagu
3

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()
            }
        }
    }
}
Paritosh Pawar
sumber
1

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)
Sanjeevcn
sumber
-2

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

aker
sumber
3
Jawaban ini akan lebih menarik dengan kode sumber. IMHO: Ini akan memberi Anda upvote.
Johan Karlsson
5
-1 = Perangkat yang tidak rusak dapat juga membuka dan membaca file ini. (Diuji)
frankish
@JohanKarlsson Saya berasumsi bahwa pembaca di sini dapat menulis kode sumber mereka sendiri. Jika mereka tidak bisa - apa yang mereka lakukan di sini?
gnasher729