반응형
- 1Dynamic analysis
- 1.1GDB / LLDB
디버거는 소프트웨어 작성시 어디서 크래시가 나는지 알아내고, 프로그램의 특정 포인트에서 backtrace 정보를 찾는 등의 기능을 할 수 있게 한다. iPhone 상에서 돌아가고 있는 일반 프로세스에 attach해서 디버깅 하는 방법은 debugserver와 Debugging on iOS 7를 참조. - 1.2Cycript
Cycript는 내 코드를 attach된 프로세스에서 out-of-box로 실행할 수 있게 하며, 몇몇 자바스크립트 제품들과 함께 더 편리하게 코드를 작성할 수 있게 해준다.
유용한 런타임 분석 가능. (완성된 뷰 hierarchy를 가져오고, 오브젝트의 속성 확인 등)
쉽게 tweak의 프로토타이핑 수행. ( substrate bridge와 함께 메서드 후킹, object를 자유롭게 변경, 함수를 호출하는 등등)Cycript는 Objective-C 문법을 사용할 수 있는 Javascript 인터프리터다. 무슨 말이냐면, 특정 명령을 실행할 때 Objective-C와 Javascript를 함께 사용할 수 있다는 뜻이다. 또한 실행중인 프로세스를 후킹할 수 있고, 런타임중에 애플리케이션의 많은 것을 수정할 수 있게 해준다. 다음은 Cycript를 이용해 할 수 있는 것들이다.
- 실행중인 프로세스에 후킹할 수 있고 사용되는 클래스의 이름을 찾을 수 있다. 예를 들어, 뷰 컨트롤러, 내부 라이브러리, 서드 파티 라이브러리, 모든 함수의 이름들이 있다.
- 뷰 컨트롤러, 앱 델리게이트등 특정 클래스에서, 사용중인 모든 함수의 이름을 찾을 수 있다.
- 모든 인스턴스 변수들의 이름을 찾을 수 있고 애플리케이션의 런타임 중 특정 시점에 변수의 값을 확인할 수 있다.
- 런타임중에 인스턴스 변수의 값을 수정할 수 있다.
- 함수 패치(Method Swizzling)를 할 수 있다. 예를 들어, 특정 함수의 구현을 다른 내용으로 바꿀 수 있다.
- 애플리케이션 실행 중에 애플리케이션의 실제 코드 동작 없이 어떤 함수라도 호출할 수 있다.
- Cydia에서 Cycript를 검색해서 설치.
- 1.3Logify
런타임 분석 툴은 아니지만, 클래스 인터페이스를 포함하는 Objective-C 헤더를 취하고, 주어진 클래스의 모든 메서드에 후킹하고 각각의 훅에 대한 메서드 호출을 로깅하며 Logos 파일을 만든다. Logify는 런타임 동안 클래스의 어떤 메서드가 사용되었고 언제 사용되었는지 편리한 분석을 제공한다. - 1.4weak_classdump
(아래에서 설명할) class-dump가 executable를 분석하지 못하고 클래스 인터페이스와 함께 헤더 파일들을 만들지 못할 때( App Store 앱 encryption, other encryption, malformed binaries 등의 요인으로), 다른 방안은 이러한 정의들을 런타임에서 가져오는 것이다.
weak_classdump는 프로젝트에 붙어서 class-dump와 같은 output 파일들을 만들어주는 Cycript tool이다.
번들에 있는 모든 클래스들을 덤프할 때 사용할 수도 있다. - 1.5InspectiveC
InspectiveC는 특정 objects, classes, selectors의 메세지 계층을 로그할 수 있다. (어셈블리까지 들어가지 않고) 어떻게 특정 method 혹은 class가 작동하는지 알고자 할 때 유용하다.
twak에서 필요에 따라 오브젝트를 로깅하고자 일시적으로 InspectiveC를 쓸 수 있다. - 1.6.1Reveal
Reveal은 고급 시각화, 포괄적 점검원, 실행 상태에서(on the fly) 어플리케이션을 수정할 능력을 제공한다. 따라서 보기 레이아웃과 렌더링 문제를 몇 초안에 디버깅 할 수 있을 것이다.
- Reveal Loader는 동적으로 libReveal.dylib을 로드한다. - 1.6.2Spark Inspector
는 앱 인터페이스 삼차원 뷰를 가지며 뷰 속성을 런타임에서 바꿀 수 있는 기능을 제공한다. - 1.6.3
FLEX
는 in-app 디버깅이며 iOS를 위한 탐사 도구이다.
FLEXing은 상태 표시줄을 유지하여 애플리케이션에 FLEX를 로드하는 것을 도와준다.
- 1.6.1Reveal
- 1.1GDB / LLDB
- 2Static analysis
- 2.1Clutch
executable app, plugins, frameworks를 decrypt함. (iOS7 이상에서 지원) - 2.2dumpdecrypted
App Store의 실행가능 앱들은 encrypted 상태다. 이 툴을 이용해 decrypted app 추출 가능.
(또는 weak_classdump를 보라) - 2.3class-dump, class_dump_z, classdump-dyld
class-dump와 class_dump_z는 클래스 인터페이스와 함께 헤더 파일을 만든다. (최근 binary 기준으로는 class-dump가 더 좋은 성능을 띈다.) 이는 어떤 메서드가 존재하는지, 주어진 기능을 얻기 위해 어떤 메서드에 후킹을 해야하는지 추측하는데 도움을 준다.
iOS의 모든 default libraries는 성능 향상을 위해 큰 캐시에 결합된다. (/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX) private frameworks를 클래스덤프하기를 원한다면 Xcode도 설치한 후 위의 툴들을 이용해 class-dump 해야한다. 혹은 classdump-dyld를 사용.(당연한 얘기지만) 결과 파일은 원본과는 다르다. 사용 시 주의.
이미 다른 개발자들이 해놓은 자료들이 저장된 곳.
iOS-Runtime-Headers
iphoneheaders
developer.limneos.net 2.4Disassemblers
바이너리를 어셈블리 수준으로 상세하게 분석할 때 디스어셈블러 사용. ARM과 x86은 많이 다름. App Store의 어플리케이션을 분석하기를 원한다면 decrypted 상태여야 한다.- 2.4.1IDA
(생략)
dyld_shared_cache를 분석할 때 Deep Instinct의 dsc_fix.py script가 dyid_shared_cache로부터 추출된 라이브러리 안의 외부 참조를 수정할 때 유용하다. - 2.4.2Hopper
IDA보다는 작은 부분집합을 지원함. 깔끔한 인터페이스. 하지만 IDA의 결과보다는 덜 하다. - 2.4.3otool
오브젝트 파일 혹은 라이브러리의 특정 부분을 보여준다. 이 역시 디스어셈블 가능.
- 2.4.1IDA
- 2.5strings
는 바이너리의 모든 스트링을 출력하는 간단한 유틸리티 - 2.6nm
는 바이너리의 심볼 테이블을 출력하는 유틸리티
- 2.1Clutch
http://iphonedevwiki.net/index.php/Reverse_Engineering_Tools
반응형
'iOS 앱 점검(ObjC)' 카테고리의 다른 글
iOS 아키텍처 패턴 - MVP (1) | 2019.05.20 |
---|---|
iOS 아키텍처 패턴 - Apple's MVC (0) | 2019.05.20 |
iOS 아키텍처 패턴 - Classic MVC (0) | 2019.05.20 |
iOS 아키텍처 패턴 - 개요 (1) | 2019.05.20 |
xcode simulator 명령어 기록 (0) | 2019.01.17 |