脱獄した電話でiOSアプリが実行されていることを検出するにはどうすればよいですか?


167

ジェイルブレイクされたiPhoneでアプリの動作を変更したい場合、これをどのように判断しますか?


移動するターゲットをフォローしますが、これらのリソースの進捗状況をフォローして、テクニックの効果を確認してみてください。- theiphonewiki.com / wiki/Bypassing_Jailbreak_Detection-theiphonewiki.com
Michael Bishop

回答:


90

それはあなたが脱獄とはどういう意味かによって異なります。単純なケースでは、Cydiaがインストールされているかどうかを確認し、それを実行できるはずです。

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

ハッキングされたカーネルの場合、少し(かなり)複雑になります。


17
探しには十分ではないでしょう任意のサンドボックス外のファイル/ディレクトリ?/ etcのように?
Rhythmic Fistman、2009

58
すべてのユーザーにCydiaがインストールされているわけではないことに注意してください。これは適切なチェックではありません。/all/users / will /が持つ/ bin / bashなどをチェックする必要があります。
Grant Paul、

2
aptはどこに情報を保存しますか?または、system()コマンドを呼び出して調べることもできます。彼らが特定のアプリを持っているかどうか、そしてそれらを持っている場合はアプリを制限したい
conradev

2
@RazorSharpこの時点で、ほとんどすべてのユーザーがCydiaを持っています。たぶん、それを今チェックするだけで十分でしょう。ただし、100%信頼できるチェックが必要な場合は、以下のようにカーネルベースのチェックを使用する必要があります。
Grant Paul

1
FWIWファイルチェックはバイパスするのは簡単です。mobilesubstrateを使用してフックしfileExistsAtPath:NOチェックした特定のパスに戻るようにすることができます。
toasted_flakes 2014年

55

これは、このニーズに対して私が見つけたいくつかの回答を組み合わせたコードであり、はるかに高い成功率を提供します。

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、これは私が見つけたいくつかの回答を組み合わせたものです。それらのいくつかは私のために機能しませんでしたが、他のために機能しました..したがって、このコードを使用してもチャンスはありません。パフォーマンスに関しては、あなたは、各実行時に一度だけ、それを実行することができますし、回答のどこかに保存して、あなたはそれを毎回実行する必要はありません...
ヨッシ

3
@yossiとporizm appleが上記のコードを含むアプリを承認しましたか?返信してください
karthikPrabhu Alagu

4
このメソッドは、Objective-C ではなく、インラインC関数にする必要があります。Objective-Cメソッドを発見してバイパスするのは簡単です。特に、それを呼び出す場合はそうですisJailbroken
progrmr

2
@YossiこれはTaigを使用してジェイルブレイクされたデバイスをカバーしますか?
Lakshay、

3
@Lakshayわからない..確認して、ここに回答を追加してください:)
Yossi

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

ファイルパスの確認は/Applications/Cydia.app通常の電話では許可されていませんか?Appleがこれを検出してアプリを拒否することは聞いたことがありませんが、Appleは予測不可能です。Cydia のURLスキームcydia:// は、UIApplicationで合法的に確認できます。canOpenURL:


1
これはチェックするのに最適な方法であり、サンドボックスの外には出ません。確かに、ジェイルブレーカーにCydiaがインストールされていない場合は、NOが返されますが、ほとんどのジェイルブレイクはCydiaをインストールすると思います。
Wim Haanstra、2013

アプリがクラックされたときにこの文字列を変更できないのでしょうか?
NSR、2015

8
iOS9.0以降の場合、アプリのリストにLSApplicationQueriesSchemesキーを追加する必要もあります。それ以外の場合、canOpenURLは常にfalseを返します。
David V

1
InstantTVのようなcydia://スキームに準拠したアプリがユーザーにインストールされている場合、これにより誤検知が提供されます。
thattyson

@thattysonありがとう!誤
検知

52

カーネルが壊れているかどうかを確認することは、それほど複雑ではありません。

ジェイルブレイキングは、カーネルの署名済みコードの署名チェックで常にコードが正しく署名されていることを報告します。壊れていない電話は不正な署名のあるコードを実行できません。

そのため、不正な署名のある別の実行可能ファイルをアプリに含めます。main()と戻り値を持つ3行のプログラムの場合もあります。コード署名なしで実行可能ファイルをコンパイルし(プロジェクト設定->ビルドでオフにします)、 "codesign"コマンドラインユーティリティを使用して別のキーで署名します。

アプリに個別の実行可能ファイルを実行してもらいます。不正なsigを使用して別の実行可能ファイルを実行するときにプログラムが戻り値を取得できない場合、それは間違いなく投獄されます。別の実行可能ファイルがA-OKを返す場合、電話は間違いなく脱獄されています。


13
App Storeからそのような署名が無効な(サブ)実行可能ファイルを取得できますか?
fbrereto 2010

34
おそらく何かが変わったが、別の実行可能ファイルを実行しないと、アプリストアへの承認が妨げられないのではないでしょうか。
Peter Zich、2011年

4
誰かがコメントの前に答えることはできますか?これは重要な質問です。
Petr

無効な署名のあるMach-Oをディスクに書き込むのを止める人はいないでしょう。ただし、カーネルが壊れていることを確認することは含まれていない、またはこれが絶対的な確認方法であるという回答には同意しません。
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
}

それは良い解決策ですが、xConやその他のツールはこのチェックを簡単に回避できます。だから、私はより良い解決策を探しています。
Alexei Robsky

