반응형
이번 포스트에서는 SwiftUI를 이용해 간단한 계산기 앱을 만들고, 이를 리버스 엔지니어링하여 소스 코드를 추출하는 과정을 다뤄보겠습니다. 초보자도 따라 할 수 있도록 최대한 자세하게 설명하겠습니다.
SwiftUI로 계산기 앱 개발하기
프로젝트 생성
- Xcode 열기
- Xcode를 실행하고, "Create a new Xcode project"를 선택합니다.
- 프로젝트 설정
- "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 파일 추출
- Xcode에서 앱을 빌드하고 시뮬레이터에 설치합니다.
- ~/Library/Developer/CoreSimulator/Devices/ 경로에서 설치된 앱의 .app 파일을 찾습니다.
- .app 파일을 .ipa로 변환합니다.
디컴파일 및 분석
- class-dump, Hopper, Ghidra 등의 도구를 활용해 바이너리를 분석합니다.
- frida, cycript 등을 활용해 런타임에서 함수 호출을 추적할 수도 있습니다.
class-dump 사용 방법
class-dump -H SimpleCalculator.app/SimpleCalculator -o OutputDirectory
Hopper 사용 방법
- Hopper를 실행하고 .ipa 파일을 엽니다.
- 디컴파일된 코드를 확인하고 필요한 부분을 분석합니다.
Frida를 활용한 동적 분석
frida -U -n SimpleCalculator -i
- Frida를 사용하면 런타임에서 특정 메서드를 후킹하여 실행 흐름을 변경할 수 있습니다.
- iOS에서 코드 난독화나 암호화를 분석하는 데 유용합니다.
이번 포스트에서는 SwiftUI를 이용해 간단한 계산기 앱을 만들고 이를 리버스 엔지니어링하는 과정을 살펴보았습니다. 디컴파일 과정과 동적 분석 도구를 활용하면 앱 내부 구조를 더욱 효과적으로 분석할 수 있습니다. 단, 리버스 엔지니어링은 저작권 문제를 반드시 고려해야 합니다.
반응형