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
}