7
@AlexeiRobsky完璧な解決策はありません。あなたの保護を回避する方法を見つける誰かが常にいるでしょう、それは単なる事実です。
リチャードJ.ロスIII

14

デバイスがJailBrokenであるかどうかを検出するには、次のことを確認します。

  • Cydiaがインストールされている
  • 一部のシステムパスを確認する
  • サンドボックスの整合性チェックを実行する
  • symlink検証を実行する
  • サンドボックスの外部でファイルを作成して書き込むかどうかを確認する

さまざまな記事や本から作成したオープンソースライブラリがあります。GitHubでお試しください


14

@Yossiが提供するソリューションをSwift 2.3で作り直しました

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

私が知っている最も洗練された方法は、objc_copyImageNames()関数を使用することです。現在ロードされているライブラリのリストを返します。ジェイルブレイクしたデバイスにMobileSubstrateがあり、ほとんどのiAPクラックツールがそれに依存しているため、少なくともいくつかのMobileSubstrateライブラリが表示されます。


MobileSubstrate / CydiaSubstrateライブラリがどのように見えるかについてのリンクはありますか?ジェイルブレイクした携帯電話で遊んでいないので、「盲目」になり、基本的にGoogle検索で上記のコメントが表示されます。
chadbag 2014年

@chadbag私もどちらも持っていませんがdeb、MobileSubstrate のファイルを探して解凍し、(ほとんど)すべてをブラックリスト.dylibに詰めることができます。
Maxthon Chan 2014

おかげで、私はいくつかのコードを理解しました、そしてあなたのコメントに基づいていくつかのものを追加するかもしれません。どうもありがとう!
chadbag 2014年

4

このために存在する「API」については知りません。もしあれば、脱獄マスキング製品はすぐにそれらを覆い隠すでしょう。

多くの人が指摘するように、それは猫とマウスのゲームです。そして、両方のプレイヤーがエキスパートになった後、すべては最初の動きを誰が得るかにかかっています。(デバイスを持っている人。)

Zdziarskiの新しい本「iOSアプリのハッキングと保護」で脱獄を検出するための多くの良い提案を見つけました。(個人的には、コピーアンドペーストが許可されているため、O'ReillyのeBookにもっと支払った。)

いいえ、私は出版社と提携していません。しかし、私はそれが良い本だと思いました。ハッカーの過ちをただ公開して、彼らがそれを修正できるようにするのは好きではないので、私はこの本を指すと思いました。


4

アプリケーションを介して署名されていないコードを実行してみてください。

ジェイルブレイクされたデバイスには通常、次の特性があります。

  • 署名されていないコードを実行する
  • Cydiaがインストールされている
  • 脱獄ファイルがあります
  • ファイルシステム全体への完全なr / wアクセス
  • 一部のシステムファイルが変更されます(コンテンツのため、sha1は元のファイルと一致しません)
  • 特定のバージョン(脱獄可能なバージョン)に固執

ジェイルブレイク検出のためにファイルの存在を確認するだけでは失敗する運命にあります。これらのチェックは簡単に回避できます。


3
署名されていないコードを実行しようとすると、アプリがアプリストアから拒否されます
Frederic

4

チェックするいくつかの一般的なファイル: /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関連ファイルをチェックします。


3

「バニラ」iPhoneにはないファイルを探すことをお勧めします。私が見たすべての脱獄キットはsshをインストールします。それは、ジェイルブレイクされた電話の良い指標かもしれません。


18
sshは自動的にはインストールされません。ユーザーが自分でインストールする必要があります。
Grant Paul、

1
私は脱獄シーンに追いついていません。しかし、覚えているように、私がこれを書いたとき(2009年1月)、Ziphoneなどはデフォルトでsshとbsdサブシステムをインストールしました。おそらくそれは本当ではありません。
Gordon Wilson

12
chpwnが脱獄シーンに追いついていると言ったら、私を信頼してください。
ウィンフィールドトレイル

3

私たちが行ったことは、ユーザーと通信するためのRSSフィードがすでにあることです( Stocks Live)が次のようなニュース項目を配置することです。

ジェイルブレイクされたデバイスには問題が発生します。問題を解決するためにハッキングを行いましたが、これがジェイルブレイクされたデバイスかどうかを知る必要があります。アプリを押して問題を修正してください。通常に戻る場合、つまり脱獄を解除する場合は、ここを押してください。

次に、ユーザーインタラクションを処理し、異なる動作などの適切な処理を行います。


3

Cydiaまたはジェイルブレイクされたデバイスが作成するファイルを見つけてみてください。または、アプリのブラックボックスの外にあるファイルに書き込んでみてください。それに成功した場合、デバイスは危険にさらされている/脱獄されています:)

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

2
上記のコードを含むアプリをアップルが承認しましたか?
karthikPrabhu Alagu 2015

3

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

これが私の解決策です:ステップ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)

-2

/Application/Preferences.app/General.plistにアクセスしてみます脱獄したiPhoneでアクセスできるはずですJb以外の電話ではアクセスできません


3
この答えは、ソースコードでさらに興味深いでしょう。私見:これは賛成票を獲得するでしょう。
Johan Karlsson 2013年

5
-1 =ジェイルブレイクされていないデバイスもこのファイルを開いて読み取ることができます。(テスト済み)
フランク語の2013

@JohanKarlsson私はここの読者が自分のソースコードを書くことができると思います。彼らができない場合-彼らはここで何をしていますか?
gnasher729
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.