
루팅 우회를 하다 보면, IDA Pro나 Ghidra 같은 디스어셈블러의 함수 목록에서 +[ClassName MethodName] 또는 -[ClassName MethodName]과 같은 독특한 표기법을 자주 접하게 됩니다.
이 기호들은 단순한 GUI 아이콘이 아니라, 해당 함수가 어떤 타입의 메서드인지, 그리고 바이너리가 주로 Objective-C 기반임을 알려주는 중요한 단서입니다. 이 표기법을 정확히 이해하는 것은 성공적인 후킹(Hooking) 및 분기문 우회 전략을 수립하는 첫걸음입니다.
1. [+]와 [-] 기호, 그 근본적인 차이
이 기호들은 **객체 지향 프로그래밍(OOP)**의 핵심 개념인 **클래스 메서드(Class Method)**와 **인스턴스 메서드(Instance Method)**를 나타냅니다.
| 기호 | Objective-C 용어 | OOP 개념 | 설명 |
| + | 클래스 메서드 (Class Method) | 정적(Static) 메서드 | 특정 객체(인스턴스)를 생성하지 않고 클래스 자체에 소속되어 호출되는 기능입니다. 환경 변수 확인, 공통 유틸리티 기능 등 전역적인 처리에 사용됩니다. |
| - | 인스턴스 메서드 (Instance Method) | 동적(Dynamic) 메서드 | 반드시 객체(인스턴스)를 생성해야만 호출할 수 있는 기능입니다. 특정 객체의 내부 상태를 조작하거나 확인하는 개별적인 업무 처리에 사용됩니다. |
예시: +[SystemUtil isJailBroken]는 SystemUtil 클래스에 "전체 시스템 상태가 탈옥이니?"라고 묻는 것이고, -[AFSDKChecksum calculateV2Sa...]는 특정 AFSDKChecksum 객체에게 "너의 체크섬을 계산하라"고 지시하는 것입니다.
2. 분기문 우회(Hooking) 전략: 왜 [-]가 유리한가?
"분기문 우회는 - 메서드에 집중하는 것이 좋다"는 조언은 매우 실용적입니다. 이는 Objective-C 런타임의 Method Swizzling 기법과 보안 로직의 특성 때문입니다.
A. 후킹 기법의 용이성
Objective-C 바이너리 후킹의 표준 기법인 Method Swizzling은 **인스턴스 메서드(-)**에 대해 가장 간결하고 표준적으로 적용될 수 있습니다.
- - 메서드: 인스턴스 메서드는 objc_getClass 함수로 클래스를 얻어낸 후, 해당 클래스의 Method 포인터를 class_getInstanceMethod 함수로 쉽게 찾아 재정의할 수 있습니다.
- + 메서드: 클래스 메서드 역시 후킹이 가능하지만, 때때로 호출 방식이 다르거나 컴파일러에 의해 인라인(Inline) 최적화되어 있어 인스턴스 메서드보다 다소 복잡한 접근이 필요할 수 있습니다.
B. 로직의 집중 지점
보안 라이브러리(예: 안티-디버깅)는 종종 특정 객체를 생성하여 그 객체의 상태를 이용해 보안 검증을 수행합니다.
- 예를 들어, 보안 라이브러리가 SecurityManager 객체를 만들고 -[SecurityManager isConfigurationSafe]와 같은 - 메서드를 통해 분기문을 발생시킵니다.
- 이때 해당 - 메서드를 후킹하여 무조건 $\text{True}$를 반환하게 만들면, 객체의 상태를 "안전함"으로 속여 분기문을 손쉽게 통과할 수 있습니다.
3. 우회 전략의 결론: 두 마리 토끼 잡기
실제 우회 작업에서는 +와 -를 모두 고려해야 합니다.
- 1순위 (+): 전역적인 탈옥/디버깅 확인 함수에 주목하세요. +[SystemUtil isJailBroken], +[Codeguard isJailBroken] 등은 앱 실행 초기에 호출되어 앱을 즉시 종료시키는 Kill Switch 역할을 할 가능성이 높습니다.
- 2순위 (-): 중요한 검증 로직 및 데이터 조작에 주목하세요. -[AFSDKChecksum calculate...]와 같이 체크섬이나 무결성 검증을 수행하는 - 메서드를 후킹하여 검증 로직이 요구하는 '정상 값'을 강제로 반환하게 만드는 것이 핵심 우회 작업이 됩니다.
[+]와 [-]는 단순한 구분이 아닌, 해당 함수의 책임 영역(Scope)을 나타내는 중요한 단서입니다. 이 정보를 활용하여 전략적으로 후킹 지점을 선택한다면, 리버스 엔지니어링 효율을 크게 높일 수 있을 것입니다.