
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.
Kit de herramientas interactivo para ingeniería inversa y manipulación de Hermes.
hermit inspecciona, descompila y parchea estructuralmente el bytecode de Hermes (HBC), el formato en el que las aplicaciones 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 aún carga y ejecuta.
A diferencia de las herramientas que solo analizan bytecode, o que lo parchean in situ 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 SHA-1. Un archivo sin modificar se conserva byte a byte.
.hbc| Versión | Rol |
|---|---|
| 96 | Objetivo principal. La que usan las aplicaciones 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 independientes hbc_*. |
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. Después de descargarlos, elimina el indicador 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 que graph-easy esté instalado.
Las versiones se generan mediante .github/workflows/release.yml cuando se publica 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 excluirse de una compilación, por ejemplo para una versión de lanzamiento:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DHERMIT_BUILD_TOOLS=OFF -DHERMIT_BUILD_TESTS=OFF
Reconstruye 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 está instalado 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 incluye 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 comienza con los bytes C6 1F BC 03 C1 03 19 1F, se trata de 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 únicamente las 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: no debug info
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 # all samples
.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. Las muestras .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; use open <file.hbc>. El indicador 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 completan con tabulación.