
Inspiziert, dekompiliert und patcht Hermes-Bytecode (HBC) aus React-Native-Apps strukturell, mit einer GDB-ähnlichen REPL, CFG, Decompiler und re-serialisierendem Patcher.
Hermes Reverse Engineering & Manipulation Interactive Toolkit.
hermit inspiziert, dekompiliert und patcht Hermes-Bytecode (HBC) strukturell, das
Format, in dem React-Native-Apps ihr JavaScript ausliefern. Öffne eine .hbc-Datei,
durchsuche ihre Funktionen, lies das dekompilierte JavaScript, bearbeite
Instruktionen, Strings und Literale in einem interaktiven Editor und schreibe eine
Datei zurück, die die Hermes-VM weiterhin lädt und ausführt.
Anders als Tools, die Bytecode nur analysieren oder ihn an Ort und Stelle patchen, ohne Größen zu ändern, serialisiert hermit die gesamte Datei neu. Es kann Instruktionen einfügen und löschen, Sprünge und Exception-Handler verschieben, die String- und Literal-Tabellen neu aufbauen, neue Funktionen hinzufügen und den SHA-1-Footer neu berechnen. Eine unveränderte Datei durchläuft einen Byte-für-Byte- Roundtrip.
.hbc-Datei erhalten| Version | Rolle |
|---|---|
| 96 | Primäres Ziel. Was ausgelieferte React-Native-Apps verwenden: RN 0.73 bis 0.83, und RN 0.84+ mit deaktiviertem Hermes V1. |
| 94, 95 | Validiert. Das Format ist identisch zu 96, nur die Opcode-Tabellen unterscheiden sich. |
Apps, die mit Hermes V1 (dem Standard ab RN 0.84) gebaut wurden, erzeugen HBC 98,
was noch nicht unterstützt wird. Format-Notizen befinden sich in
doc/hbc-format/.
Jedes Release enthält Archive für macOS und Linux, auf arm64 und x86_64. Es wird weder Python noch ein Compiler benötigt:
| Archiv | Inhalt |
|---|---|
hermit-<version>-<platform>.tar.gz | Die interaktive REPL: ./hermit file.hbc. |
hermit-tools-<version>-<platform>.tar.gz | Die eigenständigen hbc_*-Kommandozeilen-Tools. |
SHA256SUMS | Prüfsummen: shasum -a 256 -c SHA256SUMS. |
tar -xzf hermit-0.1.0-macos-arm64.tar.gz
./hermit-0.1.0-macos-arm64/hermit --version
Die macOS-Binärdateien sind nicht signiert. Nach dem Herunterladen entferne
einmalig das Quarantäne-Flag: xattr -dr com.apple.quarantine hermit-0.1.0-macos-arm64.
Die Linux-Builds benötigen glibc 2.35 oder neuer. Der cfg-Befehl benötigt
weiterhin ein installiertes graph-easy.
Releases werden von .github/workflows/release.yml erzeugt, wenn ein v*-Tag
gepusht wird, unter Verwendung von packaging/build-release.sh, das du auch
lokal ausführen kannst.
FetchContent geholt, sofern sie nicht bereits installiert sind.graph-easy für den cfg-
Befehl (cpanm Graph::Easy), less als dessen Pager.Führe alles aus diesem Verzeichnis aus (dem, das CMakeLists.txt enthält):
cmake -B build
cmake --build build -j
Dies baut die statische Bibliothek libhbc, das Python-Modul _libhbc (in
build/bindings/), die Kommandozeilen-Tools (in build/tools/) und die Unit-
Tests. Die REPL benötigt nur das Python-Modul:
cmake --build build --target _libhbc
Die Tools und die Tests können aus einem Build weggelassen werden, zum Beispiel für ein Release:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DHERMIT_BUILD_TOOLS=OFF -DHERMIT_BUILD_TESTS=OFF
Baue mit demselben Befehl nach jeder Änderung an core/ oder bindings/ neu.
macOS: Wenn das Linken mit einem Fehler über ein fehlerhaftes SDK fehlschlägt, richte den Build auf ein vollständiges SDK aus, zum Beispiel
SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk cmake --build build.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
Das Modul _libhbc wird nicht in die virtuelle Umgebung installiert. Füge sein
Build-Verzeichnis zu PYTHONPATH hinzu, wann immer du hermit ausführst:
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.hbc-Datei erhaltenEine React-Native-App liefert ihr Bundle als einfache Datei aus:
| Plattform | Ort innerhalb des Pakets |
|---|---|
Android (.apk, ein Zip) | assets/index.android.bundle |
iOS (.ipa, ein Zip) | Payload/<App>.app/main.jsbundle |
Wenn die Datei mit den Bytes C6 1F BC 03 C1 03 19 1F beginnt, ist es Hermes-
Bytecode. Die REPL öffnet nur Dateien mit der Endung .hbc, also benenne sie um:
unzip -p app.apk assets/index.android.bundle > app.hbc
xxd app.hbc | head -1 # c61f bc03 c103 191f ...
Analysiere nur Apps, die du untersuchen darfst, zum Beispiel deine eigenen oder Open-Source-Apps zu Forschungszwecken.
Um kleine, kontrollierte Eingaben zu erhalten, kompiliere JavaScript oder
TypeScript mit einem Hermes-Compiler, der HBC 96 erzeugt (zum Beispiel hermesc
aus react-native 0.73 bis 0.83, unter node_modules/react-native/sdks/hermesc/):
hermes -emit-binary -g0 -out hello.hbc hello.js # -g0: keine Debug-Info
Das seeder/-Paket automatisiert dies für die Beispielprogramme in
seeder/samples/ und schreibt die Ergebnisse nach seeder/corpus/:
.venv/bin/python -m seeder.compile # alle 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 schreibt <name>_g0.hbc ohne Debug-Info, --debug schreibt
<name>_g.hbc mit vollständiger Debug-Info. .ts-Samples benötigen tsc in
deinem PATH; der Compiler wird aus --hermes entnommen (Standard hermes).
seeder/build-real-bundle.sh baut eine echte Open-Source-React-Native-App in
eine .hbc.
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.venv/bin/python -m cli.main app.hbc
Ohne Dateiargument startet die REPL leer; verwende open <file.hbc>. Der Prompt
zeigt die HBC-Version und den Dateinamen, mit einem +, wenn es ungespeicherte
Änderungen gibt: [hbc v96 | app+] >. Die Historie wird in ~/.hermit_history
gespeichert und Befehle werden per Tab vervollständigt.
> info
> strings --identifiers filter:fetch
> functions
> disasm func:12
> decompile func:isPremium
> xrefs string:"api.example.com"
> edit func:isPremium
> patch patched.hbc
Funktionen werden über Index oder Name adressiert (func:12, func:isPremium),
Strings über Index oder Wert (string:42, string:"hello"), Literal-Stellen über
Index (array:7).