如何检测越狱手机上正在运行iOS应用程序?


Answers:


90

这取决于您越狱的意思。在简单的情况下,您应该能够查看是否已安装Cydia并进行安装-类似

NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
   // do something useful
}

对于被黑的内核,要多花点功夫。


17
在沙箱之外查找任何文件/目录还不够吗?喜欢/ etc?
节奏拳头09年

58
请注意,并非所有用户都安装了Cydia-这不是一个很好的检查,您应该检查/ all / users / will /是否具有/ bin / bash之类的内容。
格兰特·保罗

2
apt会在哪里存储其信息?或者我可以只调用system()命令并找出答案。我想知道他们是否有某些应用程序,是否有它们,然后限制该应用程序
conradev

2
@RazorSharp此时,几乎所有用户都拥有Cydia。现在检查就足够了。但是,如果您想要100%可靠的检查,则可以使用如下所示的基于内核的检查。
格兰特·保罗

1
FWIW文件检查可以忽略。可以使用mobilesubstrate进行挂钩,fileExistsAtPath:并使其返回NO您检查的特定路径。
toasted_flakes 2014年

55

这是一个结合了我针对此需求找到的一些答案的代码,它将为您带来更高的成功率:

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;
}

1
@Porizm,这只是我找到的一些答案的组合。其中有些对我不起作用,但对其他人有用..因此,使用此代码,您将不会有机会。至于性能,你只能一次在每次运行运行它,并保存答案的地方,你就不必每次运行它..
贝纳

3
@yossi和porizm apple批准了您的包含上述代码的应用程序?请回复
karthikPrabhu Alagu'Feb 18'15

4
此方法应该是内联的C函数,而不是 Objective-C。发现和绕过Objective-C方法太容易了,特别是如果您调用它的话isJailbroken
progrmr

2
@Yossi是否涵盖使用Taig越狱的设备?
Lakshay

3
@Lakshay我不知道..我们非常欢迎您检查并在此处添加答案:)
Yossi

54
+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}

/Applications/Cydia.app普通手机上不允许检查文件路径吗?我从未听说过Apple检测到此问题并拒绝了它的应用程序,但是Apple难以预测。Cydia具有URL方案cydia:// ,可以使用UIApplication对其进行合法检查canOpenURL:


1
这是一种很好的检查方法,并且不会超出您的沙箱。当然,如果越狱者没有安装Cydia,它将返回NO,但是我认为大多数越狱者都安装了Cydia。
Wim Haanstra 2013年

破解应用程序时不能更改此字符串吗?
NSRover

8
对于iOS9.0 +,您还需要在应用程序plist中添加LSApplicationQueriesSchemes键。否则canOpenURL将始终返回false。
David V

1
如果用户安装的应用程序符合InstantTV之类的cydia://方案,则将提供假阳性。
thattyson

@thattyson谢谢!我当时想检查为什么我会得到误报
rickrvo

52

检查内核是否坏了不涉及更多。

越狱使内核对已签名代码的签名检查始终报告代码已正确签名,未中断的电话无法运行签名错误的代码。

因此,请在应用程序中包含签名错误的单独可执行文件。它可能只是一个具有main()和返回值的三行程序。无需代码签名即可编译可执行文件(在“项目设置”->“构建”中将其关闭),并使用“ codesign”命令行实用程序使用其他密钥对其进行签名。

让您的应用执行独立的可执行文件。如果在运行带有错误sig的单独可执行文件时您的程序无法获得返回值,则肯定已入狱。如果单独的可执行文件返回A-OK,则电话肯定越狱了。


13
您能否通过App Store获得签名无效的(子)可执行文件?
fbrereto 2010年

34
也许情况已经变了,但是不会执行单独的可执行文件阻止您被批准进入应用商店吗?
Peter Zich

4
有人可以回答之前的评论吗?这是重要的问题。
彼得

没有人真正阻止您使用无效签名将Mach-O写入磁盘。但是,我不同意这样的答案,即不涉及检查内核是否损坏,或者无论如何这都是确定的检查。
saagarjha

20
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
}

这是一个很好的解决方案,但是xCon和其他类似工具可以轻松绕过此检查。因此,我正在寻找更好的解决方案。
Alexei Robsky'3

7
@AlexeiRobsky没有完美的解决方案。总会有人找到绕过您的保护的方法,这是事实。
理查德·罗斯三世

14

您可以通过检查以下内容来检测设备是否已越狱:

  • Cydia已安装
  • 验证一些系统路径
  • 执行沙盒完整性检查
  • 执行符号链接验证
  • 验证是否在沙盒外部创建和写入文件

我从各种文章和书籍中创建了一个开源库。在GitHub上尝试一下


14

我在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
}

6

我知道最复杂的方法是使用objc_copyImageNames()函数。它返回当前加载的库的列表,并且由于大多数人在越狱设备上具有MobileSubstrate,并且大多数iAP破解工具都依赖于此,因此至少会出现一些MobileSubstrate库。


您对MobileSubstrate / CydiaSubstrate库的外观有任何链接吗?我没有可玩的越狱电话,所以开着“盲人”电话,Google搜索基本上在上面给出了您的评论。
chadbag 2014年

@chadbag我也没有,但是您可以查找debMobileSubstrate 的文件,将其解压缩并黑名单(几乎)全部.dylib打包。
2014年

谢谢,我弄清楚了一些代码,根据您的评论,我可能会添加其他内容。非常感谢!
chadbag 2014年

4

我不知道为此存在任何“ API”。如果有的话,那么越狱掩盖产品将迅速掩盖他们。

