苹果拒绝越狱检测的应用程序
我们正在处理的应用被拒绝了,因为审核过程中的设备被检测为越狱^^
为了检测越狱设备,进行了几项测试:
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