programing

iOS 앱이 감옥에서 고장난 전화기에서 실행되고 있는지 어떻게 감지합니까?

easyjava 2023. 6. 3. 08:51
반응형

iOS 앱이 감옥에서 고장난 전화기에서 실행되고 있는지 어떻게 감지합니까?

만약 제 앱이 감옥에서 망가진 아이폰에서 다르게 행동하기를 원한다면, 어떻게 결정해야 할까요?

탈옥이 무슨 뜻인지에 따라 다릅니다.간단한 경우, 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는 URL 스킴 cydia://가지고 있으며, UIAApp으로 합법적으로 확인할 수 있습니다.canOpenURL:

커널이 손상되었는지 확인하는 것은 그렇게 많이 관여하지 않습니다.

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

따라서 앱에 잘못된 서명이 있는 별도의 실행 파일을 포함합니다.main()과 return 값이 있는 3줄 프로그램일 수 있습니다.코드 서명 없이 실행 파일을 컴파일하고(프로젝트 설정->빌드에서 해제) "codesign" 명령줄 유틸리티를 사용하여 다른 키로 서명합니다.

앱이 별도의 실행 파일을 실행하도록 합니다.프로그램이 잘못된 부호를 가진 별도의 실행 파일을 실행할 때 반환 값을 얻지 못하면, 해당 파일은 확실히 수감됩니다.만약 별도의 실행 파일이 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
}

@Yossi에서 제공하는 솔루션을 Swift 2.3에서 재작업했습니다.

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
}

다음을 확인하여 장치가 파손되었는지 여부를 탐지할 수 있습니다.

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

다양한 기사와 책으로 만든 오픈소스 도서관이 있습니다.GitHub에서 사용해 보세요!

제가 아는 가장 정교한 방법은objc_copyImageNames()입니다.현재 로드된 라이브러리 목록을 반환하고 대부분의 사람들이 탈옥 장치에 MobileSubstrate를 가지고 있고 대부분의 iAP 크랙 도구가 그것에 의존하기 때문에 적어도 일부 MobileSubstrate 라이브러리가 나타날 것입니다.

Swift 4 이상의 경우 다음 코드를 사용하십시오.앱 대리인에 다음 코드를 추가합니다.

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

App 대리인 메서드 내에서 아래와 같이 코드를 작성합니다.

func applicationDidBecomeActive (_ application: 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()
            }
        }
    }
}

저는 이를 위해 존재하는 "API"를 알지 못합니다.만약 있다면, 탈옥 마스크 제품이 그들을 빠르게 덮을 것입니다.

많은 사람들이 지적하듯이, 그것은 고양이와 쥐를 겨루는 게임입니다.그리고 두 선수가 모두 전문가가 된 후에, 누가 첫 번째 동작을 하느냐에 달려 있습니다. (장치를 들고 있는 사람.)

저는 Zdziarski의 새 책 "Hacking and Secure iOS Apps"에서 탈옥을 탐지하기 위한 좋은 제안을 많이 찾았습니다. (개인적으로 O'Reilly eBook은 복사 및 붙여넣기를 허용하기 때문에 더 많은 비용을 지불했습니다.)

아니요, 저는 출판사에 소속되어 있지 않습니다.하지만 저는 그것이 좋은 책이라는 것을 알았습니다.저는 해커들의 실수를 그들이 고칠 수 있도록 그냥 출판하는 것을 좋아하지 않습니다. 그래서 저는 그 책을 가리켜야겠다고 생각했습니다.

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

탈옥 장치에는 일반적으로 다음과 같은 특징이 있습니다.

  • 부호 없는 코드 실행
  • Cydia가 설치되어 있음
  • 탈옥 파일이 있습니다.
  • 전체 파일 시스템에 대한 완전한 r/w 액세스
  • 일부 시스템 파일이 수정되었습니다(콘텐츠 및 ssha1이 원래 파일과 일치하지 않음).
  • 특정 버전에 고착됨(손상 가능한 버전)

탈옥 탐지를 위해 파일 존재를 확인하는 것만으로도 실패할 수밖에 없습니다.이러한 검사는 무시하기 쉽습니다.

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

저는 "vanilla" iPhone에 없는 파일을 찾는 것을 제안합니다.내가 본 모든 탈옥 키트는 ssh를 설치합니다.그것은 감옥에서 고장난 전화기를 보여주는 좋은 지표가 될 수 있습니다.

사용자와 소통하기 위한 RSS 피드(Stocks Live)를 이미 보유하고 있으며, 다음과 같은 내용이 포함된 뉴스 항목을 게시했습니다.

일부 탈옥 장치에는 문제가 있습니다. 우리는 이러한 문제를 해결하기 위해 해킹을 했지만, 우리는 이것이 탈옥 장치인지 아닌지 알아야 합니다. 앱이 문제를 해결할 수 있도록 여기를 누르십시오.만약 당신이 정상으로 돌아온다면, 즉 탈옥을 제거한 후, 여기를 누르십시오.

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

사이디아나 탈옥 장치가 만드는 파일을 찾아보세요.또는 앱의 블랙박스 외부에 있는 파일에 기록해 보십시오.성공하면 장치가 손상되거나 감옥에 갇히게 됩니다 :)

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

제 솔루션은 다음과 같습니다.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
    }
}

: 내부로 : 내부로 부르기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)

언급URL : https://stackoverflow.com/questions/413242/how-do-i-detect-that-an-ios-app-is-running-on-a-jailbroken-phone

반응형