ジェイルブレイクされた iPhone でアプリの動作を変更したい場合、どのように判断すればよいでしょうか?
18 に答える
脱獄の意味によって異なります。単純なケースでは、Cydiaがインストールされているかどうかを確認して、それを実行できるはずです-次のようなものです
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// do something useful
}
ハッキングされたカーネルの場合、少し (かなり) 複雑になります。
これは、このニーズに対して私が見つけたいくつかの回答を組み合わせたコードであり、はるかに高い成功率が得られます。
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;
}
+(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:
カーネルが壊れているかどうかをチェックすることは、それほど複雑ではありません。
ジェイルブレイクにより、署名されたコードのカーネルの署名チェックで、コードが正しく署名されていることが常に報告されます。壊れていない電話では、署名の悪いコードを実行できません。
そのため、署名が不適切な別の実行可能ファイルをアプリに含めます。main()と戻り値を持つ3行のプログラムである可能性があります。コード署名なしで実行可能ファイルをコンパイルし([プロジェクト設定]-> [ビルド]でオフにします)、「codesign」コマンドラインユーティリティを使用して別のキーで署名します。
アプリに別の実行可能ファイルを実行させます。悪いsigで別の実行可能ファイルを実行しているときにプログラムが戻り値を取得できない場合、それは間違いなく投獄されています。別の実行可能ファイルがA-OKを返す場合、電話は間違いなくジェイルブレイクされています。
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
}
以下を確認することで、デバイスがジェイルブレイクされているかどうかを検出できます。
- Cydiaがインストールされています
- システム パスの一部を確認する
- サンドボックスの整合性チェックを実行する
- シンボリックリンクの検証を実行する
- サンドボックス外でファイルを作成して書き込むかどうかを確認する
さまざまな記事や本から作成したオープン ソース ライブラリがあります。GitHub で試してみてください。
アプリケーションを介して署名されていないコードを実行してみてください。
ジェイルブレイクされたデバイスには通常、次の特徴があります。
- 署名されていないコードを実行する
- Cydiaがインストールされています
- 脱獄ファイルがあります
- ファイルシステム全体への完全な読み書きアクセス
- 一部のシステム ファイルが変更されます (内容と sha1 が元のファイルと一致しません)。
- 特定のバージョンにこだわる (脱獄可能なバージョン)
脱獄検出のためにファイルの存在をチェックするだけでは、失敗する運命にあります。これらのチェックは簡単に回避できます。
チェックする一般的なファイル:
/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 関連のファイルをチェックします。
このために存在する「API」については知りません。もしあれば、脱獄マスキング製品はすぐにそれらを覆い隠します.
多くの人が指摘するように、これはいたちごっこゲームです。そして、両方のプレイヤーがエキスパートになった後は、どちらが先手を取るかがすべてです。(デバイスを持っている人。)
Zdziarski の新しい本「Hacking and Securing iOS Apps」で脱獄を検出するための多くの良い提案を見つけました。(個人的には、O'Reilly の eBook には、コピー アンド ペーストが許可されているため、より多くの金額を支払いました。)
いいえ、私は出版社と提携していません。でも良い本だと思いました。ハッカーの間違いを公開して修正してもらうのは好きではないので、この本を紹介しようと思いました。
Cydia またはジェイルブレイクされたデバイスが作成するファイルを探してみてください。または、アプリのブラックボックス外のファイルに書き込んでみてください。これに成功した場合、デバイスは侵害/ジェイルブレイクされています:)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
「普通の」iPhone には存在しないファイルを探すことをお勧めします。私が見た脱獄キットはすべてsshをインストールします。これは、ジェイルブレイクされた電話の良い指標かもしれません.
/Application/Preferences.app/General.plist にアクセスしてみてください ジェイルブレイクされた iPhone でアクセスできます Jb 以外の電話ではアクセスできません アクセスできません