7

デバイスがジェイルブレイクされている (つまり、署名されていないコードの実行を許可する) かどうかをテストするために、iOS デバイスで署名されていない実行可能ファイルを実行するための安定した方法が必要です。

基本的に何もしない小さな実行可能ファイルを作成しました。

int main(int argc, char *argv[]) {
    return 23;
}

iOSデバイスでコンパイルして正常に実行しました(ジェイルブレイクされているかどうかに関係なく)。

次に、この実行可能ファイルをアプリ バンドルに追加し、アプリを iOS デバイスに展開しました。

これにより、デバイス上の実行可能ファイルの読み取り専用バージョンが作成されます。このファイルを chmod して実行権限を付与しようとしましたが、失敗したため、アプリの tmp ディレクトリにコピーし、実行権限で chmod できました。

他の質問では、execve を使用して実行可能ファイルを呼び出すことが提案されていますが、これにより実行中のプロセスが新しいプロセスに置き換えられ、アプリが強制終了されます。Fork() は常に失敗するため、これはオプションではありません。System() にはシェルが必要であり、署名されていないコードを実行できるシェルなしで脱獄することは可能です。Popen() はフォークするため、機能しません。

興味深いことに、私が発見したことから、通常のデバイスで実行可能ファイルに対して execv を呼び出すと、「操作は許可されていません」というエラーが発生しますが、ジェイルブレイクされたデバイスで呼び出すと、「許可が拒否されました」というエラーが発生します。これだけでも、ジェイルブレイクの検出には機能しますが、execv の続行が許可されているジェイルブレイクが発生した場合、プロセスが置き換えられるため、アプリはすぐにクラッシュします。

thisによると、iBooks はこれを行う脱獄検出を実行しますが、fairplayd バイナリを使用して execve 呼び出しを実行しているようです。

実行可能ファイルを実行するか、fairplayd を使用するための提案はありますか?

4

1 に答える 1

3

アプリのインストール後にアプリのリソースを変更できないため、テスト実行可能ファイルの権限を直接変更することはできません。それはセキュリティホールになります。そのため、それをtmp / caches / documentディレクトリにコピーして、実行可能にする必要があります。

アプリがマルチタスクをサポートする必要があるかどうか、最初の実行の開始時にジェイルブレイクを検出する必要があるかどうか、またはアプリが閉じるまで待つことができるかどうかはわかりません。ただし、マルチタスクをオフにできる場合は、このメソッド(testこの例では小さな実行可能ファイル)を実装できます。

- (void)applicationWillTerminate:(UIApplication *)application {
    NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent: @"test"];
    int result = execlp([path UTF8String], [path UTF8String], NULL);
    // if we got here, then the attempt to run the external process failed, so make a note of this:
    [[NSUserDefaults standardUserDefaults] setValue: [NSNumber numberWithBool: NO] forKey: @"is_jailbroken"];
    NSLog(@"test returns %d", result);
}

呼び出しが成功するexeclp()と、はい、プロセスが置き換えられます。しかし、プロセスはとにかくシャットダウンしようとしています。これを行うと、実際のクラッシュログが表示されないため、Appleがこれについて文句を言うかどうかはわかりません。ユーザーにクラッシュするようには見えません。

別のプロセスを実行できない場合、アプリはコード行に進みます。これにより、電話が明らかにジェイルブレイクされていないという事実をログに記録できます。これは、次にアプリを起動したときに記録できます。

マルチタスクをサポートする必要がある場合は、上記のコードをのようなマルチタスクコールバックに入れてみてくださいapplicationDidEnterBackground:。電話が正常な場合、exec呼び出しは失敗(および戻り)するため、アプリは終了(終了)しません。私は(?)Appleのレビュアーはジェイルブレイクされた電話であなたのアプリをテストしないと思います。ジェイルブレイクされた電話を持っている人の場合、アプリはバックグラウンドに入るのではなく、終了します。多分それはあなたのニーズに十分ですか?

また、参考までに、ジェイルブレイクされたシステムをテストする方法は他にもありますが、おそらくかなり信頼できます(ジェイルブレイクされた電話を100%検出できるようにするか、標準のジェイルブレイクされた構成を検出できるようにするかはわかりません)。

iPhoneがプログラムで刑務所に入れられているかどうかを判断する

iOSアプリがジェイルブレイクされた電話で実行されていることを検出するにはどうすればよいですか?

于 2012-09-01T08:38:02.117 に答える