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. App Logic

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)  (2) 2017.05.06
iOS Hooking#2(Frida)  (0) 2017.04.19
iOS Hooking#1(Logos)  (1) 2017.04.18
2장 iOS 해킹 기초 (1)  (0) 2016.06.18
자주쓰는 데이터형 변환  (0) 2016.06.01
[iOS/GCC] __attribute__((constructor)) / __attribute__((desstructor))  (0) 2016.05.13
  1. 1357 2017.04.18 15:18

    유익한 정보네요 ~

+ Recent posts