[ 본 포스팅은 언패킹(리버스 엔지니어링)에 대한 내용으로 관련 법률에 유의하시기 바랍니다. ]
iPA
iOS App-Store Package 의 줄임말으로 iOS 및 ipad 어플리케이션 아카이브 파일입니다. 모든 앱은 IPA 형태로 앱스토어에 배포가 됩니다. 개발한 코드와 함께 번들, 사이닝, 리소스 파일등이 모두 포함됩니다.
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 되어 실행 파일에 포함됩니다. )
Mach-O
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 |