IOS用のアプリをリリースしましたが、脱獄者がアプリを使用しないようにする方法がわかりません。
ジェイルブレイクされたデバイスでアプリが動作しないようにするために何かできますか?
アプリが刑務所で壊れたデバイスで実行されているかどうかをコードで検出できます。その方法で、アラートをポップアップしてアプリを閉じることができます。やりたいことは何でもできます。チュートリアルは次のとおりです。
http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html
そして、これがStack Overflowの投稿です:
ジェイルブレイクした携帯電話でiOSアプリが実行されていることを検出するにはどうすればよいですか?
また、完全なソリューションが必要な場合は、tapjoy SDKコードで確認できます。彼らはジェイルブレイクしたiPhoneを検出しています。これがtapjoy URLです https://www.tapjoy.com/
これらのパスを確認してください
+ (BOOL)isJailBroken {
#ifdef TARGET_IPHONE_SIMULATOR
return NO;
#endif
NSArray *paths = @[@"/bin/bash",
@"/usr/sbin/sshd",
@"/etc/apt",
@"/private/var/lib/apt/",
@"/Applications/Cydia.app",
];
for (NSString *path in paths) {
if ([self fileExistsAtPath:path]) {
return YES;
}
}
return NO;
}
+ (BOOL)fileExistsAtPath:(NSString *)path {
FILE *pFile;
pFile = fopen([path cStringUsingEncoding:[NSString defaultCStringEncoding]], "r");
if (pFile == NULL) {
return NO;
}
else
fclose(pFile);
return YES;
}
さらに、見てみることができます https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalSDK/Source/OneSignalJailbreakDetection.m
Cydiaまたはジェイルブレイクされたデバイスが作成するファイルを見つけてください。または、アプリのブラックボックス外のファイルに書き込もうとします。あなたがそれを成功させると、デバイスは危殆化/ジェイルブレイクされます:)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
デバイスがjailBrokenかどうかを検出するには、次をチェックします。
オープンソースライブラリ があります。さまざまな記事や書籍から作成しました。試してみてください。
@karimの答えに基づいて、ここで少し修正したSwiftバージョン:
func hasJailbreak() -> Bool {
#if Arch(i386) || Arch(x86_64)
println("Simulator")
return false
#else
var fileManager = NSFileManager.defaultManager()
if(fileManager.fileExistsAtPath("/private/var/lib/apt")) {
println("Jailbroken Device")
return true
} else {
println("Clean Device")
return false
}
#endif
}
-(BOOL) isJailbroken
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
FILE *f = fopen("/bin/bash", "r");
if (errno == ENOENT)
{
// device is NOT jailbroken
fclose(f);
NSLog(@"no");
return NO;
}
else {
// device IS jailbroken
fclose(f);
NSLog(@"yes");
return YES;
}
#endif
}
デバイスがジェイルブレイクされている場合でも、ipaアプリケーションは自分のサンドボックスにしかアクセスできないため、デバイスがジェイルブレイクされているかどうかにかかわらず、メソッドはNOを返します:)別の方法を探してくださいアプリストアは問題を引き起こす可能性があります
/**
Detect that the app is running on a jailbroken device or not
- returns: bool value for jailbroken device or not
*/
public class func isDeviceJailbroken() -> Bool {
#if Arch(i386) || Arch(x86_64)
return false
#else
let fileManager = FileManager.default
if (fileManager.fileExists(atPath: "/bin/bash") ||
fileManager.fileExists(atPath: "/usr/sbin/sshd") ||
fileManager.fileExists(atPath: "/etc/apt")) ||
fileManager.fileExists(atPath: "/private/var/lib/apt/") ||
fileManager.fileExists(atPath: "/Applications/Cydia.app") ||
fileManager.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") {
return true
} else {
return false
}
#endif
}
ジェイルブレイクされたデバイスを見つけるには多くの方法があります。熟練したハッカーがアプリケーションパスを変更した場合、cydia technicのチェックは機能しません。
それを確認する良い方法は、アプリケーションバンドル外の他の場所にあるファイルを変更できるかどうかを確認することです。
NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES
encoding:NSUTF8StringEncoding error:&error];
if(error==nil){
//Device is jailbroken
return YES;
} else {
//Device is not jailbroken
[[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
}
以下のURLでその他のテクニックを検索してください
デバイスがジェイルブレイクされたかどうかを検出する方法はありません。
たとえあったとしても、デバイスはすでにジェイルブレイクされており、任意のコードの実行が可能であり、ジェイルブレイカーは、デバイスがジェイルブレイクされていないことを通知するために使用する検出方法を変更することを考慮してください。
参照: https://forums.developer.Apple.com/thread/4307
クレジットAppleこの同じ質問に回答したスタッフ
スウィフト3:
func hasJailbreak() -> Bool {
#if Arch(i386) || Arch(x86_64)
print("Simulator")
return false
#else
return FileManager.default.fileExistsAtPath("/private/var/lib/apt")
#endif
}