デバイスがジェイルブレイクされている (つまり、署名されていないコードの実行を許可する) かどうかをテストするために、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 を使用するための提案はありますか?