heoblitz
Blitz.dev
heoblitz
전체 방문자
오늘
어제
  • 분류 전체보기 (36)
    • iOS Dev (22)
      • iOS (3)
      • Swift (7)
      • Testing (3)
      • Reactive (2)
      • Architecture (2)
      • Layout (1)
    • PS (4)
      • Algorithm (4)
    • Other (9)
      • Springboot (3)
      • Linux (1)
      • Python (1)
      • Java (1)
      • React (1)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • Code Review
  • swift 5
  • URLSession
  • java
  • IOS
  • SWIFT
  • codingtest
  • github
  • 오픈소스
  • Test Code
  • springboot
  • gradle
  • intellij
  • xcode
  • Git
  • ARC
  • XCTest
  • chrome-extension
  • RxSwift
  • swift 윈도우

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
heoblitz

Blitz.dev

정적 분석으로 iOS 앱 구조 파악하기
iOS Dev/iOS

정적 분석으로 iOS 앱 구조 파악하기

2022. 12. 3. 05:43

Photo by Robin Glauser on Unsplash

[ 본 포스팅은 언패킹(리버스 엔지니어링)에 대한 내용으로 관련 법률에 유의하시기 바랍니다. ]

 

iPA

iOS App-Store Package 의 줄임말으로 iOS 및 ipad 어플리케이션 아카이브 파일입니다. 모든 앱은 IPA 형태로 앱스토어에 배포가 됩니다. 개발한 코드와 함께 번들, 사이닝, 리소스 파일등이 모두 포함됩니다. 

 

https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

 

 

iPA 다운 받기

앱스토어에 올라가 있는 앱의 iPA 를 얻기 위해 ipatool 을 사용해보겠습니다. ( 다른 방법으로 3utools, Xcode 아카이브, 탈옥된 iOS 기기를 통해 얻을 수 있습니다. )

 

// ipatool 설치
brew tap majd/repo
brew install ipatool

// ipatool 로그인
ipatool auth login --email test@apple.com --password testPassword
// 앱스토어에서 키워드로 검색
ipatool search kickstarter

// 번들 ID 로 IPA 다운 받기
ipatool download -b com.kickstarter.kickstarter

 

 

 

정적 분석

Apache License 2.0 로 공개되어 있는 kickstarter-iOS 앱을 분석해보겠습니다. 다운 받은 ipa 확장자를 zip 으로 변경하고 압축을 풉니다. 

 

com.kickstarter -> Payload 폴더에 들어간 후, Kickstarter.app 에서 패키지 내용 보기를 누릅니다.

 

 

iPA 구조

1. ( root ) /

메인 번들 폴더입니다. 실행 파일과 함께 앱 아이콘과 컴파일된 스토리 보드 파일이 있습니다. 또한 별도로 분리해서 사용하는 번들 파일들도 볼 수 있습니다.


2. _CodeSignature

코드 서명과 관련된 폴더입니다.

 

3. Frameworks

 

Embed 되는 Dynamic Framework 가 모여있는 폴더입니다.

( * Static Framework 의 경우 Linking 되어 실행 파일에 포함됩니다. ) 

 

Frameworks 폴더에서 보이는 KsApi 는 Dynamic Framework 임을 확인할 수 있습니다.

 

 

 

Mach-O

https://github.com/aidansteele/osx-abi-macho-file-format-reference/blob/master/Mach-O_File_Format.pdf

 

iPA > Payload 폴더에 있는 앱 실행파일

 

Mach Object file format 의 줄임말으로서 Mach 커널을 사용하는 OS 의 실행 파일, 오브젝트 파일, 공유 라이브러리에 사용되는 파일 포맷입니다.

 

내부 구조는 크게 Header, Load commands, Data 로 구분되어 있습니다. 각 섹션에 어떤 정보가 있는지 파악해보겠습니다.

 

 

 

 

Mach-O Header

file 은 해당 바이너리가 어떤 정보를 가지고 있는지를 보여주는 명령어입니다.

file Kickstarter

arm64 아키텍처를 지원하는 실행파일임을 확인할 수 있습니다.

 

 

 

Load commands

otool 은 오브젝트 파일과 라이브러리를 분석할 수 있는 툴입니다. 아래와 같은 명령어를 통해 앱에서 어떤 정적/동적 라이브러리를 사용했는지 유추할 수 있습니다.

otool -L Kickstarter

( @rpath 가 없더라도 dynamic 프레임워크일 수 있습니다. 시스템 프레임워크의 경우에는 절대 경로를 사용합니다. )

 

 

 

 

Data

컴파일된 바이너리의 로직을 분석하기 위해 Disassembler 툴을 사용할 수 있습니다. ( Hopper, IDA Pro, Ghidra.. )

 

위와 같은 분석을 방지하기 위해 LINE 에서는 ORK 라는 난독화 컴파일러를 만들어서 사용하고 있습니다.

https://engineering.linecorp.com/ko/blog/code-obfuscation-compiler-tool-ork-1/

 

 

Disassembler 툴을 사용하면 코드가 공개되지 않은 바이너리 파일의 동작을 분석할 수 있습니다.

 

( UIKit 버그 파악하기 관련 게시글 )

https://pspdfkit.com/blog/2021/reverse-engineering-uikit/

https://medium.com/bumble-tech/using-hopper-to-investigate-an-ios-bug-66d373e6336d

 



참고:

https://ss64.com/osx/lipo.html

https://minsone.github.io/ios/mac/ios-framework-part-1-static-framework-dynamic-framework

레츠스위프트 2022, iOS 개발에서 알아두면 좋은 것들

'iOS Dev > iOS' 카테고리의 다른 글

8개월간 같은 iOS 앱을 리팩토링하며 배운점  (6) 2021.11.20
iOS Dependency Injection 개념 파악하기  (0) 2021.11.03
    'iOS Dev/iOS' 카테고리의 다른 글
    • 8개월간 같은 iOS 앱을 리팩토링하며 배운점
    • iOS Dependency Injection 개념 파악하기
    heoblitz
    heoblitz
    iOS, Swift 관련 포스팅을 주로 작성합니다.

    티스토리툴바