如何检测 iOS 设备是否越狱

多亏了移动时代,我们现在拥有适用于所有事物的移动应用程序。从理发店到大型零售商,每家企业都有应用程序,这样他们就可以更接近客户。一方面,我们确实利用了这种便利性,但另一方面,在使用这些应用程序时存在暴露大量机密信息的风险。在处理付款和其他敏感信息时,它变得非常重要。

作为这些应用程序的开发人员,我们有责任进行检查以确保隐私和安全不受影响。本文重点介绍检测 iOS 设备是否越狱。 

越狱检测技术基本上属于这些类别

1. 文件扩展名检查

如果设备越狱,则系统中存在一些文件。一个常见的文件是 Cydia。让我们看看下面的代码,我们将如何检查这些文件是否存在。

func isDeviceJailBroken() ->Bool {
    if access("/Applications/Cydia.app", F_OK) != -1 || access("/Applications/blackra1n.app", F_OK) != -1 || access("/Applications/FakeCarrier.app", F_OK) != -1 || access("/Applications/Icy.app", F_OK) != -1 || access("/Applications/IntelliScreen.app", F_OK) != -1 || access("/Applications/MxTube.app", F_OK) != -1 || access("/Applications/RockApp.app", F_OK) != -1 || access("/Applications/SBSettings.app", F_OK) != -1 || access("/Applications/WinterBoard.app", F_OK) != -1 || access("/Library/MobileSubstrate/MobileSubstrate.dylib", F_OK) != -1 || access("/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist", F_OK) != -1 || access("/Library/MobileSubstrate/DynamicLibraries/Veency.plist", F_OK) != -1 || access("/private/var/lib/apt", F_OK) != -1 || access("/private/var/lib/cydia", F_OK) != -1 || access("/private/var/mobile/Library/SBSettings/Themes", F_OK) != -1 || access("/private/var/stash", F_OK) != -1 || access("/private/var/tmp/cydia.log", F_OK) != -1 || access("/System/Library/LaunchDaemons/com.ikey.bbot.plist", F_OK) != -1 || access("/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist", F_OK) != -1 || access("/usr/bin/sshd", F_OK) != -1 || access("/usr/libexec/sftp-server", F_OK) != -1 || access("/usr/sbin/sshd", F_OK) != -1 || access("/bin/bash", F_OK) != -1 || access("/etc/apt", F_OK) != -1 {
        return true
    }
    return false
}

2. URL 方案

iOS App 允许注册不同的方案,允许直接从网络链接打开我们的应用程序。如果设备越狱,我们可以检查是否存在 cydia:// 方案。下面是检查 URL 方案是否存在的代码。

func isDeviceJailBroken() -> Bool {
    if let url = URL(string: "cydia://package/com.example.package") {
        if UIApplication.shared.canOpenURL(url) {
            return true
        }
        return false
    }
}

3.沙盒检查

JailBroken 设备会改变应用程序的沙盒行为。基本上,应用程序可以访问或影响其沙箱之外的事物。因此,我们通过在沙箱外写入文件进行检查,如果成功,则设备已越狱。这就是它在代码中的样子。

func isDeviceJailBroken() -> Bool {
    let error: Error? = nil
    let stringToBeWritten = "This is a JB test."
    do {
        try stringToBeWritten.write(toFile: "/private/jailbreak.txt", atomically: true, encoding: .utf8)
    } catch {
    }
    if error == nil {
        return true
    } else {
        let fileManager = FileManager.default
        do {
            try fileManager.removeItem(atPath: "/private/jailbreak.txt")
        } catch {
        }
    }
    return false
}

4. 动态链接器检查

动态链接为可执行文件提供了一种无需编译即可利用其他库提供的代码的方法,并且能够在可执行文件中发布该代码。这极大地帮助可执行文件重用代码,而无需包含这些不同库的副本。另一方面,静态链接将包含可执行文件所需的所有代码。

通常反越狱检测工具作为动态库加载。iOS 动态链接器 dyld 加载所有动态库。因此,我们可以通过查看加载到当前进程中的库的名称和数量来检查是否存在反越狱检测工具。如果反越狱检测工具正在运行,我们就知道该设备已越狱。

结论

JailBroke 设备检测无疑为您的应用增加了一层安全性。但无论如何,上面的列表足以做到这一点。归根结底,作为一名优秀的开发人员,我们需要练习所有良好的安全 实践来保护我们的 iOS 应用程序。 

how-to-detect-if-an-ios-device-is-jailbroken-263u3tdj