
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 strukturell Hermes-Bytecode (HBC), das Format, in dem React-Native-Apps ihr JavaScript ausliefern. Öffne eine .hbc-Datei, durchstöbere ihre Funktionen, lies das dekompilierte JavaScript, bearbeite Anweisungen, 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 Anweisungen 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 wird Byte für Byte unverändert zurückgeschrieben.
.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, das noch nicht
unterstützt wird. Formatnotizen 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-Binaries sind nicht signiert. Nach dem Herunterladen das Quarantäne-Flag
einmalig entfernen: xattr -dr com.apple.quarantine hermit-0.1.0-macos-arm64. Die Linux-Builds
benötigen glibc 2.35 oder neuer. Der Befehl cfg 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 abgerufen, sofern sie nicht bereits installiert sind.graph-easy für den Befehl cfg
(cpanm Graph::Easy), less als dessen Pager.Alles aus diesem Verzeichnis heraus ausführen (demjenigen, das CMakeLists.txt enthält):
cmake -B build
cmake --build build -j
Dies erstellt die statische Bibliothek libhbc, das Python-Modul _libhbc (in
build/bindings/), die Kommandozeilenwerkzeuge (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 ausgeschlossen werden, zum Beispiel für ein Release:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DHERMIT_BUILD_TOOLS=OFF -DHERMIT_BUILD_TESTS=OFF
Nach jeder Änderung an core/ oder bindings/ mit demselben Befehl neu bauen.
macOS: Wenn die Verknüpfung mit einem Fehler über ein fehlerhaftes SDK fehlschlägt, richten Sie 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ügen Sie sein Build-Verzeichnis zu PYTHONPATH hinzu, wann immer Sie hermit ausführen:
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.hbc-Datei erhaltenEine React-Native-App liefert ihr Bundle als einfache Datei aus:
| Plattform | Speicherort innerhalb des Pakets |
|---|---|
Android (.apk, eine Zip-Datei) | assets/index.android.bundle |
iOS (.ipa, eine Zip-Datei) | Payload/<App>.app/main.jsbundle |
Wenn die Datei mit den Bytes C6 1F BC 03 C1 03 19 1F beginnt, handelt es sich um Hermes-Bytecode. Die REPL öffnet nur Dateien mit der Endung .hbc, also benennen Sie 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 ausgibt (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: no debug info
Das Paket seeder/ automatisiert dies für die Beispielprogramme in
seeder/samples/ und schreibt die Ergebnisse nach 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 schreibt <name>_g0.hbc ohne Debug-Informationen, --debug schreibt
<name>_g.hbc mit vollständigen Debug-Informationen. .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 ein Dateiargument startet die REPL leer; verwende open <file.hbc>. Die Eingabeaufforderung zeigt die HBC-Version und den Dateinamen, mit einem +, wenn ungespeicherte Änderungen vorliegen: [hbc v96 | app+] >. Der Verlauf 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