1. Logos
Logos is a component of the Theos development suite that allows method hooking code to be written easily and clearly, using a set of special preprocessor directives.
-[출처]http://iphonedevwiki.net/index.php/Logos
로고스는 Theos컴포넌트로 로고스를 이용하면 iOS 메소드 후킹 코드를 쉽고 깔끔하게 작성할 수 있다.
2-1) 앱 실행 화면
앱은 퀴즈와 함께 해당 퀴즈 정답의 글자 수가 표시되고, 아래 글자를 클릭하여 정답을 맞추는 형식을 갖추고 있다.
2-2) iDA 정적 분석
Clutch를 이용하여 복호화한 Binary를 iDA로 열어 코드를 분석하면 위와 같은 코드를 발견 할 수 있는데, recognizeAnswer라는 메소드의 결과 값에 따라 congratulationViewVisible여부를 결정 하는 것을 알 수 있다.
recognizeAnswer메소드의 내용은 다음과 같다.
위 코드에서는 조금 잘렸는데, v2는 Game2ViewController의 self객체이고, answer_nospace의 길이가 0이 아니면 answer_nospace의 길이만큼 while문을 돌면서 userAnswer와 answer_nospace를 한글자씩 비교한다.
그 후 모두 매치하면 v15를 1로 만들고 매치하지 않으면 break한 후 v15를 -1로 만드게 되고 이 v15값을 리턴한다. 즉 유저의 정답과 문제의 정답을 비교하여 정답인 경우 1을 리턴하고, 오답인 경우 -1을 리턴하는 메서드임을 알 수 있다.
2-3) Class-dump
2-2에서 확인한 Game2ViewController의 멤버변수나 메서드들을 Class-dump로 확인해 보았고, 우리가 주시해야하는 것들 부분만 발췌하였다.
answer_nospace는 앱에서 가지고있는 (분석한 결과 앱내 DB에서 조회해오는 값) 정답에 해당하는 변수이고, userAnswer는 유저가 입력한 답안 변수이다.
recognizeAnswer메서드는 멤버변수 값들로만 리턴 값을 정할 수 있으므로 특별한 Input값은 필요하지 않은 형태로 존재함을 확인 할 수있다.
3. Logos Hooking
위 분석 결과를 바탕으로 recognizeAnswer를 후킹하여 어떤 답안이 입력되든 정답처리가 될 수 있도록 Logos를이용한 후킹코드를 작성해 보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> @interface Game2ViewController : UIViewController{ } - (int)recognizeAnswer; @end %hook Game2ViewController - (int)recognizeAnswer{ int ret = %orig; int correct = 1; NSLog(@"[JSBACH]recognizeAnswer is Hooked\n"); if(-1 == ret){ NSLog(@"[JSBACH]answer is Wrong!! : %d", ret); } else{ NSLog(@"[JSBACH]answer is Correct!! : %d", ret); } return correct; } %end |
@interface Game2ViewController : UIViewController{
}
- (int)recognizeAnswer;
@end
후킹 타겟으로 하는 클래스/인터페이스와 해당 메서드의 form을 정의해준다.
우리가 후킹할 Game2ViewController는 UIViewController의 sub이므로 Game2ViewController : UIViewController부분이 있고, class-dump의 결과에서 확인했던 것과 같이 - (int)recognizeAnswer 메서드 형태로 정의해준다.
%hook Game2ViewController 후킹할 클래스/인터페이스를 지정하고 %end로 후킹코드의 끝을 내준다.
%orig는 원래 메서드의 리턴값을 가져올 수 있으며, argument가 존재하는 경우에는 %orig(arg1, arg2, ...)형식으로 호출 가능하다.
여기서는 본래의 리턴값을 가져와서 정답/오답여부를 로그로 표출하고, 무조건 정답처리 할 수 있도록 코딩하였다.
3. 후킹 결과
정상적으로 후킹 되어 로깅이 되고있는 모습이다.
원래 정답은 비파형 / 세형이지만 아무 값이나 오답을 입력한 후 테스트 하였고 정답처리가 됨을 확인하였다. :)
4. 후기
Logos를 이용해서 트윅제작, 시스템콜 후킹, UI버튼을 추가하는 등의 다양한 여러작업이 가능하다고 들었는데, 천천히 하나씩 해보고 싶다. 우선 다음 게시글은 Frida를 이용해서 똑같은 행위를 하는 후킹코드를 작성 해볼 예정이다.
'Study > iOS' 카테고리의 다른 글
iOS Hooking#3(Cycript) (3) | 2017.05.06 |
---|---|
iOS Hooking#2(Frida) (0) | 2017.04.19 |
2장 iOS 해킹 기초 (1) (0) | 2016.06.18 |
자주쓰는 데이터형 변환 (0) | 2016.06.01 |
[iOS/GCC] __attribute__((constructor)) / __attribute__((desstructor)) (0) | 2016.05.13 |