[ios] 탈옥 된 전화기에서 iOS 앱이 실행되고 있는지 어떻게 알 수 있습니까?

jailbroken iPhone에서 내 앱이 다르게 동작하도록하려면 어떻게 결정해야합니까?



답변

그것은 탈옥의 의미에 달려 있습니다. 간단한 경우 Cydia가 설치되어 있는지 확인할 수 있어야합니다.

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

해킹 된 커널의 경우 좀 더 복잡합니다.


답변

이것은이 필요에 대해 찾은 답변을 결합한 코드이며 훨씬 높은 성공률을 제공합니다.

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


답변

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

/Applications/Cydia.app일반 전화 에서 파일 경로 를 확인할 수 없습니까? 애플이이를 감지하여 앱을 거부한다는 이야기를 들어 본 적이 없지만 애플은 예측할 수 없습니다. Cydia에는 UIApplication으로 합법적으로 확인할 수 있는 URL 체계 cydia : // 가 있습니다.canOpenURL:


답변

커널이 망가 졌는지 확인하는 것은 그리 복잡하지 않습니다.

탈옥은 서명 된 코드에 대한 커널의 서명 검사가 항상 코드가 올바르게 서명되었다고보고하게하며, 손상되지 않은 전화기는 서명이 잘못된 코드를 실행할 수 없습니다.

따라서 서명이 잘못된 앱에 별도의 실행 파일을 포함시킵니다. main () 및 반환 값이있는 3 줄 프로그램 일 수 있습니다. 코드 서명없이 실행 파일을 컴파일하고 (프로젝트 설정-> 빌드에서 끄십시오) “codesign”명령 줄 유틸리티를 사용하여 다른 키로 서명하십시오.

앱이 별도의 실행 파일을 실행하도록합니다. 나쁜 sig로 별도의 실행 파일을 실행할 때 프로그램이 반환 값을 얻을 수 없으면 확실히 감옥에 있습니다. 별도의 실행 파일이 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
}


답변

다음을 확인하여 장치가 JailBroken인지 여부를 감지 할 수 있습니다.

  • Cydia가 설치되었습니다
  • 일부 시스템 경로 확인
  • 샌드 박스 무결성 검사 수행
  • 심볼릭 링크 확인 수행
  • 샌드 박스 외부에서 파일을 작성하고 작성하는지 확인

다양한 기사와 책에서 만든 오픈 소스 라이브러리가 있습니다. GitHub에서 사용해보십시오 !


답변

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
}