这个问题在这里已有答案:
我刚刚发布了我的iOS应用程序,但我不确定如何让我的应用程序安全不被jailbrakers使用。
我可以做些什么来阻止我的应用程序在越狱设备上工作吗?
您可以通过代码检测应用程序是否在监狱设备上运行。通过这种方式,您可以弹出警报并关闭应用程序。你可以做任何你想做的事。这是一个教程:
http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html
这是一个Stack Overflow帖子:
How do I detect that an iOS app is running on a jailbroken phone?
此外,如果您想要一个完整的解决方案,您可以在tapjoy sdk代码中看到。他们正在检测已越狱的iPhone。这是tapjoy网址https://www.tapjoy.com/
SWIFT 3:
func hasJailbreak() -> Bool {
#if arch(i386) || arch(x86_64)
print("Simulator")
return false
#else
return FileManager.default.fileExistsAtPath("/private/var/lib/apt")
#endif
}
没有办法检测设备是否已越狱。
考虑到即使有,该设备已经越狱,这意味着任意代码执行是可能的,并且越狱者只会修改您用来表示该设备未被越狱的任何检测方法。
参考:https://forums.developer.apple.com/thread/43073
学分回到Apple员工那里回答了同样的问题
检查这些路径
+ (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;
}
尝试找到cydia或越狱设备创建的文件。或者尝试在应用程序的黑盒子外写一个文件。如果你成功了,那么该设备会遭到入侵/越狱:)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
-(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
}
您可以通过检查以下内容来检测设备是否为jailBroken
我从各种文章和书籍中创建了an open source library,试一试。
基于@ karim的回答继承了一个稍微修改过的快速版本:
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
}
即使你的设备被越狱,ipa应用程序也只能访问他们自己的沙盒,所以如果设备要么越狱,你的方法将返回NO :)寻找另一种方式另外如果你尝试访问某个地方,但你的沙盒发布应用程序appstore可能会遇到问题
/**
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技术将不起作用。
检查它的一个好方法是看看我们是否可以修改应用程序包之外的其他位置的文件。
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];
}
在下面的网址中找到更多技巧