[iphone] 프로그래밍 방식으로 iPhone이 감옥에 갇혔는지 확인

iPhone / iPod가 다음과 같은지 (프로그래밍 방식으로) 어떻게 결정합니까?

  1. 감옥 파손
  2. 크랙 된 소프트웨어 사본 실행

Pinch Media 는 전화기가 탈옥되었는지 또는 실행중인 소프트웨어가 깨 졌는지 감지 할 수 있습니다.이 방법을 아는 사람이 있습니까? 도서관이 있습니까?



답변

다음 은 앱이 크랙되었는지 감지하는 방법 중 하나입니다.

요컨대 : 크래킹은 일반적으로 Info.plist를 변경해야합니다. 액세스 할 수있는 일반 파일이기 때문에 이러한 변경 사항을 확인하는 것은 매우 쉽습니다.


답변

탈옥 된 전화를 감지하는 것은 /private/var/lib/apt/폴더 가 있는지 확인하는 것만 큼 쉽습니다 . 설치자 전용 사용자는 감지하지 못하지만 현재 대부분은 Cydia, Icy 또는 RockYourPhone (모두 apt 사용)을 설치했습니다.

불법 복제 된 사용자를 감지하는 가장 쉬운 방법은 SignerIdentity앱의 .NET Core에 키 가 있는지 확인하는 것 Info.plist입니다. 고급 크래커는 표준 [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"]검사를 쉽게 찾을 수 있으므로 사용 가능한 Objective C 런타임을 사용하여 이러한 호출을 모호하게 #import <objc/runtime.h>하거나 대체 동등 항목을 사용 하는 것이 가장 좋습니다 .


답변

zakovyrya의 답변을 확장하려면 다음 코드를 사용할 수 있습니다.

if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
  // Jailbroken
}

그러나 앱을 탈옥 한 사람은 프로그램을 16 진 편집 할 수 있으므로 @ “siNGeridentity”또는 nil을 반환하는 다른 것을 읽도록 문자열 @ “SignerIdentity”를 편집하여 통과 할 수 있습니다.

따라서 이것을 사용하는 경우 (또는 http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html 의 다른 제안 ) :

  • 그것이 영원히 작동 할 것이라고 기대하지 마십시오
  • 이 정보를 사용하여 어떤 식 으로든 앱을 중단 / 방해하지 마십시오 (그렇지 않으면 16 진 편집 할 수 있으므로 앱이 탈옥되었음을 알 수 없습니다).
  • 이 코드를 난독 화하는 것이 현명 할 것입니다. 예를 들어 코드에 base64로 인코딩 된 역방향 문자열을 넣은 다음 프로세스를 역순으로 앱에서 디코딩 할 수 있습니다.
  • 나중에 코드에서 유효성 검사를 확인합니다 (예 : SignerIdentity라고 말했을 때 실제로 SignerIdentity 또는 siNGeridentity라고 표시 되었습니까?).
  • stackoverflow와 같은 공개 웹 사이트의 사람들에게 당신이 어떻게하는지 말하지 마십시오.
  • 그것은 단지 가이드 일 뿐이며 절대적인 것이 아니라는 것을 명심하십시오.


답변

위의 yonel과 Benjie의 의견을 확장하려면 :

1) 위에 yonel에 의해 링크 된 암호화 검사에 의존하는 Landon Fuller의 방법 은 자동화 된 크래킹 도구에 의해 여전히 패배하지 않는 유일한 방법 인 것 같습니다. 나는 Apple이 곧 LC_ENCRYPTION_INFO 헤더의 상태를 변경하는 것에 대해 지나치게 걱정하지 않을 것입니다. 탈옥 한 아이폰에 예측할 수없는 영향을 미치는 것 같습니다 (사용자가 사본을 구입 한 경우에도 …)

어쨌든 나는 그 코드를 기반으로 사용자에 대해 어떤 성급한 조치를 취하지 않을 것입니다.

2) Benjie의 의견을 보완하기 위해 re. 난독 화 (해적판 방지 코드의 문자열 값을 다룰 때 절대적으로 필요함) : 비슷하지만 더 쉬운 방법은 찾고있는 값 의 솔트 된 해시 버전 을 항상 확인하는 것 입니다. 예를 들어 (그 검사가 더 이상 효율적이지 않더라도) 적절한 상수에 대해 각 MainBundle의 키 이름을 md5 (keyName + “some secret salt”)로 검사합니다 … 오히려 기본적이지만, 끈.

물론이를 위해서는 비교하려는 값을 간접적으로 쿼리 할 수 ​​있어야합니다 (예 : 값을 포함하는 배열을 통해 이동). 그러나 이것은 대부분의 경우입니다.


답변