소스코드에 녹인 경우 - 매번 exit

// // 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; exit(1); } if([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) { NSLog(@"/var/lib/apt/ detected"); jailbroken = YES; exit(1); } if ([[NSFileManager defaultManager] fileExistsAtPath:applications]){ NSLog(@"/User/Applications/ detected"); jailbroken = YES; exit(1); } if ([[NSFileManager defaultManager] fileExistsAtPath:Mobile]){ NSLog(@"MobileSubstrate.dylib detected"); jailbroken = YES; exit(1); } if ([[NSFileManager defaultManager] fileExistsAtPath:bash]){ NSLog(@"/bin/bash detected"); jailbroken = YES; exit(1); } if ([[NSFileManager defaultManager] fileExistsAtPath:sshd]){ NSLog(@"/user/sbin/sshd detected"); jailbroken = YES; exit(1); } if ([[NSFileManager defaultManager] fileExistsAtPath:sd]){ NSLog(@"/etc/apt/ detected"); jailbroken = YES; exit(1); } if(jailbroken == YES) exit(1); return YES; } ... 생략 ... @end
notion image
그림처럼 검사 후에는 항상 exit으로 연결되도록 코드를 작성하였다.
코드를 아주 살짝 수정하면 되는데, 공격자 입장에서는 상당히 번거로워진다.
 
우회하려면 공격자는 검사 루틴 하나하나 다 찾아가서 분기문을 패치해야 한다.
훨씬 번거로워지는데, 이렇게 검사하는 경우가 한 순간이 아니라 사방에서 검사한다면??
 

공격자의 선택지

  1. 포기한다
  1. 자동화 패치 스크립트를 작성한다
  1. 분기문 패치가 아닌, 검사하는 함수 자체를 후킹한다
 
2번을 선택할 공격자를 좀 더 귀찮게 하려면 "파일 무결성 검사"를 진행한다.
3번을 선택할 공격자를 좀 더 귀찮게 하려면 "후킹 탐지" 기법을 같이 적용시킨다.
 

후킹 트윅 작성 실습

[Tweak.x 파일 후킹 코드] %hook NSFileManager -(BOOL)fileExistsAtPath:(NSString *)path { %log; NSLog(@"%@", path); if([path hasSuffix:@"Cydia.app"] || [path hasSuffix:@"MobileSubstrate.dylib"] || [path hasSuffix:@"bash"] || [path hasSuffix:@"sshd"] || [path hasSuffix:@"/etc/apt"] || [path hasSuffix:@"jailbreak.txt"] || [path hasSuffix:@"/lib/apt/"] || [path hasSuffix:@"/User/Applications/"]) return 0; else return %orig; } %end
NSFileManager 클래스의 fileExistsAtPath: 메소드를 후킹하였다.
디스어셈블하여 검사하는 탈옥파일 목록을 추출하고, 해당 파일을 검사할 경우 없다고 0을 반환하도록 변경했다.