본문 바로가기

iOS 앱 점검(ObjC)

IOS 리버싱 툴

반응형
  • 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를 이용해 할 수 있는 것들이다. 

      1. 실행중인 프로세스에 후킹할 수 있고 사용되는 클래스의 이름을 찾을 수 있다. 예를 들어, 뷰 컨트롤러, 내부 라이브러리, 서드 파티 라이브러리, 모든 함수의 이름들이 있다. 
      2. 뷰 컨트롤러, 앱 델리게이트등 특정 클래스에서, 사용중인 모든 함수의 이름을 찾을 수 있다.
      3. 모든 인스턴스 변수들의 이름을 찾을 수 있고 애플리케이션의 런타임 중 특정 시점에 변수의 값을 확인할 수 있다.
      4. 런타임중에 인스턴스 변수의 값을 수정할 수 있다.
      5. 함수 패치(Method Swizzling)를 할 수 있다. 예를 들어, 특정 함수의 구현을 다른 내용으로 바꿀 수 있다.
      6. 애플리케이션 실행 중에 애플리케이션의 실제 코드 동작 없이 어떤 함수라도 호출할 수 있다.
      7. 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.6Runtime View Debugging

      • 1.6.1Reveal
        Reveal은 고급 시각화, 포괄적 점검원, 실행 상태에서(on the fly) 어플리케이션을 수정할 능력을 제공한다. 따라서 보기 레이아웃과 렌더링 문제를 몇 초안에 디버깅 할 수 있을 것이다.
        - Reveal Loader는 동적으로 libReveal.dylib을 로드한다.
      • 1.6.2Spark Inspector
        는 앱 인터페이스 삼차원 뷰를 가지며 뷰 속성을 런타임에서 바꿀 수 있는 기능을 제공한다.
      • 1.6.3

        FLEX
        는 in-app 디버깅이며 iOS를 위한 탐사 도구이다.
        FLEXing은 상태 표시줄을 유지하여 애플리케이션에 FLEX를 로드하는 것을 도와준다.
  • 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.5strings
      는 바이너리의 모든 스트링을 출력하는 간단한 유틸리티

    • 2.6nm
      는 바이너리의 심볼 테이블을 출력하는 유틸리티

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