런타임 조작Cycript1) 앱 인스턴스 얻기2) 앱 델리게이트 객체 획득3) keyWindow 획득4) rootViewController 획득실습 예시1) 알림창 띄워보기2) Document 디렉토리 경로 출력시키기3) keyWindow의 뷰 계층구조 확인4) Class dump로 확인 후 특정 메소드 강제 호출5) 날씨앱 알림 뱃지 개수 바꿔보기
런타임 조작
Objective-C
는 runtime oriented language.
- 실제 함수에서 어떤 동작을 할 지가 런타임에서 결정됨.
- 이 특성으로 인해 공격자가 함수 내용을 런타임에서 조작해도 됨.
- 대부분의 native앱은
런타임 환경
을 더하는Cocoa framework
씀.
Cycript
Cycript
라는 런타임 디버깅 도구를 이용한 동적 분석.
- Objectvie-C 문법과 Javascript 문법 지원.
- 앱이 실행되고 있는 상태에서 분석을 진행할 수 있다.
- 클래스 덤프로 파악한 함수 정보를 바탕으로 함.
- 인스턴스 메소드, 클래스메소드 등을 직접 호출 및 변경, 멤버변수 값을 조회하고 바꾸는 등의 행위 가능.
- Cycript 활용에 앞서 필요한 기초 문법부터 알아보자.
1) 앱 인스턴스 얻기
$ [UIApplication sharedApplication] # cycript에서 alias로 UIApp를 제공함. $ UIApp

2) 앱 델리게이트 객체 획득
$ [UIApplication sharedApplication].delegate # alias인 UIApp 활용한 명령어 축약 $ UIApp.delegate
UIApplicationDelegate
프로토콜을 채택한 객체 획득.
- 모든 앱은 앱과 연관된 메세지 처리를 위한
delegate
를 가진다. - 로딩을 끝냈거나
- 백그라운드로 전환 시
- 포그라운드로 전환 시 등
3) keyWindow 획득
인스턴스 메소드인 keyWindow로 바로 키 윈도우 획득 가능.
$ [[UIApplication sharedApplication] keyWindow] # alias 활용 $ [UIApp keyWindow]

- windows 메소드로 윈도우 목록 획득 후, UIWindow 클래스의 keyWindow 인스턴스 메소드로 키 윈도우인지 확인
- [[[UIApplication sharedApplication] windows][0] keyWindow]
4) rootViewController 획득
root view controller
- 현재 화면에 콘텐츠를 보여주는 것을 담당하고 있는 윈도우.
- 화면에 있는 버튼 클릭 시, 연결된 행위를 실행하는 등 핵심 요소
$ [[[UIApplication sharedApplication] keyWindow ] rootViewController] # alias 활용 $ [[UIApp keyWindow] rootViewController]
실습 예시
1) 알림창 띄워보기
SpringBoard
의UIAlertView
를 띄워보자.
- 앱이 돌아가는 상태에서 분석 (디버거는 멈춰서 한줄한줄)


2) Document 디렉토리 경로 출력시키기

3) keyWindow의 뷰 계층구조 확인

4) Class dump로 확인 후 특정 메소드 강제 호출



5) 날씨앱 알림 뱃지 개수 바꿔보기

