
AI-powered reverse-engineering of Rosetta (2 for Linux). Disclaimer: due to the user agreement, I will not touch the code. All is done by AI, so there might be messy implementation.
Apple의 Rosetta 2 바이너리 변환 기술을 이해하고 문서화하기 위한 포괄적인 리버스 엔지니어링 프로젝트입니다.
2020년 11월, Apple은 첫 Apple Silicon Mac을 발표하며 Intel x86_64 프로세서에서 자체 ARM 기반 M1 칩으로의 역사적인 전환을 알렸습니다. 이는 Apple의 세 번째 주요 아키텍처 전환이었습니다:
각 전환 과정에서는 마이그레이션 기간 동안 기존 소프트웨어를 실행할 수 있는 바이너리 변환 솔루션이 필요했습니다. Rosetta 2는 현재까지 Apple의 가장 정교한 바이너리 변환 시스템입니다.
Rosetta(2006~2011)는 Apple의 첫 동적 바이너리 변환 소프트웨어로, PowerPC 애플리케이션이 Intel 기반 Mac에서 실행될 수 있도록 해주었습니다.
Rosetta는 Mac OS X 10.7(Lion)에서 제거되어 Intel 전환이 완료되었습니다.
Rosetta 2는 Intel x86_64 Mac용으로 컴파일된 애플리케이션이 Apple Silicon(ARM64) Mac에서 실행될 수 있도록 해주는 Apple의 고급 동적 바이너리 변환 기술입니다.
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### 주요 기술
1. **Ahead-of-Time (AOT) 변환**
- 설치 시 x86_64 바이너리를 ARM64로 변환합니다
- 번역된 코드를 캐시에 저장하여 이후 실행 속도를 높입니다
- 순수 JIT 변환에 비해 런타임 오버헤드를 줄입니다
2. **Just-in-Time (JIT) 변환**
- 실행 중 필요에 따라 코드 블록을 변환합니다
- 동적 로드 코드와 자가 수정 코드를 처리합니다
- 효율성을 위해 변환 캐시를 유지합니다
3. **명령어 집합 변환**
- x86_64 → ARM64 명령어 매핑
- SSE/AVX → NEON 벡터 명령어 변환
- x86_64 플래그 → ARM64 조건 코드
4. **시스템 호출 변환**
- x86_64 macOS 시스템 호출을 ARM64 해당 호출로 변환합니다
- 서로 다른 호출 규칙을 처리합니다
- 시스템 호출 경계를 넘어 레지스터 상태를 관리합니다
5. **런타임 지원**
- CPU 기능 감지 에뮬레이션
- 스레드 지역 저장소 처리
- 시그널 및 예외 처리
---
## Apple이 macOS에서 Rosetta 2를 제공하는 방법
### 설치 위치
Rosetta 2는 다음 위치에 있습니다:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
oah 디렉토리는 "Old Architecture Hardware"(구형 아키텍처 하드웨어)를 의미하며, PowerPC 전환 시대에서 이어진 용어입니다.
Apple Silicon Mac에서 Rosetta 2는 기본적으로 설치되지 않습니다. 다음 두 가지 방식으로 설치가 시작됩니다:
| Component | Description |
|---|---|
RosettaLinux/rosetta | 번역 엔진을 포함하는 핵심 ARM64 바이너리 |
RosettaLinux/rosettad | 번역 서비스를 관리하는 시스템 데몬 |
debugserver -> /usr/libexec/rosetta/debugserver | 번역된 프로세스의 디버깅 지원 |
libRosettaRuntime | 번역 중에 연결되는 런타임 라이브러리 |
translate_tool -> /usr/libexec/rosetta/translate_tool | 번역된 바이너리를 빌드하기 위한 번역 도구 |
┌──────────────────────────────────────────────────────────────────┐ │ Phase 1: Binary Loading │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Load x86_64 Mach-O binary │ │ 2. Parse segments, sections, symbols │ │ 3. Validate code signatures │ │ 4. Map into translation context │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Phase 2: AOT Translation │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Disassemble x86_64 code sections │ │ 2. Translate instructions to ARM64 │ │ 3. Apply optimizations │ │ 4. Store in translation cache (~/.oah) │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ Phase 3: Runtime Execution │ │ ─────────────────────────────────────────────────────────────── │ │ 1. Load translated ARM64 code │ │ 2. Set up x86_64 emulation context │ │ 3. Handle JIT translations for dynamic code │ │ 4. Translate syscalls on-the-fly │ └──────────────────────────────────────────────────────────────────┘
### 주요 변환 과제
1. **레지스터 매핑**
- x86_64는 16개의 GPR을 가지고, ARM64는 31개의 GPR을 가짐
- x86_64 플래그 레지스터 -> ARM64 NZCV 플래그
- RIP (명령어 포인터) 에뮬레이션
2. **메모리 순서**
- x86_64: 강한 메모리 순서 (TSO)
- ARM64: 약한 메모리 순서
- 정확성을 위해 메모리 배리어 필요
3. **벡터 명령어**
- SSE (128비트) -> NEON (128비트) 직접 매핑
- AVX (256비트) -> NEON 쌍 에뮬레이션
- SIMD에 대한 예외 처리 방식이 다름
4. **호출 규약**
- x86_64: 처음 6개 인자를 레지스터로 전달 (RDI, RSI, RDX, RCX, R8, R9)
- ARM64: 처음 8개 인자를 레지스터로 전달 (X0-X7)
- 스택 프레임 배치 방식이 다름
---
## 이 프로젝트
이 저장소는 Rosetta 2 바이너리에서 추출한 함수들의 역공학 구현체를 포함합니다. 세심한 분석과 디컴파일을 통해 수백 개의 함수에 대한 의미론적 목적을 식별하고 문서화했습니다.
### 목표
1. **교육**: Rosetta 2가 내부적으로 어떻게 작동하는지 이해
2. **문서화**: 변환 기술에 대한 포괄적인 문서 작성
3. **구현**: 깔끔하고 잘 문서화된 C 구현체 제공
4. **커뮤니티**: 역공학 커뮤니티와 지식 공유
### 우리가 이룬 성과
- **828개 함수** 식별 및 주요 `rosetta` 바이너리에서 이름 부여
- **612개 함수** 깔끔한 C 코드로 완전히 구현
- **66개 범주**의 기능 문서화
- 의미론적 이름이 포함된 완전한 함수 이름 매핑
### 함수 범주
| 범주 | 함수 수 | 설명 |
|----------|-----------|-------------|
| 진입점 | 1 | Rosetta 초기화 |
| 부동소수점/벡터 연산 | ~20 | 부동소수점 및 SIMD 상태 관리 |
| SIMD 메모리 연산 | ~10 | SIMD를 사용한 memchr, memcmp, memcpy |
| 벡터 연산 | ~30 | NEON 벡터 산술, 비교 |
| 이진 변환 | ~50 | x86_64 -> ARM64 명령어 변환 |
| 시스템 콜 핸들러 | ~60 | 시스템 콜 변환 및 전달 |
| 메모리 관리 | ~20 | malloc, free, mmap 래퍼 |
| 해시 함수 | ~5 | 변환 캐시를 위한 주소 해싱 |
| 문자열 연산 | ~30 | SIMD 최적화 문자열 함수 |
| 암호화 확장 | ~30 | AES, SHA, CRC32 통과 |
| ELF 파싱 | ~15 | 리눅스 바이너리 형식 지원 |
| 변환 캐시 | ~20 | AOT/JIT 캐시 관리 |
---
## 파일 구조