
Reverse engineering assisté par IA de Rosetta (2 pour Linux). Avertissement : en raison de l'accord d'utilisation, je ne toucherai pas au code. Tout est fait par l'IA, donc l'implémentation pourrait être brouillonne.
Un effort complet de rétro-ingénierie pour comprendre et documenter la technologie de traduction binaire Rosetta 2 d'Apple.
En novembre 2020, Apple a annoncé leurs premiers Mac Apple Silicon, marquant une transition historique des processeurs Intel x86_64 vers leurs propres puces M1 basées sur ARM. Il s'agissait de la troisième transition majeure d'architecture d'Apple :
Chaque transition a nécessité une solution de traduction binaire pour faire fonctionner les logiciels existants pendant la période de migration. Rosetta 2 est le système de traduction binaire le plus sophistiqué d'Apple à ce jour.
Rosetta (2006-2011) était le premier logiciel de traduction binaire dynamique d'Apple, permettant aux applications PowerPC de fonctionner sur les Mac Intel.
Rosetta a été supprimée dans Mac OS X 10.7 (Lion), achevant la transition Intel.
Rosetta 2 est la technologie avancée de traduction binaire dynamique d'Apple qui permet aux applications compilées pour les Mac Intel x86_64 de fonctionner sur les Mac Apple Silicon (ARM64).
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Technologies clés
1. **Traduction Ahead-of-Time (AOT)**
- Traduit les binaires x86_64 en ARM64 lors de l'installation
- Stocke le code traduit dans un cache pour des lancements ultérieurs plus rapides
- Réduit la surcharge d'exécution par rapport à la traduction JIT pure
2. **Traduction Just-in-Time (JIT)**
- Traduit les blocs de code à la demande pendant l'exécution
- Gère le code chargé dynamiquement et le code auto-modifiant
- Maintient un cache de traduction pour l'efficacité
3. **Traduction du jeu d'instructions**
- Correspondance des instructions x86_64 -> ARM64
- Traduction des instructions vectorielles SSE/AVX -> NEON
- Drapeaux x86_64 -> codes de condition ARM64
4. **Traduction des appels système**
- Traduit les appels système macOS x86_64 en équivalents ARM64
- Gère les différentes conventions d'appel
- Gère l'état des registres entre les appels système
5. **Prise en charge de l'exécution**
- Émulation de la détection des fonctionnalités du processeur
- Gestion du stockage local de thread
- Gestion des signaux et des exceptions
---
## Comment Apple livre Rosetta 2 dans macOS
### Emplacement de l'installation
Rosetta 2 se trouve à :```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
Le répertoire oah signifie "Old Architecture Hardware" - une continuité de l'époque de la transition PowerPC.
Sur les Mac Apple Silicon, Rosetta 2 n'est pas installé par défaut. Il est déclenché de deux manières :
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Défis Clés de la Traduction
1. **Correspondance des Registres**
- x86_64 possède 16 GPR ; ARM64 en possède 31
- Registre de flags x86_64 -> Flags NZCV ARM64
- Émulation du RIP (pointeur d'instruction)
2. **Ordonnancement Mémoire**
- x86_64 : Ordonnancement mémoire fort (TSO)
- ARM64 : Ordonnancement mémoire faible
- Nécessite des barrières mémoire pour la correction
3. **Instructions Vectorielles**
- SSE (128 bits) -> Correspondance directe NEON (128 bits)
- AVX (256 bits) -> Émulation par paires NEON
- Gestion d'exceptions différente pour le SIMD
4. **Conventions d'Appel**
- x86_64 : 6 premiers arguments dans des registres (RDI, RSI, RDX, RCX, R8, R9)
- ARM64 : 8 premiers arguments dans des registres (X0-X7)
- Dispositions de pile différentes
---
## Ce Projet
Ce dépôt contient des implémentations rétro-conçues de fonctions issues des binaires de Rosetta 2. Grâce à une analyse minutieuse et à la décompilation, nous avons identifié et documenté le but sémantique de centaines de fonctions.
### Objectifs
1. **Pédagogique** : Comprendre le fonctionnement interne de Rosetta 2
2. **Documentation** : Créer une documentation complète des techniques de traduction
3. **Implémentation** : Fournir des implémentations C propres et bien documentées
4. **Communauté** : Partager les connaissances avec la communauté de l'ingénierie inverse
### Ce Que Nous Avons Accompli
- **828 fonctions** identifiées et nommées dans le binaire principal `rosetta`
- **612 fonctions** entièrement implémentées avec un code C propre
- **66 catégories** de fonctionnalités documentées
- Correspondances complètes des noms de fonctions avec des noms sémantiques
### Catégories de Fonctions
| Catégorie | Fonctions | Description |
|-----------|-----------|-------------|
| Point d'entrée | 1 | Initialisation de Rosetta |
| Opérations FP/Vecteurs | ~20 | Gestion de l'état flottant et SIMD |
| Opérations Mémoire SIMD | ~10 | memchr, memcmp, memcpy avec SIMD |
| Opérations Vectorielles | ~30 | Arithmétique vectorielle NEON, comparaison |
| Traduction Binaire | ~50 | Traduction d'instructions x86_64 -> ARM64 |
| Gestionnaires d'Appels Système | ~60 | Traduction et transmission des appels système |
| Gestion Mémoire | ~20 | Wrappers pour malloc, free, mmap |
| Fonctions de Hachage | ~5 | Hachage d'adresse pour le cache de traduction |
| Opérations sur Chaînes | ~30 | Fonctions chaînes optimisées SIMD |
| Extensions Cryptographiques | ~30 | Passage direct AES, SHA, CRC32 |
| Analyse ELF | ~15 | Support du format binaire Linux |
| Cache de Traduction | ~20 | Gestion du cache AOT/JIT |
---
## Structure des Fichiers
### Fichiers Principaux```
Rosetta2/
├── README.md # This file
├── rosetta_decomp.c # Original decompilation (74,677 lines)
├── rosettad_decomp.c # Daemon decompilation (44,064 lines)
├── rosetta_refactored.c # Minimal wrapper (59 lines) - includes modular headers
├── rosetta_refactored.c.legacy # Legacy refactored code (19,302 lines) - archived
├── rosetta_refactored.h # Main header (1,215 lines)
├── rosetta_refactored_complete.c # Single-file implementation (2,686 lines)
├── rosetta_function_map.h # Function name mapping (828 functions)
├── rosettad_refactored.c # Daemon-side refactoring
└── SESSION_*.md # Session logs (30+ sessions)
L'infrastructure de traduction est entièrement modulaire et organisée en composants catégorisés :``` ├── rosetta_types.h # Base type definitions ├── rosetta_x86_decode.h/.c # x86 decoder ├── rosetta_arm64_emit.h/.c # ARM64 emitter ├── rosetta_translate_alu.h/.c # ALU translations ├── rosetta_translate_memory.h/.c # Memory translations ├── rosetta_translate_branch.h/.c # Branch translations ├── rosetta_translate_bit.h/.c # Bit manipulation ├── rosetta_translate_string.h/.c # String operations ├── rosetta_translate_special.h/.c # Special instructions ├── rosetta_translate_block.h/.c # Block translation coordinator ├── rosetta_translate_dispatch.h/.c # Instruction dispatch ├── rosetta_trans_dispatch.h/.c # Main dispatch layer ├── rosetta_trans_alu.h/.c # ALU emulation layer ├── rosetta_trans_mem.h/.c # Memory emulation layer ├── rosetta_trans_branch.h/.c # Branch emulation layer ├── rosetta_trans_bit.h/.c # Bit emulation layer ├── rosetta_trans_string.h/.c # String emulation layer ├── rosetta_trans_special.h/.c # Special instruction emulation ├── rosetta_trans_system.h/.c # System instruction emulation ├── rosetta_trans_neon.h/.c # NEON emulation layer └── Makefile.modular # Modular build system
### Modules fonctionnels
Modules d'infrastructure de base et de support :```
├── rosetta_jit.h/.c # JIT compilation infrastructure
├── rosetta_exec.h/.c # Execution engine (NEW)
├── rosetta_init.h/.c # Initialization & FP registers (NEW)
├── rosetta_codegen.h/.c # Code generation primitives
├── rosetta_cache.h/.c # Translation cache (AOT/JIT)
├── rosetta_transcache.h/.c # Translation cache management
├── rosetta_context.h/.c # CPU context management
├── rosetta_runtime.h/.c # Runtime support
├── rosetta_hash.h/.c # Address hashing
├── rosetta_memmgmt.h/.c # Memory management
├── rosetta_memory_utils.h/.c # Memory utilities
├── rosetta_utils.h/.c # Utility functions
├── rosetta_string_utils.h/.c # String utilities
├── rosetta_trans_helpers.h/.c # Translation helpers
├── rosetta_refactored_helpers.h/.c # Refactoring helpers
└── rosetta_refactored_types.h # Refactored type definitions
Modules d'opérations SIMD et vectorielles :``` ├── rosetta_simd.h/.c # SIMD operations ├── rosetta_simd_mem.h/.c # SIMD memory operations ├── rosetta_simd_mem_helpers.h/.c # SIMD memory helpers ├── rosetta_vector.h/.c # Vector operations ├── rosetta_refactored_vector.h/.c # Refactored vector ops ├── rosetta_jit_emit.h/.c # JIT emission ├── rosetta_jit_emit_simd.h/.c # SIMD JIT emission ├── rosetta_fp_translate.h/.c # FP translation ├── rosetta_fp_helpers.h/.c # FP helpers ├── rosetta_trans_neon.c # NEON translation └── rosetta_string_simd.c # SIMD string operations
### Syscall Modules
Gestion et traduction des syscalls invités :```
├── rosetta_syscalls.h/.c # Syscall translation core
├── rosetta_syscalls_impl.h/.c # Syscall implementations
└── rosetta_crypto.h/.c # Crypto instructions (AES, SHA, CRC32)
Modules de traduction et de support supplémentaires :``` ├── rosetta_translate.h/.c # Translation core ├── rosetta_translate_alu_impl.h/.c # ALU implementation details ├── rosetta_translate_memory_impl.h/.c # Memory implementation details ├── rosetta_translate_branch_impl.h/.c # Branch implementation details ├── rosetta_translate_special_impl.h/.c # Special implementation details └── rosetta_arm64_insns.h # ARM64 instruction definitions
### Fichiers de test```
├── test_jit.c # JIT unit tests (737 lines)
└── test_translate.c # Translation tests (1,059 lines)
Total : 50+ fichiers sources, ~150 000+ lignes de code
make -f Makefile.modular all
### Construction de composants individuels```bash
# Compile core modules
gcc -c -I. -std=c11 rosetta_types.h
gcc -c -I. -std=c11 rosetta_codegen.c
gcc -c -I. -std=c11 rosetta_jit.c
gcc -c -I. -std=c11 rosetta_x86_decode.c
gcc -c -I. -std=c11 rosetta_arm64_emit.c
# Compile translation modules
gcc -c -I. -std=c11 rosetta_translate_alu.c
gcc -c -I. -std=c11 rosetta_translate_memory.c
gcc -c -I. -std=c11 rosetta_translate_branch.c
gcc -c -I. -std=c11 rosetta_translate_block.c
gcc -c -I. -std=c11 rosetta_translate_dispatch.c
# Compile support modules
gcc -c -I. -std=c11 rosetta_cache.c
gcc -c -I. -std=c11 rosetta_context.c
gcc -c -I. -std=c11 rosetta_syscalls.c
gcc -c -I. -std=c11 rosetta_runtime.c
make -f Makefile.modular test_jit
make -f Makefile.modular test_translate
### Utilisation en tant que bibliothèque```bash
# Link against the static library
gcc -o my_app my_app.c -L. -lrosetta
# Or compile with source files directly
gcc -I. -o my_app my_app.c rosetta_*.c
Le fichier décompilé original rosetta_decomp.c contient des littéraux de chaîne qui révèlent la structure du code source original. Ces noms de fichiers apparaissent dans les messages d'assertion/erreur dans tout le binaire.
Remarque : Le code refactorisé utilise une structure différente, plus modulaire que l'original.
Register.hTaggedPointer.hRedBlackTree.hTransactionalList.hTranslator.hAssemblerBuffer.hBuilderBase.hIrBuilder_x86.hRepatch.cppDecoder.cppFixup.cppAssemblerHelpers.cppOperand.cppOpcode.cppBasicBlock.cppThreadContextFcntl.cppInitStack.cppThread.cppThreadContext.cppThreadContextRuntimeSignals.cppThreadContextVm.cppVMAllocationTracker.cppAssemblerBase.hppTranslatorBase.hppL'infrastructure de traduction est entièrement modularisée en les composants suivants :
Total: 40+ composants modulaires
Ce projet est à des fins éducatives et de recherche uniquement.
Licence MIT - Voir le fichier LICENSE pour plus de détails.
Les contributions sont les bienvenues ! Domaines d'intérêt :
Dernière mise à jour : Février 2026
| Composant | Description |
|---|
RosettaLinux/rosetta | Binaire ARM64 principal contenant le moteur de traduction |
RosettaLinux/rosettad | Daemon système gérant les services de traduction |
debugserver -> /usr/libexec/rosetta/debugserver | Support de débogage pour les processus traduits |
libRosettaRuntime | Bibliothèque d'exécution liée lors de la traduction |
translate_tool -> /usr/libexec/rosetta/translate_tool | Outil de traduction pour construire des binaires traduits |
Vdso.cppProcMapsParser.cppThreadContextSignals.cppThreadContextSyscalls.cppTranslationCacheAot.cppTranslationCacheJit.cppTranslationCache.cppTranslator.cppRuntimeLibraryBridgeInternal.cppTwoLevelOffsetMap.cppDeltaCodedOffsetMap.cpp| Métrique | Valeur |
|---|
| Fonctions totales | 828 |
| Fonctions mappées | 828 (100%) |
| Fonctions implémentées | 600+ |
| Achèvement | ~75% |
| Catégories documentées | 66 |
| Fichiers source | 56 C + 65 H |
| Lignes de code totales | ~150,000+ |
| Catégorie de module | Fichiers | Description |
|---|
| Types de base | rosetta_types.h | Définitions de types de base |
| Moteur d'exécution | rosetta_exec.h/.c | execute_translated, commutation de contexte |
| Initialisation | rosetta_init.h/.c | init_translation_env, registres FP |
| Décodage x86 | rosetta_x86_decode.h/.c | Décodeur d'instructions x86_64 |
| Émission ARM64 | rosetta_arm64_emit.h/.c | Émission de code ARM64 |
| Génération de code | rosetta_codegen.h/.c | Primitives de génération de code |
| Cœur JIT | rosetta_jit.h/.c | Infrastructure de compilation JIT |
| Cache de traduction | rosetta_cache.h/.c, rosetta_transcache.h/.c | Mise en cache de blocs (AOT/JIT) |
| Traduction de blocs | rosetta_translate_block.h/.c | Traduction de blocs de base |
| Distribution d'instructions | rosetta_trans_dispatch.h/.c | Distribution d'instructions |
| Traduction ALU | rosetta_translate_alu.h/.c, rosetta_trans_alu.h/.c | Opérations arithmétiques/logiques |
| Traduction mémoire | rosetta_translate_memory.h/.c, rosetta_trans_mem.h/.c | Opérations de chargement/stockage |
| Traduction de branches | rosetta_translate_branch.h/.c, rosetta_trans_branch.h/.c | Flux de contrôle |
| Traduction de bits | rosetta_translate_bit.h/.c, rosetta_trans_bit.h/.c | Manipulation de bits |
| Traduction de chaînes | rosetta_translate_string.h/.c, rosetta_trans_string.h/.c | Opérations sur les chaînes |
| Traduction spéciale | rosetta_translate_special.h/.c, rosetta_trans_special.h/.c | Instructions spéciales |
| Traduction système | rosetta_trans_system.h/.c | Registres système |
| Traduction NEON | rosetta_trans_neon.c | Opérations SIMD/NEON |
| Opérations SIMD | rosetta_simd.h/.c, rosetta_simd_mem.h/.c | Opérations SIMD |
| Opérations vectorielles | rosetta_vector.h/.c | Opérations vectorielles |
| Traduction FP | rosetta_fp_translate.h/.c, rosetta_fp_helpers.h/.c | Virgule flottante |
| Émission JIT | rosetta_jit_emit.h/.c, rosetta_jit_emit_simd.h/.c | Émission JIT |
| Appels système | rosetta_syscalls.h/.c, rosetta_syscalls_impl.h/.c | Gestion des appels système |
| Cryptographie | rosetta_crypto.h/.c | AES, SHA, CRC32 |
| Contexte | rosetta_context.h/.c | Sauvegarde/restauration du contexte CPU |
| Exécution | rosetta_runtime.h/.c | Point d'entrée d'exécution |
| Gestion mémoire | rosetta_memmgmt.h/.c | Gestion mémoire |
| Utilitaires | rosetta_utils.h/.c, rosetta_string_utils.h/.c | Fonctions utilitaires |
| Catégorie | Instructions |
|---|
| ALU | ADD, SUB, AND, OR, XOR, MUL, DIV, INC, DEC, NEG, NOT, SHL, SHR, SAR, ROL, ROR |
| Mémoire | MOV, MOVZX, MOVSX, MOVSXD, LEA, PUSH, POP, CMP, TEST |
| Branchement | Jcc, JMP, CALL, RET, CMOVcc, SETcc, XCHG |
| Bits | BSF, BSR, POPCNT, BT, BTS, BTR, BTC |
| Chaînes | MOVS, STOS, LODS, CMPS, SCAS |
| Spécial | CPUID, RDTSC, SHLD, SHRD, CWD, CDQ, CQO, CLI, STI, NOP |
| SIMD | SSE, SSE2, SSE3, SSSE3, SSE4.x |
| FP | x87, SSE scalar FP |
| Crypto | AES-NI, SHA, CRC32 |
| Session | Objectif | Fichiers créés/modifiés |
|---|
| 61+ | Modularisation complète | 35+ composants modulaires |
| 61 | Modularisation de la traduction | 6 modules de traduction + améliorations x86_decode |
| 60 | Infrastructure de traduction | Implémentation du cœur de translate_block() |
| 59 | Implémentation des appels système | Gestionnaires d'appels système supplémentaires |
| 58 | Traduction des appels système | Gestionnaires de vecteurs d'E/S et réseau |
| 57 | Gestion mémoire | Améliorations du suivi d'allocation VM |
| 56 | Opérations SIMD | Traductions SIMD avancées |
| 55 | FP/SIMD | Traduction d'instructions en virgule flottante |
| 54 | Extensions cryptographiques | Implémentation du passage AES-NI |
| 53 | Extensions cryptographiques | Instructions SHA et CRC32 |
| 52 | Opérations sur les chaînes | Fonctions chaînes optimisées SIMD |
| 51 | Opérations vectorielles | Arithmétique vectorielle NEON |
| 50 | Conversions vectorielles | Conversions en virgule flottante |
| 49 | Cache de traduction | Gestion du cache AOT/JIT |
| 48 | Cœur JIT | Infrastructure de compilation JIT |
| 46-47 | Génération de code | Utilitaires de génération de code x86_64 |
| 45 | Utilitaires de décodage | Utilitaires de décodage ARM64 |