ワンクリックで
hermes-dec-bytecode-reverse-engineering
Disassemble and decompile React Native Hermes bytecode (HBC) files for reverse engineering
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Disassemble and decompile React Native Hermes bytecode (HBC) files for reverse engineering
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | hermes-dec-bytecode-reverse-engineering |
| description | Disassemble and decompile React Native Hermes bytecode (HBC) files for reverse engineering |
| triggers | ["decompile hermes bytecode","disassemble react native hbc file","reverse engineer hermes bundle","parse hermes bytecode headers","extract javascript from android apk","analyze hermes vm bytecode","convert hbc to javascript","decode react native bundle"] |
Skill by ara.so — Hermes Skills collection.
hermes-dec is a reverse-engineering tool for disassembling and decompiling React Native applications compiled to Hermes VM bytecode (HBC) format. It provides three main utilities:
Hermes is the default JavaScript engine for React Native on Android (since RN 0.70) and is commonly found in mobile apps at assets/index.android.bundle.
# Using pipx (recommended for CLI tools)
pipx install hermes-dec
# Using uv
uv tool install hermes-dec
# Using pip
pip install hermes-dec
# From source
git clone https://github.com/P1sec/hermes-dec.git
cd hermes-dec
pip install -e .
# Ubuntu (Snap)
sudo snap install hermes-dec
# Commands become: hermes-dec.hbc-disassembler, hermes-dec.hbc-file-parser, hermes-dec.hbc-decompiler
# Arch Linux (AUR)
yay -S hermes-dec
React Native Android apps package Hermes bytecode in APK files. Extract it first:
# APK files are ZIP archives
unzip my_application.apk -d my_application/
cd my_application/
# Verify it's Hermes bytecode
file assets/index.android.bundle
# Output: assets/index.android.bundle: Hermes JavaScript bytecode, version 84
# Or use 7z
7z x my_application.apk
Common locations in APK:
assets/index.android.bundle (main bundle)assets/*.hbc (additional bundles)assets/index.android.bundle.hbcInspect HBC file structure, bytecode version, and metadata:
# Display file information to stdout
hbc-file-parser assets/index.android.bundle
# Save output to file
hbc-file-parser assets/index.android.bundle > analysis.txt
Example output:
Hermes Bytecode File v84
File size: 2,453,678 bytes
SHA1 hash: a1b2c3d4...
Number of functions: 1,234
String table size: 45,678 entries
Debug info: present
Convert bytecode to human-readable assembly (.hasm format):
# Output to stdout
hbc-disassembler assets/index.android.bundle
# Save to file
hbc-disassembler assets/index.android.bundle output.hasm
# Typical workflow
hbc-disassembler index.android.bundle disassembled.hasm
Example .hasm output:
Function<loginUser>(3 params, 15 registers):
Offset in debug table: source 0x0000
LoadParam r2, 1
LoadParam r3, 2
LoadConstString r1, "username"
GetByVal r0, r2, r1
LoadConstString r1, "password"
GetByVal r4, r2, r1
Call2 r0, r3, r0, r4
Ret r0
Generate pseudo-JavaScript code (not yet valid JS, missing control flow):
# Output to stdout
hbc-decompiler assets/index.android.bundle
# Save to file
hbc-decompiler assets/index.android.bundle decompiled.js
# Typical workflow
hbc-decompiler index.android.bundle output.js
Example decompiled output:
function loginUser(param0, param1, param2) {
var r0, r1, r2, r3, r4;
r2 = param1;
r3 = param2;
r1 = "username";
r0 = r2[r1];
r1 = "password";
r4 = r2[r1];
r0 = r3(r0, r4);
return r0;
}
#!/bin/bash
# analyze_hbc.sh - Complete Hermes bytecode analysis
APK_FILE="$1"
OUTPUT_DIR="analysis_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
# Extract APK
echo "[+] Extracting APK..."
unzip -q "$APK_FILE" -d "$OUTPUT_DIR/extracted"
# Find HBC files
echo "[+] Locating HBC files..."
find "$OUTPUT_DIR/extracted" -name "*.bundle" -o -name "*.hbc" > "$OUTPUT_DIR/hbc_files.txt"
# Process each HBC file
while IFS= read -r hbc_file; do
basename=$(basename "$hbc_file")
echo "[+] Processing $basename..."
# Parse headers
hbc-file-parser "$hbc_file" > "$OUTPUT_DIR/${basename}.info.txt"
# Disassemble
hbc-disassembler "$hbc_file" "$OUTPUT_DIR/${basename}.hasm"
# Decompile
hbc-decompiler "$hbc_file" "$OUTPUT_DIR/${basename}.js"
done < "$OUTPUT_DIR/hbc_files.txt"
echo "[+] Analysis complete in $OUTPUT_DIR"
# Disassemble and search for API endpoints
hbc-disassembler index.android.bundle output.hasm
grep -i "https://" output.hasm
# Find authentication-related code
grep -i -E "(token|auth|password|login)" output.hasm
# Decompile and search for specific strings
hbc-decompiler index.android.bundle output.js
grep -i "api_key" output.js
# Compare two versions of the same app
hbc-disassembler old_version/index.android.bundle old.hasm
hbc-disassembler new_version/index.android.bundle new.hasm
# Diff the assembly
diff -u old.hasm new.hasm > changes.diff
# Or use a better diff tool
code --diff old.hasm new.hasm
While hermes-dec is primarily a CLI tool, you can import its modules in Python:
#!/usr/bin/env python3
"""
Example: Programmatic access to hermes-dec functionality
"""
import sys
from pathlib import Path
# Import hermes-dec modules (structure may vary by version)
# Note: Internal API may change; CLI is the stable interface
def analyze_hbc_file(hbc_path: Path):
"""
Analyze an HBC file programmatically
"""
if not hbc_path.exists():
print(f"Error: {hbc_path} not found")
return
# Read file header
with open(hbc_path, 'rb') as f:
magic = f.read(8)
if magic[:4] != b'\xC6\x1F\xBC\x03':
print("Not a valid Hermes bytecode file")
return
# Version is at offset 4
version = int.from_bytes(magic[4:8], 'little')
print(f"Hermes bytecode version: {version}")
# For detailed parsing, use the CLI tools
import subprocess
# Get file info
result = subprocess.run(
['hbc-file-parser', str(hbc_path)],
capture_output=True,
text=True
)
if result.returncode == 0:
print("\n=== File Info ===")
print(result.stdout)
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python analyze.py <hbc_file>")
sys.exit(1)
analyze_hbc_file(Path(sys.argv[1]))
#!/usr/bin/env python3
"""
Batch process multiple APK files for Hermes bytecode analysis
"""
import subprocess
import zipfile
from pathlib import Path
from typing import List
def extract_hbc_from_apk(apk_path: Path, output_dir: Path) -> List[Path]:
"""
Extract HBC files from an APK
Returns list of extracted HBC file paths
"""
hbc_files = []
output_dir.mkdir(parents=True, exist_ok=True)
with zipfile.ZipFile(apk_path, 'r') as apk:
for name in apk.namelist():
if name.endswith('.bundle') or name.endswith('.hbc'):
# Extract file
target = output_dir / Path(name).name
with apk.open(name) as source, open(target, 'wb') as dest:
dest.write(source.read())
# Verify it's HBC
if is_hermes_bytecode(target):
hbc_files.append(target)
print(f"[+] Extracted {name} -> {target}")
return hbc_files
def is_hermes_bytecode(file_path: Path) -> bool:
"""Check if file is Hermes bytecode"""
try:
with open(file_path, 'rb') as f:
magic = f.read(4)
return magic == b'\xC6\x1F\xBC\x03'
except:
return False
def decompile_hbc(hbc_path: Path, output_path: Path):
"""Decompile HBC file to pseudo-JavaScript"""
subprocess.run(
['hbc-decompiler', str(hbc_path), str(output_path)],
check=True
)
print(f"[+] Decompiled {hbc_path.name} -> {output_path}")
def main():
apk_dir = Path("apks")
output_base = Path("decompiled")
for apk in apk_dir.glob("*.apk"):
print(f"\n[*] Processing {apk.name}")
# Create output directory for this APK
apk_output = output_base / apk.stem
apk_output.mkdir(parents=True, exist_ok=True)
# Extract HBC files
hbc_files = extract_hbc_from_apk(apk, apk_output / "extracted")
# Decompile each
for hbc in hbc_files:
js_output = apk_output / f"{hbc.stem}.js"
try:
decompile_hbc(hbc, js_output)
except subprocess.CalledProcessError as e:
print(f"[!] Failed to decompile {hbc.name}: {e}")
if __name__ == "__main__":
main()
The disassembler outputs Hermes VM assembly instructions:
Function<ComponentName>(params, registers):
# Instruction Dest Source1 Source2
LoadParam r0, 1 # Load first parameter
LoadConstString r1, "key" # Load string constant
GetByVal r2, r0, r1 # Property access: r0[r1]
Call r3, r2 # Function call
Ret r3 # Return value
Common opcodes:
LoadParam: Load function parameterLoadConst*: Load constants (string, number, undefined, etc.)GetByVal/PutByVal: Property accessCall*: Function callsNewObject/NewArray: Object/array creationRet: Return from functionJmp*: Jump instructions (control flow)The decompiler outputs register-based pseudo-code:
// Not yet valid JavaScript - shows data flow
function example(param0, param1) {
var r0, r1, r2, r3; // Registers
r0 = param0; // Parameter assignment
r1 = "property"; // String constant
r2 = r0[r1]; // Property access
r3 = someFunc(r2); // Function call
return r3;
}
Limitations:
$ file index.android.bundle
index.android.bundle: ASCII text, with very long lines
Solution: This is minified JavaScript, not Hermes bytecode. The app doesn't use Hermes engine or you have the wrong file.
Error: Unsupported bytecode version 96
Solution: Update hermes-dec to the latest version:
pipx upgrade hermes-dec
# or
pip install --upgrade hermes-dec
If still unsupported, check the GitHub issues or open a new one.
The decompiler output is incomplete or has missing functions.
Solution: Try disassembly first to understand structure:
# Disassemble to see raw instructions
hbc-disassembler file.bundle output.hasm
# Then manually interpret critical sections
# The decompiler is best-effort; some complex patterns may not decompile
$ hbc-decompiler index.android.bundle output.js
$ wc -l output.js
0 output.js
Solution: Check file format and permissions:
# Verify it's HBC
file index.android.bundle
hexdump -C index.android.bundle | head
# Check permissions
ls -la index.android.bundle
# Try with stdout first
hbc-decompiler index.android.bundle
$ unzip app.apk
error: cannot find or open app.apk
Solution: Ensure APK is not corrupted:
# Verify ZIP structure
7z t app.apk
# Try alternative extraction
jar xf app.apk
# or
python -m zipfile -e app.apk output_dir/
# Decompile and search for base64
hbc-decompiler index.android.bundle output.js
grep -E '[A-Za-z0-9+/]{20,}={0,2}' output.js
# Look for hex patterns
grep -E '0x[0-9a-fA-F]{4,}' output.js
# Search for URLs in disassembly
hbc-disassembler index.android.bundle output.hasm
grep -oE 'https?://[^"]+' output.hasm | sort -u > endpoints.txt
# Find in decompiled code
hbc-decompiler index.android.bundle output.js
grep -oE '(http|https)://[a-zA-Z0-9./?=_-]*' output.js | sort -u
# Find function definitions and calls
hbc-disassembler index.android.bundle output.hasm
grep "Function<" output.hasm > functions.txt
grep "Call" output.hasm > calls.txt
# Analyze function call graph
awk '/Function</{print $0} /Call/{print " -> " $0}' output.hasm
Hermes bytecode versions and React Native releases:
Check bytecode version:
hbc-file-parser file.bundle | grep -i version
Browser-based interface for viewing and filtering OpenClaw session tool call history with zero dependencies for local network deployment.
AI-powered quantitative research and backtesting platform with end-to-end workflow from research to strategy publication
Give your AI assistant a phone — OpenClaw plugin for real phone calls via Twilio + OpenAI Realtime API with in-call tools, transcripts, and call screening
Run multi-model consensus panels (Lite or Heavy) with your own agent backends—no hosted middleware, your models, your rules.
Build a multi-role JARVIS-style voice assistant with local ASR/TTS, OpenClaw LLM gateway, voice wake words, HUD effects, and speaker verification
Use 37 battle-tested marketing skills covering CRO, copywriting, SEO, paid ads, email, growth, and strategy with real data connectors for Google Ads, Search Console, Meta Ads, and X/Twitter