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


167

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


당신은 움직이는 표적을 다음 될거야,하지만 당신은 당신의 기술이 얼마나 효과적인보고 이러한 자원의 진행 상황을 다음 시도 할 수 있습니다 : - theiphonewiki.com/wiki/Bypassing_Jailbreak_Detection - theiphonewiki.com/wiki/XCon
마이클 주교

답변:


90

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

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

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


17
을 찾아하기에 충분하지 않을까요 어떤 샌드 박스 외부 파일 / 디렉토리? / etc처럼?
리듬 피스트 맨

58
모든 사용자가 Cydia를 설치 한 것은 아닙니다. 이는 좋은 검사가 아니며, / all / users / will /에있는 / bin / bash와 같은 것이 있는지 확인해야합니다.
Grant Paul

2
apt는 정보를 어디에 저장합니까? 아니면 그냥 system () 명령을 호출하고 알아낼 수 있습니까? 특정 앱이 있는지 확인하고 앱이있는 경우 앱을 제한하고
싶습니다

2
@RazorSharp이 시점에서 거의 모든 사용자에게 Cydia가 있습니다. 아마 지금 확인하면 충분합니다. 그러나 100 % 신뢰할 수있는 검사를 원하는 경우 아래와 같이 커널 기반 검사를 사용하려고합니다.
Grant Paul

1
파일 검사는 우회하기 쉽지 않습니다. mobilesubstrate를 사용하여 확인한 특정 경로 로 후크 fileExistsAtPath:하고 반환하도록 할 NO수 있습니다.
toasted_flakes

55

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

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

1
@ Porizm, 이것은 내가 찾은 답변 중 일부에 불과합니다. 그들 중 일부는 나를 위해 일하지 않았지만 다른 사람들을 위해 일했습니다. 그래서이 코드를 사용하면 기회를 얻지 못합니다. 이것을 사용하면 99 % 확신 할 수 있습니다. 성능과 관련하여 각 실행에서 한 번만 실행하고 어딘가에 답을 저장할 수 있습니다. 매번 실행하지 않아도됩니다.
Yossi

3
@yossi와 porizm apple은 위의 코드가 포함 된 앱을 승인 했습니까? 회신 해 주시기 바랍니다
karthikPrabhu Alagu에게

4
이 방법은 Objective-C가 아닌 인라인 C 함수 여야합니다 . Objective-C 메소드를 발견하고 우회하는 것은 너무 쉽습니다. 특히 호출 할 경우isJailbroken
progrmr

2
@Yossi는 Taig를 사용하여 탈옥 된 장치를 다룹니까?
Lakshay

3
@Lakshay 모르겠어요. 당신은 여기에 답변을 확인하고 추가하도록 초대되었습니다 :)
Yossi

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

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


1
이것은 확인하기에 좋은 방법이며 샌드 박스 외부로 나가지 않습니다. 물론 탈옥자가 Cydia를 설치하지 않으면 NO를 반환하지만 대부분의 탈옥이 Cydia를 설치한다고 생각합니다.
Wim Haanstra

앱이 깨질 때이 문자열을 변경할 수 없습니까?
NSRover

8
iOS9.0 +의 경우 앱 plist에 LSApplicationQueriesSchemes 키를 추가해야합니다. 그렇지 않으면 canOpenURL은 항상 false를 반환합니다.
David V

1
이것은 사용자가 InstantTV와 같은 cydia : // 체계를 따르는 앱을 설치 한 경우 오 탐지를 제공합니다.
thattyson

@ thattyson 감사합니다! 나는 왜 내가 오탐 (false positive)을 받고 있는지 확인하려고했습니다.
rickrvo

52

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

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

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

앱이 별도의 실행 파일을 실행하도록합니다. 나쁜 sig로 별도의 실행 파일을 실행할 때 프로그램이 반환 값을 얻을 수 없으면 확실히 감옥에 있습니다. 별도의 실행 파일이 A-OK를 반환하면 전화가 확실히 탈옥 된 것입니다.


13
App Store를 통해 서명이 유효하지 않은 (하위) 실행 파일을 얻을 수 있습니까?
fbrereto

34
아마도 상황이 변경되었지만 별도의 실행 파일을 실행하지 않아도 앱 스토어에 승인되지 않습니까?
Peter Zich

4
댓글에 앞서 누군가 대답 할 수 있습니까? 이것은 중요한 질문입니다.
Petr

아무도 잘못된 서명으로 디스크에 Mach-O를 쓰지 못하게 막을 것입니다. 그러나 커널이 손상되었는지 확인하는 것이 포함되어 있지 않거나 이것이 확실한 결정이라는 대답에 동의하지 않습니다.
saagarjha

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

그것은 좋은 해결책이지만 xCon 및 이와 같은 다른 도구는이 검사를 쉽게 우회 할 수 있습니다. 그래서 더 나은 솔루션을 찾고 있습니다.
Alexei Robsky

7
@ AlexeiRobsky 완벽한 솔루션은 없습니다. 항상 당신의 보호를 우회 할 수있는 방법을 찾을 사람이있을 것입니다. 그것은 단지 사실입니다.
Richard J. Ross III

