AI 요약
본 기사는 2024년 7월 20일, 저자가 휴가 중 Adriatic Sea 인근에서 진행한 macOS 코드 주입 실험을 상세히 기록한 기술 블로그입니다. 저자는 Windows, Xbox 등에서 사용되는 C/C++ 핫리로드 솔루션인 'Live++(Stefan Reinalter 개발)'의 편의성을 macOS에서도 구현해보고자 이번 프로젝트를 시작했습니다. 실험의 핵심은 실행 중인 대상 프로그램에 디버거처럼 부착하여 메모리 내 변수 값을 변경하거나, 기존 함수를 완전히 새로운 코드로 대체하는 것입니다. 이를 위해 macOS의 저수준 시스템 API인 Mach API를 활용했으며, CMake 설정부터 코드 서명(codesign) 및 권한(entitlements) 부여까지의 전 과정을 설명합니다. 특히 컴파일 시 함수 시작 부분에 여유 공간을 만드는 특정 플래그를 사용하는 등 실전적인 트릭을 포함하고 있습니다.
핵심 인사이트
- Live++의 영향: Stefan Reinalter가 개발한 Windows용 핫리로드 도구 Live++의 효율성을 macOS로 이식하려는 시도에서 프로젝트가 시작되었습니다.
- Mach API 활용: macOS 전용 API인
task_for_pid()등을 사용하여 프로세스 제어 및 메모리 접근을 수행했습니다. - 컴파일러 전략: 실시간 함수 교체를 위해
-fpatchable-function-entry=4,0플래그를 사용하여 함수 진입점에 수정 가능한 공간을 확보했습니다. - 보안 및 권한: macOS의 보안 정책을 통과하기 위해
codesign명령어를 통한 바이너리 서명과entitlements.plist설정이 필수적임을 명시했습니다.
주요 디테일
- 시스템 타겟: CMake 설정에서
CMAKE_OSX_DEPLOYMENT_TARGET을 "10.14"로 설정하고 C++17 표준을 적용했습니다. - 최적화 제외: 정확한 주소 추적과 분석을 위해
-O0 -g플래그를 사용하여 디버그 빌드를 생성했습니다. - 주입 프로세스: 실행 중인 프로세스 부착(Attaching), 프로세스 일시 정지(Suspending), 메모리 읽기/쓰기, 코드 주입 및 실행 재개의 단계로 진행됩니다.
- 테스트 케이스:
int data = 123;을 출력하는 무한 루프 프로그램의 메모리를 조작하여 출력값을 실시간으로 변경하는 데 성공했습니다. - 코드 서명 자동화: POST_BUILD 명령을 통해
Apple Development인증서로 자동 서명되도록 CMake 구성을 설계했습니다.
향후 전망
- macOS 개발 툴체인 확장: 이 기법을 고도화하면 macOS용 독자적인 C++ 핫리로드 개발 도구 제작의 기반 기술로 활용될 수 있습니다.
- 보안 패치와의 경쟁: Apple이 시스템 무결성 보호(SIP)를 강화함에 따라 이러한 Mach API 기반 접근 방식에 대한 제약이 늘어날 수 있어 지속적인 우회 및 대응 연구가 예상됩니다.
