苹果拒绝越狱检测的应用程序

我们正在处理的应用被拒绝了,因为审核过程中的设备被检测为越狱^^

为了检测越狱设备,进行了几项测试:

NSString* bundlePath = [[NSBundle mainBundle] bundlePath];

// scan for itunes metadata
BOOL isDirectory = NO;
NSString* directoryPath = [bundlePath stringByAppendingPathComponent:@"SC_Info/"];
BOOL directoryIsAvailable = [[NSFileManager defaultManager] fileExistsAtPath:directoryPath isDirectory:&isDirectory];
BOOL contentSeemsValid = ([[[NSFileManager defaultManager] contentsOfDirectoryAtPath:directoryPath error:NULL] count] == 2);
if (directoryIsAvailable && contentSeemsValid) {
    return YES;
}
contentSeemsValid = [[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/iTunesMetadata.​plist", bundlePath]];
if (contentSeemsValid) {
    return YES;
}

// scan for cydia app
NSURL* testURL = [NSURL URLWithString:@"cydia://"];
if ([[UIApplication sharedApplication] canOpenURL:testURL]) {
    return YES;
}

// scan for paths available
NSArray* paths = @[@"/Applications/Cydia.app", @"/Applications/RockApp.app", @"/Applications/Icy.app", @"/usr/sbin/sshd", @"/usr/bin/sshd", @"/private/var/lib/apt", @"/private/var/lib/cydia", @"/private/var/stash", @"/usr/libexec/sftp-server"];
for (NSString* string in paths) {
    if ([[NSFileManager defaultManager] fileExistsAtPath:string]) {
        return YES;
    }
}

// scan for forking
int forkValue = fork();
if (forkValue >= 0) {
    return YES;
}

// try to write in private space
NSString* testString = @"test";
NSError* error = nil;
[testString writeToFile:@"/private/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
    return YES;
}

// seems not jailbroken
return NO;

这些测试中的一个(或多个)在Apple用于审查的设备上返回YES,但不包括我们的DevDevices。 它可能是哪一个? 有人知道更多关于Apple用于评论的设备的详细信息吗? 任何提示或其他猜测? (应用程序的上下文是医院中的HealthCare,因此我们需要确保患者数据已保存)

最好的祝福,
Zeek


从https://www.theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection

虽然应用程序可以通过无数种方式实现对越狱设备的检查,但通常归结为以下几点:

目录的存在 - 检查你的文件系统中是否存在 /Applications/Cydia.app//private/var/stash等路径。 大多数情况下,这些都是在-(BOOL)fileExistsAtPath:(NSString*)path使用-(BOOL)fileExistsAtPath:(NSString*)path方法进行NSFileManager ,但更NSFileManager应用程序喜欢使用fopen()stat()access()等更低级别的C函数。

目录权限 - 使用NSFileManager方法以及像statfs()这样的C函数检查特定文件和目录的Unix文件权限。 更多的目录在越狱设备上的访问权限比在监狱中的访问权限要高。

进程分叉 - sandboxd不会拒绝App Store应用程序使用fork()popen()或任何其他C函数在非越狱设备上创建子进程的能力。 sandboxd明确拒绝jail设备上的进程分叉。 如果您在fork()上检查返回的pid,则您的应用程序可以判断它是否已成功分叉,此时它可以确定设备的越狱状态。

SSH环回连接* - 由于大部分已安装OpenSSH的越狱设备,一些应用程序将尝试连接到端口22上的127.0.0.1。如果连接成功,则意味着OpenSSH已安装并在设备上运行,因此它已经越狱了。

system() - 在jail中的设备上使用NULL参数调用system()函数将返回0; 在越狱设备上做同样的事情将返回1.这是因为该功能将检查/bin/sh是否存在,而这仅仅是在越狱设备上的情况。

dyld函数 - 迄今为止最难以解决的问题。 调用像_dyld_image_count()_dyld_get_image_name()函数来查看当前加载了哪些dylib。 很难修补,因为修补程序本身就是dylibs一部分。

*只有极少数的应用程序执行此操作(因为它不如其他操作系统有效)

这些方法似乎不太可能被苹果拒绝,并且使用起来非常简单。

以上段落为简洁起见进行了编辑

链接地址: http://www.djcxy.com/p/80481.html

上一篇: App with jailbreak detection rejected by Apple

下一篇: Using conditions inside templates