// // AppDelegate.m // JBDetection // // Created by night-ohl on 2020/07/20. // Copyright © 2020 night-ohl. All rights reserved. // #import "AppDelegate.h" #include <spawn.h> @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. //탈옥 여부를 담는 변수 BOOL jailbroken = NO; NSString *cydiaPath = @"/Applications/Cydia.app"; NSString *aptPath = @"/private/var/lib/apt/"; NSString *applications = @"/User/Applications/"; NSString *Mobile = @"/Library/MobileSubstrate/MobileSubstrate.dylib"; NSString *bash = @"/bin/bash"; NSString *sshd =@"/usr/sbin/sshd"; NSString *sd = @"/etc/apt"; if([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) { NSLog(@"cydia detected"); jailbroken = YES; } if([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) { NSLog(@"/var/lib/apt/ detected"); jailbroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:applications]){ NSLog(@"/User/Applications/ detected"); jailbroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:Mobile]){ NSLog(@"MobileSubstrate.dylib detected"); jailbroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:bash]){ NSLog(@"/bin/bash detected"); jailbroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:sshd]){ NSLog(@"/user/sbin/sshd detected"); jailbroken = YES; } if ([[NSFileManager defaultManager] fileExistsAtPath:sd]){ NSLog(@"/etc/apt/ detected"); jailbroken = YES; } //여기서 최종적인 판단을 내림 if(jailbroken == YES) exit(1); return YES; } ...생략... @end
이렇게 쭉 탈옥관련 파일들을 검사하는 루틴을 작성하였다.
많은 것을 검사했다고 생각은 들지만, 공격자 입장에서 얼마나 까다로울지도 직접 살펴봐야한다.

어떻게 하면 우회를 할 수 있을까 라는 입장에서 생각해보면 사실 하나하나 우회할 필요가 없다.
탈옥 여부를 변수에 저장하고, 결국에는 맨 마지막 분기문에서 exit이냐 정상루틴을 실행하냐가 갈리므로, 다 건너뛰고 맨 마지막 분기문만 항상 정상루틴으로 점프하도록 코드패치를 하면 된다.
공격자를 좀 더 귀찮게 만들 필요가 있다.
따라서 위 경우처럼 순차로 쭉 검사는 하되, 결정은 하나의 분기문으로 끝나는 경우는 피하는게 좋다.