Notice : 해당 자료가 저작권등에 의해서 문제가 있다면 바로 삭제하겠습니다.
연구목적으로 사용하지 않고 악의적인 목적으로 이용할 경우 발생할 수 있는 법적은 책임은 모두 본인에게 있습니다.
iOS 앱 보안진단을 위한 환경설정
iOS 앱 정적 분석하기(class-dump-z, clutch)
Objective-C Runtime의 이해와 gdb attach 하기
iOS 앱 Cycript를 이용항 동적분석 및 변조
개발자 등록하지 않고 iOS 기기에 앱 설치 하기
Cycript 를 이용해 iOS 앱 로그인 우회 실습
Snoop-it 을 이용해서 iOS 앱 분석하기
Cycript 는 본래 javascript와 Obj-C 를 결합한 스크립트의 인터프리터이지만
실행중인 프로세스에 침투하여 프로퍼티를 변경하고 함수를 동적으로 호출이 가능하다.
Cycript는 http://www.cycript.org/debs/ 에서 다운로드가 가능하다.
최신버전인 cycript_0.9.501_iphoneos-arm.deb 를 다운로드 받아 iPad에 sftp으로 업로드하고 설치했다.
잘 설치 되었다.!!
자 이제 Yahoo Weather 앱을 분석해보자.
먼저 Yahoo Weather 앱을 실행하고, ps 를 이용해 pid를 확인한다.
그리고 -p 옵션으로 pid를 넣어서 cycript를 실행하면 된다.
먼저 [UIApplication sharedApplication] 객체를 호출해보았다.
그리고 a변수에 객체를 넣었다.
그리고 a의 delegate정보를 확인해보니, YWAppDelegate 라는 것을 알 수 있다.
yahoo weather 앱은 아래 그림과 같이 iPad 상태바가 없다.
상태바를 나타나도록 하려면 아래와 같이 입력한다.
1 |
cy# [a setStatusBarHidden:NO animated:NO] |
그러면 아래와 같이 상태바가 나타나는 것으 확인할수 있다.
이번에는 yahoo weather 앱 아이콘에 알림이 999개 온 것 처럼 변경해보자.
1 |
cy# [a setApplicationIconBadgeNumber:999]; |
그리고 특정 url 으로 보낼수도 있다.
1 |
[a openURL:[NSURL URLWithString:@"http://apollo89.com"]] |
보통 앱을 분석할 때 keyWindow를 많이 확인한다.
keyWindow는 사용자의 터치 이벤트를 받아 처리하는 역할을 한다.
만약 앱에서 모든 윈도우를 확인하고 싶으면 아래와 같이 하면된다.
1 2 |
cy# UIApp.windows @[#"<UIWindow: 0x208846e0; frame = (0 0; 768 1024); autoresize = W+H; layer = <UIWindowLayer: 0x20884640>>",#"<UITextEffectsWindow: 0x24506630; frame = (0 0; 768 1024); hidden = YES; opaque = NO; layer = <UIWindowLayer: 0x24506740>>",#"<YSStatusBar: 0x1fdda990; baseClass = UIWindow; frame = (0 0; 280 20); hidden = YES; autoresize = W; gestureRecognizers = <NSArray: 0x208c3010>; layer = <UIWindowLayer: 0x1fddaac0>>"] |
그리고 keyWindow를 찾으려고 하면 아래와 같이 찾을 수 있다.
1 2 |
cy# UIApp.keyWindow #"<UIWindow: 0x208846e0; frame = (0 0; 768 1024); autoresize = W+H; layer = <UIWindowLayer: 0x20884640>>" |
그러면 UIApp.keyWindow에서 rootViewController를 확인해보자
1 2 |
cy# UIApp.keyWindow.rootViewController #"<YahooSlidingViewController: 0x1fdd9320>" |
Javascript와 Objective-C를 섞어서 이용하면 더 고급분석이 가능하다.
method를 프린트하는 함수를 작성해보자
1 2 3 4 5 6 7 8 9 10 11 12 13 |
cy# function printMethods(className) { cy> var count = new new Type("I"); cy> var methods = class_copyMethodList(objc_getClass(className), count); cy> var methodsArray = []; cy> for(var i = 0; i < *count; i++) { cy> var method = methods[i]; cy> methodsArray.push({selector:method_getName(method), implementation:method_getImplementation(method)}); cy> } cy> free(methods); cy> free(count); cy> return methodsArray; cy> } cy# |
이제 위에서 확인 했던 Delegate 클래스였던 YWAppDelegate을 넣어줘서 호출해보자.
@selector 뒤의 값이 메소드명이다.
getter 와 setter도 볼 수 있고 private method로 보이는 메소드도 있다.
같은 방법으로 위에서 확인했던 rootViewController인 YahooSlidingViewController를 넣어서 확인해보자
실제로 응용 프로그램에서 날씨 표시를 담당하는 뷰 컨트롤러를 찾기 위해, 우리는 다음과 같은 명령을 사용할 수 있다.
1 2 3 4 5 6 |
cy# [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder].topViewController #"<YWMainViewController: 0x1e837f90>" cy# var mv = [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder].topViewController #"<YWMainViewController: 0x1e837f90>" cy# mv #"<YWMainViewController: 0x1e837f90>" |
YWMainViewController 가 실제로 날씨표시하는 뷰으로 확인할 수 있다.
다시 printMethods를 통해 YWMainViewController를 살펴보면..
화면에는 길어서 잘렸지만 viewDidLoad 라는 메소드를 볼 수 있다.
selector:@selector(viewDidLoad),implementation:0x3428d
이 메소드는 view가 처음 로드될 때 호출되는 메소드로 보인다.
이 함수를 call 해보자
1 |
cy# [[[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder].topViewController viewDidLoad] |
처음 로드할 때 정보를 업데이트 하는지 새로고침이 되는 것을 확인할 수 있다
이번에는 instance 변수를 확인하는 코드를 만들어보았다.
1 |
cy# function tryPrintIvars(a){ var x={}; for(i in *a){ try{ x[i] = (*a)[i]; } catch(e){} } return x; } |
여기서 locationViewControllers 변수를 볼 수 있는데 사용자가 추가한 도시를 배열로 저장해두는 것으로 보인다.
1 2 3 4 5 |
cy# mv.locationViewControllers @[#"<ywlocationviewcontroller: 0x1fd71080>"] cy# mv.locationViewControllers @[#"</ywlocationviewcontroller:><ywlocationviewcontroller: 0x1fd71080>",#"</ywlocationviewcontroller:><ywlocationviewcontroller: 0x2081acd0>"] cy# |
와~ 신기하다..
cycript 를 이용하면 앱을 다양하게 분석할 수 있을듯.
특히 class-dump를 이용해 클래스와 메소드를 확인하고 동적으로 메소드 call을 하거나 인스턴스 변수들의 값을 변경하면서 분석하면, 강력한 도구가 될것으로 보인다.
참고 : http://highaltitudehacks.com/2013/07/02/ios-aios-appllication-security-part-4-runtime-analysis-using-cycript-yahoo-weather-app/
http://highaltitudehacks.com/2013/07/02/ios-application-security-part-5-advanced-runtime-analysis-and-manipulation-using-cycript-yahoo-weather-app/
http://iphonedevwiki.net/index.php/Cycript_Tricks
One Response to iOS 앱 Cycript를 이용한 동적분석 및 변조