
Ingeniería inversa impulsada por IA de Rosetta (2 para Linux). Descargo de responsabilidad: debido al acuerdo de usuario, no tocaré el código. Todo lo hace la IA, por lo que podría haber una implementación desordenada.
Un esfuerzo exhaustivo de ingeniería inversa para comprender y documentar la tecnología de traducción binaria Rosetta 2 de Apple.
En noviembre de 2020, Apple anunció sus primeras Mac con Apple Silicon, marcando una transición histórica de los procesadores Intel x86_64 a sus propios chips M1 basados en ARM. Esta fue la tercera gran transición de arquitectura de Apple:
Cada transición requirió una solución de traducción binaria para ejecutar el software existente durante el período de migración. Rosetta 2 es el sistema de traducción binaria más sofisticado de Apple hasta ahora.
Rosetta (2006-2011) fue el primer software de traducción binaria dinámica de Apple, que permitía ejecutar aplicaciones PowerPC en Mac basadas en Intel.
Rosetta se eliminó en Mac OS X 10.7 (Lion), completando la transición a Intel.
Rosetta 2 es la tecnología avanzada de traducción binaria dinámica de Apple que permite que las aplicaciones compiladas para Macs Intel x86_64 se ejecuten en Macs con Apple Silicon (ARM64).
┌─────────────────────────────────────────────────────────────┐ │ User Application (x86_64) │ ├─────────────────────────────────────────────────────────────┤ │ Rosetta 2 Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Translator │ │ Runtime │ │ System Call │ │ │ │ (AOT/JIT) │ │ Library │ │ Translation │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ macOS Kernel (ARM64) │ ├─────────────────────────────────────────────────────────────┤ │ Apple Silicon Hardware │ └─────────────────────────────────────────────────────────────┘
### Tecnologías Clave
1. **Traducción Anticipada (AOT)**
- Traduce binarios x86_64 a ARM64 durante la instalación
- Almacena el código traducido en una caché para lanzamientos posteriores más rápidos
- Reduce la sobrecarga en tiempo de ejecución en comparación con la traducción JIT pura
2. **Traducción Justo a Tiempo (JIT)**
- Traduce bloques de código bajo demanda durante la ejecución
- Maneja código cargado dinámicamente y código automodificable
- Mantiene una caché de traducción para mayor eficiencia
3. **Traducción del Conjunto de Instrucciones**
- Mapeo de instrucciones de x86_64 a ARM64
- Traducción de instrucciones vectoriales SSE/AVX a NEON
- Banderas de x86_64 a códigos de condición de ARM64
4. **Traducción de Llamadas al Sistema**
- Traduce las syscalls de macOS x86_64 a sus equivalentes ARM64
- Maneja diferentes convenciones de llamada
- Gestiona el estado de los registros a través de los límites de las syscalls
5. **Soporte en Tiempo de Ejecución**
- Emulación de detección de características de la CPU
- Manejo de almacenamiento local de hilos
- Manejo de señales y excepciones
---
## Cómo Apple entrega Rosetta 2 en macOS
### Ubicación de Instalación
Rosetta 2 se encuentra en:```
/Library/Apple/usr/libexec/oah/
├── rosetta # Main translator binary
├── rosettad # Rosetta daemon
└── librosetta.* # Runtime libraries
El directorio oah significa "Old Architecture Hardware" - una continuación de la era de transición de PowerPC.
En las Mac con Apple Silicon, Rosetta 2 no está instalado de forma predeterminada. Se activa de dos maneras:
┌──────────────────────────────────────────────────────────────────┐ │ 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 │ └──────────────────────────────────────────────────────────────────┘
### Desafíos Clave de Traducción
1. **Mapeo de Registros**
- x86_64 tiene 16 GPRs; ARM64 tiene 31 GPRs
- Registro de banderas de x86_64 -> Banderas NZCV de ARM64
- Emulación de RIP (puntero de instrucción)
2. **Ordenamiento de Memoria**
- x86_64: Ordenamiento de memoria fuerte (TSO)
- ARM64: Ordenamiento de memoria débil
- Requiere barreras de memoria para la corrección
3. **Instrucciones Vectoriales**
- SSE (128 bits) -> Mapeo directo a NEON (128 bits)
- AVX (256 bits) -> Emulación con pares NEON
- Manejo de excepciones diferente para SIMD
4. **Convenciones de Llamada**
- x86_64: Primeros 6 argumentos en registros (RDI, RSI, RDX, RCX, R8, R9)
- ARM64: Primeros 8 argumentos en registros (X0-X7)
- Diferentes diseños de marco de pila
---
## Este Proyecto
Este repositorio contiene implementaciones de ingeniería inversa de funciones de los binarios de Rosetta 2. Mediante un cuidadoso análisis y descompilación, hemos identificado y documentado el propósito semántico de cientos de funciones.
### Objetivos
1. **Educativo**: Entender cómo funciona Rosetta 2 internamente
2. **Documentación**: Crear documentación exhaustiva de las técnicas de traducción
3. **Implementación**: Proporcionar implementaciones en C limpias y bien documentadas
4. **Comunidad**: Compartir conocimiento con la comunidad de ingeniería inversa
### Lo Que Hemos Logrado
- **828 funciones** identificadas y nombradas en el binario principal `rosetta`
- **612 funciones** completamente implementadas con código C limpio
- **66 categorías** de funcionalidad documentadas
- Mapeos completos de nombres de funciones con nombres semánticos
### Categorías de Funciones
| Categoría | Funciones | Descripción |
|-----------|-----------|-------------|
| Punto de Entrada | 1 | Inicialización de Rosetta |
| Operaciones de FP/Vectoriales | ~20 | Gestión de estado de coma flotante y SIMD |
| Operaciones de Memoria SIMD | ~10 | memchr, memcmp, memcpy con SIMD |
| Operaciones Vectoriales | ~30 | Aritmética vectorial NEON, comparación |
| Traducción Binaria | ~50 | Traducción de instrucciones x86_64 -> ARM64 |
| Manejadores de Syscall | ~60 | Traducción y reenvío de llamadas al sistema |
| Gestión de Memoria | ~20 | Envoltorios de malloc, free, mmap |
| Funciones Hash | ~5 | Hashing de direcciones para caché de traducción |
| Operaciones de Cadenas | ~30 | Funciones de cadenas optimizadas con SIMD |
| Extensiones Criptográficas | ~30 | PASSTHROUGH de AES, SHA, CRC32 |
| Análisis de ELF | ~15 | Soporte de formato binario Linux |
| Caché de Traducción | ~20 | Gestión de caché AOT/JIT |
---
## Estructura de Archivos
### Archivos Principales```
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)
La infraestructura de traducción está completamente modularizada en componentes categorizados:``` ├── 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
### Módulos funcionales
Módulos de infraestructura principal y soporte:```
├── 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
Módulos de operaciones SIMD y vectoriales:``` ├── 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
### Módulos de Syscall
Manejo y traducción de syscall del invitado:```
├── rosetta_syscalls.h/.c # Syscall translation core
├── rosetta_syscalls_impl.h/.c # Syscall implementations
└── rosetta_crypto.h/.c # Crypto instructions (AES, SHA, CRC32)
Módulos adicionales de traducción y soporte:``` ├── 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
### Archivos de prueba```
├── test_jit.c # JIT unit tests (737 lines)
└── test_translate.c # Translation tests (1,059 lines)
Total: 50+ archivos fuente, ~150,000+ líneas de código
make -f Makefile.modular all
### Construyendo Componentes Individuales```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
### Uso como biblioteca```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
El archivo descompilado original rosetta_decomp.c contiene literales de cadena que revelan la estructura del código fuente original. Estos nombres de archivo aparecen en mensajes de aserción/error a lo largo del binario.
Nota: El código refactorizado utiliza una estructura diferente, más modular que la 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.hppLa infraestructura de traducción está completamente modularizada en los siguientes componentes:
Total: más de 40 componentes modulares
Este proyecto es solo para fines educativos y de investigación.
Licencia MIT - Consulta el archivo LICENSE para más detalles.
¡Las contribuciones son bienvenidas! Áreas de interés:
Última actualización: febrero de 2026
| Componente | Descripción |
|---|
RosettaLinux/rosetta | Binario ARM64 principal que contiene el motor de traducción |
RosettaLinux/rosettad | Demonio del sistema que gestiona los servicios de traducción |
debugserver -> /usr/libexec/rosetta/debugserver | Soporte de depuración para procesos traducidos |
libRosettaRuntime | Biblioteca de tiempo de ejecución enlazada durante la traducción |
translate_tool -> /usr/libexec/rosetta/translate_tool | Herramienta de traducción para construir binarios traducidos |
Vdso.cppProcMapsParser.cppThreadContextSignals.cppThreadContextSyscalls.cppTranslationCacheAot.cppTranslationCacheJit.cppTranslationCache.cppTranslator.cppRuntimeLibraryBridgeInternal.cppTwoLevelOffsetMap.cppDeltaCodedOffsetMap.cpp| Métrica | Valor |
|---|
| Funciones Totales | 828 |
| Funciones Mapeadas | 828 (100%) |
| Funciones Implementadas | 600+ |
| Completado | ~75% |
| Categorías Documentadas | 66 |
| Archivos Fuente | 56 C + 65 H |
| Líneas de Código Totales | ~150,000+ |
| Categoría de Módulo | Archivos | Descripción |
|---|
| Tipos Principales | rosetta_types.h | Definiciones de tipos base |
| Motor de Ejecución | rosetta_exec.h/.c | execute_translated, cambio de contexto |
| Inicialización | rosetta_init.h/.c | init_translation_env, registros FP |
| Decodificación x86 | rosetta_x86_decode.h/.c | Decodificador de instrucciones x86_64 |
| Emisión ARM64 | rosetta_arm64_emit.h/.c | Emisión de código ARM64 |
| Generación de Código | rosetta_codegen.h/.c | Primitivas de generación de código |
| Núcleo JIT | rosetta_jit.h/.c | Infraestructura de compilación JIT |
| Caché de Traducción | rosetta_cache.h/.c, rosetta_transcache.h/.c | Caché de bloques (AOT/JIT) |
| Traducción de Bloques | rosetta_translate_block.h/.c | Traducción de bloques básicos |
| Despacho de Instrucciones | rosetta_trans_dispatch.h/.c | Despacho de instrucciones |
| Traducción ALU | rosetta_translate_alu.h/.c, rosetta_trans_alu.h/.c | Operaciones aritméticas/lógicas |
| Traducción de Memoria | rosetta_translate_memory.h/.c, rosetta_trans_mem.h/.c | Operaciones de carga/almacenamiento |
| Traducción de Ramas | rosetta_translate_branch.h/.c, rosetta_trans_branch.h/.c | Flujo de control |
| Traducción de Bits | rosetta_translate_bit.h/.c, rosetta_trans_bit.h/.c | Manipulación de bits |
| Traducción de Cadenas | rosetta_translate_string.h/.c, rosetta_trans_string.h/.c | Operaciones con cadenas |
| Traducción Especial | rosetta_translate_special.h/.c, rosetta_trans_special.h/.c | Instrucciones especiales |
| Traducción de Sistema | rosetta_trans_system.h/.c | Registros del sistema |
| Traducción NEON | rosetta_trans_neon.c | Operaciones SIMD/NEON |
| Operaciones SIMD | rosetta_simd.h/.c, rosetta_simd_mem.h/.c | Operaciones SIMD |
| Operaciones Vectoriales | rosetta_vector.h/.c | Operaciones vectoriales |
| Traducción FP | rosetta_fp_translate.h/.c, rosetta_fp_helpers.h/.c | Punto flotante |
| Emisión JIT | rosetta_jit_emit.h/.c, rosetta_jit_emit_simd.h/.c | Emisión JIT |
| Syscalls | rosetta_syscalls.h/.c, rosetta_syscalls_impl.h/.c | Manejo de syscalls |
| Criptografía | rosetta_crypto.h/.c | AES, SHA, CRC32 |
| Contexto | rosetta_context.h/.c | Guardar/restaurar contexto de CPU |
| Tiempo de Ejecución | rosetta_runtime.h/.c | Punto de entrada en tiempo de ejecución |
| Gestión de Memoria | rosetta_memmgmt.h/.c | Gestión de memoria |
| Utilidades | rosetta_utils.h/.c, rosetta_string_utils.h/.c | Funciones de utilidad |
| Categoría | Instrucciones |
|---|
| ALU | ADD, SUB, AND, OR, XOR, MUL, DIV, INC, DEC, NEG, NOT, SHL, SHR, SAR, ROL, ROR |
| Memoria | MOV, MOVZX, MOVSX, MOVSXD, LEA, PUSH, POP, CMP, TEST |
| Ramas | Jcc, JMP, CALL, RET, CMOVcc, SETcc, XCHG |
| Bits | BSF, BSR, POPCNT, BT, BTS, BTR, BTC |
| Cadenas | MOVS, STOS, LODS, CMPS, SCAS |
| Especial | CPUID, RDTSC, SHLD, SHRD, CWD, CDQ, CQO, CLI, STI, NOP |
| SIMD | SSE, SSE2, SSE3, SSSE3, SSE4.x |
| FP | x87, SSE scalar FP |
| Criptografía | AES-NI, SHA, CRC32 |
| Sesión | Enfoque | Archivos Creados/Modificados |
|---|
| 61+ | Modularización Completa | 35+ componentes modulares |
| 61 | Modularización de Traducción | 6 módulos de traducción + mejoras en x86_decode |
| 60 | Infraestructura de Traducción | Implementación principal de translate_block() |
| 59 | Implementación de Syscalls | Manejadores adicionales de syscalls |
| 58 | Traducción de Syscalls | Manejadores de vectores de E/S y red |
| 57 | Gestión de Memoria | Mejoras en el rastreador de asignación de VM |
| 56 | Operaciones SIMD | Traducciones SIMD avanzadas |
| 55 | FP/SIMD | Traducción de instrucciones de punto flotante |
| 54 | Extensiones de Criptografía | Implementación de paso directo AES-NI |
| 53 | Extensiones de Criptografía | Instrucciones SHA y CRC32 |
| 52 | Operaciones con Cadenas | Funciones de cadenas optimizadas con SIMD |
| 51 | Operaciones Vectoriales | Aritmética vectorial NEON |
| 50 | Conversiones Vectoriales | Conversiones de punto flotante |
| 49 | Caché de Traducción | Gestión de caché AOT/JIT |
| 48 | Núcleo JIT | Infraestructura de compilación JIT |
| 46-47 | Generación de Código | Ayudantes de generación de código x86_64 |
| 45 | Ayudantes de Decodificación | Utilidades de decodificación ARM64 |