1. Cycript
Cycript는 iOS에서 실행되고 있는 애플리케이션을 동적으로 수정하고 분석을 할 수 있게 해주는 SDK이다.
문법은 기본적으로 Objective-C / JavaScript를 혼합하여 사용 가능하다.
2. Cycript Hooking
2-1) view계층 확인하기
ex) UIApp.keyWindow.recursiveDescription()
view의 계층을 출력하여준다. NSLog로 출력하여 큰 화면으로 보면 아래와 같이 이쁘게 보인다.
2-2) subviews()
ex) UIApp.keyWindow.subviews()[index]
window는 하나 이상의 view를 가지며, view 역시 하나 이상의 view의 집합이다. 각 하위 view들의 접근은 subviews()[index]의 형태로 접근 가능하고, 2-1에서 확인한 계층을 참조하여 각 요소들을 찾을 수 있다.
2-3) _viewDelegate()
ex) UIApp.keyWindow.subviews()[2].subviews()[0]._viewDelegate()
_viewDelegate를 이용하여 해당 view의 controller에 접근 가능하다.
2-4) replacing existing objective-C methods
ex) Game2ViewController.prototype['recognizeAnswer']
= function() { NSLog(@"[JSACH]HOOKED"); return 1;}
참고) Cycript에서 사용하는 API나 문법, Trick들이 정리되어있는 링크
- iOS Tricks
http://iphonedevwiki.net/index.php/Cycript_Tricks
- Cycript공식 홈페이지
http://www.cycript.org/
참고로 이 글은 Cycript 0.9.594버전을 기준으로 작성을 하였다.
3. 결과
3-1) 메서드 재정의
1 | Game2ViewController.prototype['recognizeAnswer'] = function() { NSLog(@"[JSBACH]HOOKED"); NSLog(@"[JSBACH] return SUCCESSED"); return 1;} |
3-2) 메서드 후킹 로그
3-3) 후킹 성공 결과
4. 후기
frida와 Logos 그리고 오늘 Cycript까지 정리하면서 처음에 계획했던 후킹 방법 세가지에 대해 모두 간단하게 겪어(?)보았다. 각 방법의 장단점이 어느 정도 감이 오는 것 같아서 매우 뿌듯하고 흡족스럽다!
개인적으로 생각하는 frida와 Logos, Cycript를 비교하면 이렇다고 생각한다.
항목 |
Logos |
Frida |
Cycript |
설치의 편의성 |
하 |
중 |
상 |
수정사항 반영의 편의성 |
하 |
상 |
상 |
후킹 사항 유지력 |
상 |
하 |
중 |
참조 자료의 양 | 중 | 상 | 하 |
4-1) 설치의 편의성
후킹하기 위한 각 툴들의 환경설치에 대한 평가 항목으로 선정해보았고, 개인적으로 소요된 시간과 환경의 까탈스러움 등을 고려하여 평가해보았다.
Logos의 경우 Mac사용자라면 간편한 편일 수 있으나, 본인은 Kali Linux에 환경을 설치하면서 꽤나 애를 먹었던 기억이 나서 낮은 '하'로 선정하였다.
Frida는 비교적 편리하게 설치하였으나, 단말에 Server Binary를 올려야하는 점과 Cycript만큼 간단하지 않았던 것같아(ㅎㅎ) '중'으로 점수를 매겼다.
Cycript의 경우 Cycia에서 패키지 설치만으로 모든 설치가 정상적으로 완료 되어 '상'으로 책정하였다.
4-2) 수정사항 반영의 편의성
후킹 코드 작성 중 수정사항이 생긴경우 재 반영하는 방법의 편의성에 대한 평가 항목이다.
Logos는 .deb파일을 재설치하고 Spring Board가 재시동되어야 하는 불편함이 있어 '하'가 되었다.
Frida의 경우 script를 종료 시킨 후 수정, 재실행의 과정이 있어야 하고.. 아무래도 Cycript만큼 간단하지 않았던것 같아 '중'으로 하였다.
Cycript는 후킹 script만 재정의 해주면 되므로 가장 간단하다고 판단하여 '상'으로 하였다.
4-3) 후킹 사항 유지력(?)
항목이름이 이상한거 같긴한데.. 적절한 명칭이 떠오르지않아서ㅠ... 한번 후킹 코드를 넣었을 때, 얼마나 유지가 되는지(?)에 대한 항목이다.
Logos는 한번 .deb설치가 되면 삭제가 될때까지 유지가 된다. 즉, 개발한 패키지를 한번 설치를 하고난 후 특별한 조치를 취하지 않아도 후킹코드가 유지된다. 가장 유지력이 좋다고 생각하여 '상'으로 책정하였다.
Frida는 후킹 script가 종료되기 전까지 유지가 되고, Cycript는 후킹 Process가 종료되기 전까지 유지 되므로 각각 '하'와 '중'으로 하였다.
4-4) 참조 자료의 양
비교 항목 중 가장 주관적인 항목으로 본인이 검색해 본 경험에 따라 그냥 매겼다.
아무래도 요즘 많이 떠오르고있는 Frida가 자료가 가장 많아 '상', Cycript와 Logos는 비슷 한것 같지만
Cycript가 예전 자료가 너무 많이나와서 사실상 볼 만한 자료가 거의 없었다. 따라서 더 애를 많이 먹었던 것 같아 '하'로 책정하였다.
다음 목표는 Logos를 이용하여 tsprotector와 비슷한 JB우회 패키지를 만들어 보고자 한다.
fopen과 같은 file관련 API들, System call등을 후킹하여야 할 것으로 예상된다~
'Study > iOS' 카테고리의 다른 글
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 |