iOS 앱이 JailBroken 전화로 실행되고 있는지 어떻게 감지합니까?

StackOverflow https://stackoverflow.com/questions/413242

  •  03-07-2019
  •  | 
  •  

문제

내 앱이 탈옥 된 iPhone에서 다르게 행동하기를 원한다면 어떻게 이것을 결정 하는가?

도움이 되었습니까?

해결책

그것은 탈옥이 당신의 의미에 달려 있습니다. 간단한 경우, Cydia가 설치되어 있는지 확인하고 그와 같은 것을 볼 수 있어야합니다.

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

해킹 된 커널의 경우 약간의 관련이 있습니다.

다른 팁

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

파일 경로를 확인합니다 /Applications/Cydia.app 일반 전화로 허용되지 않습니까? 나는 애플이 이것을 감지하고 앱을 거부하는 것에 대해 들어 본 적이 없지만 애플은 예측할 수 없다. Cydia가 있습니다 URL 체계 Cydia : // uiapplication으로 법적으로 확인할 수 있습니다 canOpenURL:

이것은 내가이 요구에 대해 찾은 몇 가지 답변을 결합한 코드이며, 훨씬 더 높은 성공률을 제공 할 것입니다.

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

커널이 고장 났는지 확인하는 것이 그다지 관련이 없습니다.

탈옥은 서명 된 코드의 커널의 서명 확인이 항상 코드가 올바르게 서명되었다고보고합니다. 끊임없는 전화기가 잘못된 서명으로 코드를 실행할 수는 없습니다.

따라서 서명이 잘못된 앱에 별도의 실행 파일을 포함시킵니다. Main ()과 리턴 값이있는 3 라인 프로그램 일 수 있습니다. 코드 서명없이 실행 파일을 컴파일하고 (프로젝트 설정-> 빌드에서 끄기) "CodesIGN"CommandLine 유틸리티를 사용하여 다른 키로 서명하십시오.

앱에 별도의 실행 파일을 실행하도록하십시오. Bad 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
}

다음을 확인하여 장치가 탈옥되어 있는지 여부를 감지 할 수 있습니다.

  • Cydia가 설치되었습니다
  • 시스템 경로를 확인하십시오
  • 샌드 박스 무결성 검사를 수행하십시오
  • Symlink 확인을 수행하십시오
  • 샌드 박스 밖에서 파일을 작성하고 쓰는 지 확인

다양한 기사와 책에서 만든 오픈 소스 라이브러리가 있습니다. 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
}

내가 아는 가장 정교한 방법은 사용하는 것입니다 objc_copyImageNames() 기능. 현재로드 된 라이브러리 목록을 반환하며 대부분의 사람들은 탈옥 장치에 대한 모바일 서브 스트레이트를 가지고 있기 때문에 대부분의 IAP 균열 도구는 그것에 의존하기 때문에 적어도 일부 Mobilesubstrate 라이브러리가 나타납니다.

나는 이것을 위해 존재하는 "API"를 모른다. 있다면, 탈옥 마스킹 제품이 빨리 덮을 것입니다.

많은 사람들이 지적한 바와 같이, 그것은 고양이와 마우스 게임입니다. 그리고 두 선수가 전문가가 된 후에는 모두 누가 첫 번째 움직임을 얻는 사람에게 내려집니다. (장치를 들고있는 사람.)

Zdziarski의 새로운 책 "해킹 및 IOS 앱 보안"에서 탈옥을 감지하기위한 많은 좋은 제안을 발견했습니다. (개인적으로, 나는 오라일리 eBook에 대해 더 많은 돈을 지불했다.

아니요, 저는 게시자와 제휴하지 않습니다. 그러나 나는 좋은 책을 발견했습니다. 해커의 실수를 게시하여 고칠 수 있으므로 책을 가리킬 것이라고 생각했습니다.

응용 프로그램을 통해 서명되지 않은 코드를 실행해보십시오.

탈옥 장치에는 일반적으로 다음 특성이 있습니다.

  • 서명되지 않은 코드를 실행하십시오
  • Cydia가 설치되었습니다
  • 탈옥 파일이 있습니다
  • 전체 파일 시스템에 대한 전체 R/W 액세스
  • 일부 시스템 파일이 수정되었습니다 (컨텐츠 및 SHA1은 원본 파일과 일치하지 않습니다)
  • 특정 버전에 갇혀 있습니다 (탈옥 가능한 버전)

탈옥 탐지에 대한 파일 존재를 확인하는 것만으로는 실패 할 것입니다. 이 수표는 우회하기 쉽습니다.

확인할 몇 가지 일반적인 파일 :/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 관련 파일을 확인합니다.

"바닐라"아이폰에없는 파일을 찾는 것이 좋습니다. 내가 본 모든 탈옥 키트 SSH를 설치합니다. 그것은 탈옥 전화의 좋은 지표 일 수 있습니다.

우리가 한 일은 이미 사용자와 의사 소통하기위한 RSS 피드가 있습니다 (주식은 살고 있습니다), 우리는 다음과 같은 것을 나타내는 뉴스 항목을 넣었습니다.

일부 Jailbroken 장치에는 Bla Bla Bla 문제가 있습니다. 이러한 문제를 해결하기 위해 해킹을했지만이 문제가 발생하는지 여부를 알아야합니다. 여기에서 앱이 문제를 해결하도록 여기를 누릅니다. 정상으로 돌아 오면 탈옥을 제거한 경우 여기를 누릅니다.

그런 다음 사용자 상호 작용을 처리하고 다른 행동 등과 같이 적절한 일을합니다 ...

Cydia 또는 Jailbroken 장치가 만든 파일을 찾으십시오. 또는 앱의 Blackbox 외부에 파일을 쓰십시오. 당신이 그렇게한다면, 장치는 손상/탈옥됩니다 :)

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

당신은 움직이는 목표를 따를 것이지만, 당신은 당신의 기술이 얼마나 효과적인지 확인하기 위해 이러한 자원의 진행 상황을 따르려고 시도 할 수 있습니다.

그녀는 내 솔루션 :

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

그리고 그것을 안으로 부릅니다 viewDidLoad() 런치 화면보기 컨트롤러 (또는 처음으로 요청하는 VC) 내부 : :

    if UIDevice.current.isJailBroken() {
       // show a blank screen or some other view controller
       let jailbreakVC = JailBrokenViewController()
       self.navigationController?.present(jailbreakVC, animated: true, completion:nil)
    } else {
     // continue executing your next View controller
     let nextVC = NextViewController()
     self.navigationController?.present(nextVC, animated: true, completion:nil)
    }

JB 휴대 전화의 JailBroken iPhone에서는 할 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top