카테고리 없음

[iOS] 간단한 앱 만들기와 리버스 엔지니어링

애기공룡훈련병 2025. 2. 17. 11:00
반응형

이번 포스트에서는 SwiftUI를 이용해 간단한 계산기 앱을 만들고, 이를 리버스 엔지니어링하여 소스 코드를 추출하는 과정을 다뤄보겠습니다. 초보자도 따라 할 수 있도록 최대한 자세하게 설명하겠습니다.

SwiftUI로 계산기 앱 개발하기

프로젝트 생성

  1. Xcode 열기
    • Xcode를 실행하고, "Create a new Xcode project"를 선택합니다.
  2. 프로젝트 설정
    • "App"을 선택하고, 프로젝트 이름을 SimpleCalculator로 설정합니다.
    • Language는 Swift, Interface는 SwiftUI로 설정합니다.

UI 및 코드 작성

import SwiftUI

struct ContentView: View {
    @State private var currentNumber = ""
    @State private var previousNumber = ""
    @State private var operation = ""
    @State private var result = "0"

    let buttons = [
        ["7", "8", "9", "÷"],
        ["4", "5", "6", "×"],
        ["1", "2", "3", "-"],
        ["0", "=", "+"]
    ]

    var body: some View {
        VStack {
            Text(result)
                .font(.largeTitle)
                .padding()
            
            ForEach(buttons, id: \ .self) { row in
                HStack {
                    ForEach(row, id: \ .self) { button in
                        Button(action: {
                            buttonPressed(button)
                        }) {
                            Text(button)
                                .font(.title)
                                .frame(width: 70, height: 70)
                                .background(Color.gray.opacity(0.2))
                                .cornerRadius(10)
                        }
                    }
                }
            }
        }
    }

    func buttonPressed(_ button: String) {
        if ["+", "-", "×", "÷"].contains(button) {
            operation = button
            previousNumber = currentNumber
            currentNumber = ""
        } else if button == "=" {
            let num1 = Double(previousNumber) ?? 0
            let num2 = Double(currentNumber) ?? 0
            
            switch operation {
            case "+": result = String(num1 + num2)
            case "-": result = String(num1 - num2)
            case "×": result = String(num1 * num2)
            case "÷": result = String(num1 / num2)
            default: break
            }
            currentNumber = ""
            previousNumber = ""
        } else {
            currentNumber += button
            result = currentNumber
        }
    }
}

리버스 엔지니어링 과정

IPA 파일 추출

  1. Xcode에서 앱을 빌드하고 시뮬레이터에 설치합니다.
  2. ~/Library/Developer/CoreSimulator/Devices/ 경로에서 설치된 앱의 .app 파일을 찾습니다.
  3. .app 파일을 .ipa로 변환합니다.

디컴파일 및 분석

  • class-dump, Hopper, Ghidra 등의 도구를 활용해 바이너리를 분석합니다.
  • frida, cycript 등을 활용해 런타임에서 함수 호출을 추적할 수도 있습니다.

class-dump 사용 방법

class-dump -H SimpleCalculator.app/SimpleCalculator -o OutputDirectory

 

Hopper 사용 방법

  1. Hopper를 실행하고 .ipa 파일을 엽니다.
  2. 디컴파일된 코드를 확인하고 필요한 부분을 분석합니다.

Frida를 활용한 동적 분석

frida -U -n SimpleCalculator -i
  • Frida를 사용하면 런타임에서 특정 메서드를 후킹하여 실행 흐름을 변경할 수 있습니다.
  • iOS에서 코드 난독화나 암호화를 분석하는 데 유용합니다.

 

이번 포스트에서는 SwiftUI를 이용해 간단한 계산기 앱을 만들고 이를 리버스 엔지니어링하는 과정을 살펴보았습니다. 디컴파일 과정과 동적 분석 도구를 활용하면 앱 내부 구조를 더욱 효과적으로 분석할 수 있습니다. 단, 리버스 엔지니어링은 저작권 문제를 반드시 고려해야 합니다.

반응형