14

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

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

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


14

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
}

6

내가 아는 가장 정교한 방법은 objc_copyImageNames()기능을 사용하는 것입니다. 현재로드 된 라이브러리 목록을 반환하며 대부분의 사람들이 탈옥 된 장치에 MobileSubstrate가 있고 대부분의 iAP 균열 도구가 의존하기 때문에 적어도 일부 MobileSubstrate 라이브러리가 표시됩니다.


MobileSubstrate / CydiaSubstrate 라이브러리에 대한 링크가 있습니까? 나는 탈옥 전화를 가지고 놀지 않으므로 "맹인"을 운전하고 있으며 Google 검색은 기본적으로 위의 의견을 제시합니다.
chadbag

@ chadbag 나도 하나는 없지만 debMobileSubstrate 의 파일을 찾아서 압축을 풀고 블랙리스트 (거의) 모두 .dylib포장합니다.
Maxthon Chan

고마워, 나는 약간의 코드를 알아 냈고 귀하의 의견에 따라 더 많은 것을 추가 할 수 있습니다. 많은 감사합니다!
chadbag

4

이에 대한 "API"를 알고 있지 않습니다. 만약 있다면, 탈옥 마스킹 제품은 그것들을 빨리 덮을 것입니다.

많은 사람들이 지적했듯이, 그것은 고양이와 마우스 게임입니다. 그리고 두 선수 모두 전문가가 된 후에는 첫 번째 움직임을 얻는 사람이 모두 결정됩니다. (장치를 보유한 사람)

Zdziarski의 새로운 저서 "iOS 앱 해킹 및 보안"에서 탈옥을 감지하기위한 많은 좋은 제안을 찾았습니다. (개인적으로 O'Reilly eBook은 복사하여 붙여 넣기를 허용하므로 더 많은 비용을 지불했습니다.)

아니요, 게시자와 제휴하지 않았습니다. 그러나 나는 그것이 좋은 책이라고 생각했다. 해커의 실수를 고치기 만해도 문제를 해결할 수 있기 때문에 책을 가리킬 것이라고 생각했습니다.


4

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

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

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

탈옥 탐지를 위해 파일 존재를 확인하는 것만으로는 실패 할 것입니다. 이러한 검사는 우회하기 쉽습니다.


3
귀하의 응용 프로그램을 만들 것 서명되지 않은 코드를 실행하려고하면 앱 스토어에서 거부되는
프레드릭 Yesid 페냐 산체스

4

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


3

"vanilla"iPhone에없는 파일을 찾는 것이 좋습니다. 내가 본 모든 탈옥 키트는 ssh를 설치합니다. 그것은 탈옥 된 전화의 좋은 지표 일 수 있습니다.


18
ssh는 자동으로 설치되지 않으므로 사용자가 직접 설치해야합니다.
Grant Paul

1
나는 실제로 탈옥 현장을 따라 가지 않았다. 그러나 필자가 이것을 기억할 때 (Jan '09) Ziphone과 다른 사람들은 기본적으로 ssh와 bsd 하위 시스템을 설치했습니다. 아마도 그것은 더 이상 사실이 아닙니다.
Gordon Wilson

12
내가 chpwn이 탈옥 장면을 따라했다고 말할 때 나를 믿어주세요.
Winfield Trail

3

우리가 한 일은 이미 사용자와 통신하기위한 RSS 피드가 있고 ( Stocks Live ), 다음과 같은 뉴스 항목이 있습니다.

일부 탈옥 장치에는 문제가 있습니다. 이러한 문제를 해결하기 위해 해킹을했지만이 탈옥 장치인지 여부를 알아야합니다. 여기를 누르면 앱이 문제를 해결합니다. 예를 들어 탈옥을 제거하고 정상으로 돌아온 경우 여기를 누르십시오.

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


3

cydia 또는 jailbroken 장치가 생성하는 파일을 찾으십시오. 또는 앱의 블랙 박스 외부에 파일을 쓰십시오. 그렇게하면 장치가 손상 / 감옥됩니다. :)

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

2
Apple은 위 코드가 포함 된 앱을 승인 했습니까?
karthikPrabhu 알라 구

3

Swift 4 이상에는 다음 코드를 사용하십시오. appdelegate에 다음 코드를 추가하십시오.

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

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

1

여기 내 해결책이 있습니다 : 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
    }
}

2 단계 : 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)

-2

/Application/Preferences.app/General.plist에 액세스 해보십시오. jailbroken iPhone에서 액세스 할 수 있어야합니다. Jb가 아닌 전화에서는 액세스 할 수 없습니다.


3
이 답변은 소스 코드에서 더 흥미로울 것입니다. IMHO : 이것은 당신에게 공감대를 얻습니다.
Johan Karlsson

5
-1 = 깨지지 않은 장치도이 파일을 열고 읽을 수 있습니다. (테스트 결과)
Frankish

@JohanKarlsson 나는 독자들이 자신의 소스 코드를 작성할 수 있다고 가정합니다. 그들이 할 수 없다면-여기서 뭐하는거야?
gnasher729
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.