如果我希望我的应用程序在越狱iPhone上行为不同,我将如何去确定它?如何检测iOS应用程序是否在越狱手机上运行?
回答
这取决于你的越狱意味着什么。在简单情况下,你应该能够看到是否安装Cydia的和由去 - 有点像
NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
// do something useful
}
对于黑客攻击的内核,这是一个有点(很多)更多地参与。
我建议寻找“香草”iPhone上不存在的文件。我见过的所有越狱工具包都安装了ssh。这可能是越狱手机的一个很好的指标。
ssh永远不会自动安装,用户必须自行安装。 – 2010-02-21 07:03:50
我没有真正跟上越狱现场。但是据我记得,当我写这个(2009年1月)时,Ziphone和其他人默认安装了ssh和bsd子系统。也许这不再是事实。 – 2010-03-04 06:06:01
相信我,当我说chpwn跟上了越狱现场。 – 2011-07-14 00:45:02
检查内核是否损坏并不是那么重要。
越狱使内核对已签名代码的签名检查始终报告代码已正确签名,未中断的手机无法运行具有错误签名的代码。
因此,在应用程序中包含一个单独的可执行文件,签名不正确。它可能只是一个具有main()和返回值的3行程序。在没有代码签名的情况下编译可执行文件(在Project Settings-> Build中将其关闭),并使用“codesign”命令行工具使用不同的密钥对其进行签名。
让您的应用程序执行单独的可执行文件。如果你的程序在运行带有坏信号的单独可执行文件时无法获得返回值,那么它肯定会被监禁。如果单独的可执行文件返回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
}
我不知道有任何“API”存在这个。如果有的话,那么一个越狱屏蔽产品会很快覆盖它们。
很多人指出,这是一个猫捉老鼠的游戏。在双方都成为专家之后,这一切都归结为谁是第一步。 (持有该设备的人)
我发现了许多关于在Zdziarski的新书“Hacking and Securing iOS Apps”中检测越狱的好建议。 (就我个人而言,我为O'Reilly电子书支付更多费用,因为他们允许复制粘贴。)
不,我不隶属于出版商。但我确实发现它是一本好书。我不喜欢发布黑客的错误,以便他们能够修复它们,所以我认为我会指出这本书。
尝试访问/Application/Preferences.app/General.plist 你应该能够在越狱iPhone 在非JB电话做,你将无法访问它
+(BOOL)isJailbroken {
NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
return [[UIApplication sharedApplication] canOpenURL:url];
}
在普通电话上不允许检查文件路径/Applications/Cydia.app
?我从来没有听说过苹果检测到这一点,并拒绝为它的应用程序,但苹果是不可预知的。苹果蠹具有a URL scheme cydia://可与UIApplication的canOpenURL:
在法律上查了一下,我们所做的是,我们已经有一个RSS feed与我们的用户(Stocks Live)进行交流,我们把,指出这样的一条新闻:
一些越狱设备有问题bla bla bla,我们做了一个黑客来解决这些问题,但我们需要知道,如果这是一个越狱设备,请按这里,所以该应用程序修复这个问题。如果您恢复正常,即删除越狱,请按此处。
然后你处理用户交互,做什么是适当的,喜欢表现不同等...
试图找到其中的Cydia越狱或设备创建一个文件。或者尝试在应用程序黑盒外的文件中写入。如果你成功做到这一点,该设备是妥协/越狱:)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
尝试通过您的应用程序执行未签名的代码。
越狱设备通常具有以下特点:
- 运行未签名代码
- 有Cydia中安装
- 有越狱文件
- 全R/W访问整个文件系统
- 一些系统文件将被修改(内容,所以sha1与原始文件不匹配)
- 卡住sp (越狱版)
只是检查越狱检测文件的存在是注定要失败。 这些检查很容易绕过。
我知道的最复杂的方法是使用objc_copyImageNames()
函数。它返回当前加载的库的列表,并且由于大多数人在越狱设备上都有MobileSubstrate,并且大多数iAP破解工具都依赖于它,所以至少会显示一些MobileSubstrate库。
您可以检测设备是否越狱或不通过检查以下内容:
- Cydia中安装
- 验证系统的一些路径
- 执行沙箱完整性检查
- 执行符号链接验证
- 验证您是否在Sandbox外部创建和写入文件
我从各种文章和书籍中创建了一个开源库。 Try it out on GitHub!
这是结合了一些答案,我发现了这个话题的代码,并给你更高的成功率:
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;
}
一些常见的文件来检查: /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
苹果蠹相关的文件大多数检查。
你将要下一个移动的目标,但你可以试试下面这些资源的进度看你的技术如何有效的是:
我在Swift 2.3中重做了@Yossi提供的解决方案
public static func jailbroken(application: UIApplication) -> Bool {
guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return isJailbroken() }
return application.canOpenURL(cydiaUrlScheme) || isJailbroken()
}
static func isJailbroken() -> Bool {
if isSimulator {
return false
}
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath("/Applications/Cydia.app") ||
fileManager.fileExistsAtPath("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
fileManager.fileExistsAtPath("/bin/bash") ||
fileManager.fileExistsAtPath("/usr/sbin/sshd") ||
fileManager.fileExistsAtPath("/etc/apt") ||
fileManager.fileExistsAtPath("/usr/bin/ssh") {
return true
}
if canOpen("/Applications/Cydia.app") ||
canOpen("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
canOpen("/bin/bash") ||
canOpen("/usr/sbin/sshd") ||
canOpen("/etc/apt") ||
canOpen("/usr/bin/ssh") {
return true
}
let path = "/private/" + NSUUID().UUIDString
do {
try "anyString".writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
try fileManager.removeItemAtPath(path)
return true
} catch {
return false
}
}
static func canOpen(path: String) -> Bool {
let file = fopen(path, "r")
guard file != nil else { return false }
fclose(file)
return true
}
- 1. 运行应用程序在越狱iphone
- 2. 在越狱手机上杀应用程序
- 3. 如何检测用户是否在越狱设备上退出ios应用程序
- 4. 如何检查SSH是否安装在越狱手机上? Objective C
- 5. 越狱测试应用程序iPhone
- 6. 检查应用程序是否安装或没有越狱iOS设备
- 7. 如何在越狱iphone上运行简单的HelloWorld程序?
- 8. Windows Phone检查手机是否越狱或植入?
- 9. 背景为越狱手机iPhone应用程序
- 10. 检测设备是否越狱或Xamarin iOS没有
- 11. iOS - 未能在非越狱设备上安装应用程序
- 12. 在已经越狱的iPad上启动应用程序。 (iOS)
- 13. android如何检测应用程序是否在过去运行
- 14. 检测我的应用程序是否在电话上运行
- 15. 在iOS 9.3.3运行应用越狱具有root访问权限
- 16. 如何检测我的应用程序是否在Heroku上运行?
- 17. 如何检测iPhone应用程序是否在iPhone 4设备上运行?
- 18. Qt - 如何检测应用程序是否在GNOME或KDE上运行?
- 19. 如何在手机上运行加载功能/ jquery mobile iOS应用程序
- 20. 如何在手机上运行简单的android应用程序?
- 21. 如何在智能手机应用程序上运行网站?
- 22. 越狱应用程序开发构建和运行应用程序
- 23. 如何以编程方式检测“Android应用程序”是在Chrome书籍还是在Android手机中运行
- 24. 如何从Mac上的终端检查iPhone是否越狱?
- 25. 检查某个特定应用程序是否在运行iOS?
- 26. 如何检测我的应用程序是否正在运行EarlGrey测试?
- 27. 越狱设备上测试iOS应用(iPhone 3G)
- 28. 如何检测远程计算机是否正在运行RDP?
- 29. 检测应用程序是否在开发模式下运行
- 30. 如何检测Android手机是否安装了特定的应用程序?
在沙箱外寻找_any_文件/目录不够吗?像/ etc一样? – 2009-08-01 04:53:02
请注意,并非所有用户都安装了Cydia - 这不是一个很好的检查,而应该检查/ bin/bash/all/users /将会拥有的东西。 – 2010-02-21 07:03:21
apt在哪里存储它的信息?或者我可以只调用一个system()命令并找出答案。我想知道他们是否有特定的应用程序,如果他们有这些应用程序,那么应该限制应用程序 – conradev 2010-03-06 20:16:31