许多人指出,这是一种猫捉老鼠的游戏。在两位玩家都成为专家之后,一切都取决于谁先采取行动。(手持设备的人。)

我在Zdziarski的新书《入侵和保护iOS应用程序》中找到了许多检测越狱的好建议。(就我个人而言,我为O'Reilly电子书支付了更高的费用,因为它们允许复制和粘贴。)

不,我不隶属于出版商。但是我确实找到了一本好书。我不想仅仅发布黑客的错误,以便他们纠正错误,所以我想指出这本书。


4

尝试通过应用程序执行未签名的代码。

越狱设备通常具有以下特征:

  • 运行未签名的代码
  • 已安装Cydia
  • 有越狱文件
  • 对整个文件系统的完全读/写访问
  • 一些系统文件将被修改(内容,因此sha1与原始文件不匹配)
  • 卡在特定版本(越狱版本)

仅检查文件是否存在越狱检测注定会失败。这些检查很容易绕开。


3
尝试执行未签名的代码会使您的应用程序被应用程序商店拒绝
Frederic YesidPeñaSánchez2013年

4

一些常用文件要检查: /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

大多数会检查与Cydia相关的文件。


3

我建议寻找“香草” iPhone上不存在的文件。我见过的所有越狱工具包都安装ssh。这可能是越狱电话的良好指示。


18
ssh永远不会自动安装,用户必须自己安装。
格兰特·保罗

1
我还没有真正了解越狱的情况。但是,正如我记得的那样,当我写这篇文章时(09年1月),Ziphone和其他人默认安装了ssh和bsd子系统。也许这不再是真的。
Gordon Wilson

12
当我说chpwn跟上越狱场面时,请相信我。
温菲尔德步道

3

我们所做的是,我们已经有了一个RSS提要与我们的用户进行交流(Stocks Live),我们放置了一个新闻项目,内容如下:

某些越狱设备存在问题bla bla bla,我们进行了破解以解决这些问题,但我们需要知道这是否是越狱设备,请按此处,以便该应用程序解决该问题。如果您恢复了正常状态,即删除了越狱,请按此处。

然后,您处理用户交互并执行适当的操作,例如行为不同等。


3

尝试查找cydia或越狱设备创建的文件。或尝试在应用程序的黑盒外写入文件。如果您成功执行此操作,则设备已损坏/越狱:)

- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}

2
苹果批准了您的包含上述代码的应用程序?
karthikPrabhu Alagu

3

对于Swift 4及更高版本,请使用以下代码:在appdelegate中添加以下代码:

private func getJailbrokenStatus() -> Bool {
    if TARGET_IPHONE_SIMULATOR != 1 {
        // Check 1 : existence of files that are common for jailbroken devices
        if FileManager.default.fileExists(atPath: "/Applications/Cydia.app")
            || FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib")
            || FileManager.default.fileExists(atPath: "/bin/bash")
            || FileManager.default.fileExists(atPath: "/usr/sbin/sshd")
            || FileManager.default.fileExists(atPath: "/etc/apt")
            || FileManager.default.fileExists(atPath: "/private/var/lib/apt/")
            || UIApplication.shared.canOpenURL(URL(string:"cydia://package/com.example.package")!) {
            return true
        }
        // Check 2 : Reading and writing in system directories (sandbox violation)
        let stringToWrite = "Jailbreak Test"
        do {
            try stringToWrite.write(toFile:"/private/JailbreakTest.txt", atomically:true, encoding:String.Encoding.utf8)
            //Device is jailbroken
            return true
        } catch {
            return false
        }
    }
    else {
        return false
    }
}

func applicationDidBecomeActive(_应用程序:UIApplication){

    if getJailbrokenStatus() {
        let alert = UIAlertController(title: LocalizedKeys.Errors.jailbreakError, message: LocalizedKeys.Errors.jailbreakErrorMessage, preferredStyle: UIAlertController.Style.alert)
        let jailBrokenView = UIViewController()

        jailBrokenView.view.frame = UIScreen.main.bounds
        jailBrokenView.view.backgroundColor = .white
        self.window?.rootViewController = jailBrokenView
        jailBrokenView.present(alert, animated: true, completion: nil)
    }

    if #available(iOS 11.0, *) {
        if !UIScreen.main.isCaptured {
            DispatchQueue.main.async {
                self.blockImageView.removeFromSuperview()
            }
        }
    }
}

1

这是我的解决方案:步骤1

extension UIDevice {
    func isJailBroken() -> Bool {
        let cydiaPath = "/Applications/Cydia.app"
        let aptPath = "/private/var/lib/apt/"
        if FileManager.default.fileExists(atPath: cydiaPath) || FileManager.default.fileExists(atPath: aptPath) {
            return true
        }
        return false
    }
}

第2步:viewDidLoad()在启动屏幕视图控制器(或您初次调用的任何VC)内部调用它:

       // show a blank screen or some other view controller
       let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
       self.navigationController?.present(viewController, animated: true, completion:nil)

-2

尝试访问/Application/Preferences.app/General.plist您应该能够在越狱的iPhone上执行操作在非Jb电话上,您将无法访问它


3
对于源代码,此答案将更加有趣。恕我直言:这将使您获得支持。
Johan Karlsson 2013年

5
-1 =未越狱的设备也可以打开并读取此文件。(已测试)
弗兰克语

@JohanKarlsson我认为这里的读者可以编写自己的源代码。如果他们不能-他们在这里做什么?
gnasher729
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.