
Inspecciona, descompila y parchea estructuralmente el bytecode de Hermes (HBC) de aplicaciones React Native, con un REPL estilo GDB, CFG, descompilador y parcheador que reserializa.
Hermes Reverse Engineering & Manipulation Interactive Toolkit.
hermit inspecciona, descompila y parchea estructuralmente el bytecode de Hermes (HBC), el formato en el que las aplicaciones de React Native distribuyen su JavaScript. Abre un archivo .hbc, explora sus funciones, lee el JavaScript descompilado, edita instrucciones, cadenas y literales en un editor interactivo, y escribe de vuelta un archivo que la VM de Hermes todavía carga y ejecuta.
A diferencia de las herramientas que solo analizan bytecode, o que lo parchean en el lugar sin cambiar los tamaños, hermit re-serializa el archivo completo. Puede insertar y eliminar instrucciones, reubicar saltos y manejadores de excepciones, reconstruir las tablas de cadenas y literales, añadir nuevas funciones y recalcular el pie de página SHA-1. Un archivo sin modificar se conserva byte a byte.
.hbc| Versión | Rol |
|---|---|
| 96 | Objetivo principal. La que usan las aplicaciones de React Native en producción: RN 0.73 a 0.83, y RN 0.84+ con Hermes V1 deshabilitado. |
| 94, 95 | Validadas. El formato es idéntico al 96, solo difieren las tablas de opcodes. |
Las aplicaciones compiladas con Hermes V1 (el predeterminado desde RN 0.84) emiten HBC 98, que aún no es compatible. Las notas del formato están en doc/hbc-format/.
Cada release tiene archivos para macOS y Linux, en arm64 y x86_64. No se necesita Python ni compilador:
| Archivo | Contenido |
|---|---|
hermit-<version>-<platform>.tar.gz | El REPL interactivo: ./hermit file.hbc. |
hermit-tools-<version>-<platform>.tar.gz | Las herramientas de línea de comandos hbc_* independientes. |
SHA256SUMS | Sumas de verificación: shasum -a 256 -c SHA256SUMS. |
tar -xzf hermit-0.1.0-macos-arm64.tar.gz
./hermit-0.1.0-macos-arm64/hermit --version
Los binarios de macOS no están firmados. Tras la descarga, elimina la marca de cuarentena una vez: xattr -dr com.apple.quarantine hermit-0.1.0-macos-arm64. Las compilaciones de Linux necesitan glibc 2.35 o superior. El comando cfg todavía necesita graph-easy instalado.
Los releases se producen mediante .github/workflows/release.yml cuando se empuja una etiqueta v*, usando packaging/build-release.sh, que también puedes ejecutar localmente.
FetchContent de CMake a menos que ya estén instalados.graph-easy para el comando cfg (cpanm Graph::Easy), less como su paginador.Ejecuta todo desde este directorio (el que contiene CMakeLists.txt):
cmake -B build
cmake --build build -j
Esto compila la biblioteca estática libhbc, el módulo de Python _libhbc (en build/bindings/), las herramientas de línea de comandos (en build/tools/) y las pruebas unitarias. El REPL solo necesita el módulo de Python:
cmake --build build --target _libhbc
Las herramientas y las pruebas pueden omitirse de una compilación, por ejemplo para un release:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DHERMIT_BUILD_TOOLS=OFF -DHERMIT_BUILD_TESTS=OFF
Vuelve a compilar con el mismo comando después de cada cambio en core/ o bindings/.
macOS: si el enlazado falla con un error sobre un SDK mal formado, apunta la compilación a un SDK completo, por ejemplo
SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk cmake --build build.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
El módulo _libhbc no se instala en el virtualenv. Añade su directorio de compilación a PYTHONPATH siempre que ejecutes hermit:
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.hbcUna aplicación de React Native distribuye su bundle como un archivo plano:
| Plataforma | Ubicación dentro del paquete |
|---|---|
Android (.apk, un zip) | assets/index.android.bundle |
iOS (.ipa, un zip) | Payload/<App>.app/main.jsbundle |
Si el archivo empieza con los bytes C6 1F BC 03 C1 03 19 1F, es bytecode de Hermes. El REPL solo abre archivos con la extensión .hbc, así que renómbralo:
unzip -p app.apk assets/index.android.bundle > app.hbc
xxd app.hbc | head -1 # c61f bc03 c103 191f ...
Analiza solo aplicaciones que tengas permitido estudiar, por ejemplo las tuyas propias, o aplicaciones de código abierto para investigación.
Para obtener entradas pequeñas y controladas, compila JavaScript o TypeScript con un compilador de Hermes que emita HBC 96 (por ejemplo hermesc de react-native 0.73 a 0.83, en node_modules/react-native/sdks/hermesc/):
hermes -emit-binary -g0 -out hello.hbc hello.js # -g0: sin información de depuración
El paquete seeder/ automatiza esto para los programas de ejemplo en seeder/samples/ y escribe los resultados en seeder/corpus/:
.venv/bin/python -m seeder.compile # todos los ejemplos
.venv/bin/python -m seeder.compile --g0 seeder/samples/loop_sum.js
.venv/bin/python -m seeder.compile --debug seeder/samples/greeting.js
--g0 escribe <name>_g0.hbc sin información de depuración, --debug escribe <name>_g.hbc con información de depuración completa. Los ejemplos .ts necesitan tsc en tu PATH; el compilador se toma de --hermes (por defecto hermes). seeder/build-real-bundle.sh compila una aplicación real de React Native de código abierto en un .hbc.
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.venv/bin/python -m cli.main app.hbc
Sin un argumento de archivo, el REPL se inicia vacío; usa open <file.hbc>. El prompt muestra la versión de HBC y el nombre del archivo, con un + cuando hay cambios sin guardar: [hbc v96 | app+] >. El historial se guarda en ~/.hermit_history y los comandos se autocompletan con tabulador.