【问题标题】:How to detect that the app is running on a jailbroken device? [duplicate]如何检测应用程序是否在越狱设备上运行? [复制]
【发布时间】:2011-09-25 16:47:44
【问题描述】:

我刚刚发布了适用于 iOS 的应用,但我不确定如何确保我的应用不被越狱者使用。

我可以采取措施阻止我的应用在越狱设备上运行吗?

【问题讨论】:

  • 应用程序没有越狱 - iPhone 和 iPad 可以。
  • 没有什么神奇的方法可以让应用程序防盗版。否则,应用盗版就不会存在。
  • 一方面,问题的标题在语法上做得很差,所以我不知道你在哪里问什么。我可以建议将其更改为“如何防止我的应用程序在越狱设备上运行?”?至于问题,Rahul Vyas 的回答非常好。每次在越狱设备上打开您的应用时,您可能还想找到一种联系 Apple 的方法。
  • 语法不好,我不认为攻击他的语法或说“应用程序没有越狱”和“没有神奇的方法可以使应用程序防盗版”。有时,人们不太懂英语。放手吧:\
  • @user529758 越狱本身不是盗版。无论如何,大多数越狱都是针对盗版的,这也是事实。

标签: ios iphone ipad jailbreak


【解决方案1】:

您可以通过代码检测应用程序是否在越狱设备上运行。通过这种方式,您可以弹出警报并关闭应用程序。你可以做任何你想做的事。这是它的教程:

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/

【讨论】:

  • 只是想感谢您的出色回答,我会将其加入书签,因为我将进入 iOS 开发领域,很高兴知道这一点!
  • @user691859 感谢您的书签。
  • 谢谢@RahulVyas;它将帮助我领导我的 ios 开发项目团队
【解决方案2】:

检查这些路径

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

另外你可以看看https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalSDK/Source/OneSignalJailbreakDetection.m

【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    -(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
    }
    

    【讨论】:

    • 什么是错误码
    • 它是 Unix 系统中的全局变量,您可以使用它来检查与系统调用相关的错误(例如打开文件等)。如果要使用,请包含 errno.h。
    【解决方案5】:

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

    1. Cydia 已安装
    2. 验证一些系统路径
    3. 可以执行沙盒完整性检查
    4. 执行符号链接验证
    5. 验证您是否在沙盒之外创建和写入文件

    an open source library我从各种文章和书籍中创建的,试试看。

    【讨论】:

      【解决方案6】:

      根据@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
      }
      

      【讨论】:

      • 只要返回 fileManager.fileExistsAtPath("/private/var/lib/apt")
      【解决方案7】:
      /**
           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
          }
      

      【讨论】:

        【解决方案8】:

        即使你的设备越狱了,ipa应用也只能访问自己的沙盒,所以 如果设备已越狱或未越狱,您的方法将返回 NO :) 寻找另一种方式 此外,如果您尝试访问某个地方,但您在应用商店中的沙盒发布应用可能会出现问题

        【讨论】:

          【解决方案9】:

          有很多方法可以找到越狱设备。如果熟练的黑客更改应用程序路径,检查 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];
           }
          

          在下面的网址中查找更多技术

          http://highaltitudehacks.com/2013/12/17/ios-application-security-part-24-jailbreak-detection-and-evasion/

          【讨论】:

          • 你的 else 子句没有意义。如果没有错误,您需要删除该文件。
          【解决方案10】:

          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
              }
          

          【讨论】:

            【解决方案11】:

            无法检测设备是否越狱。

            请考虑,即使有,设备已经越狱,这意味着可以执行任意代码,并且越狱者只会修改您用来表示设备尚未越狱的任何检测方法。

            参考: https://forums.developer.apple.com/thread/43073

            感谢回答同样问题的 Apple 员工

            【讨论】:

              猜你喜欢
              • 2020-10-23
              • 2011-05-21
              • 2018-03-08
              • 2012-03-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多