Skip to main content

A tool for reverse engineering React Native bytecode files, including disassembly and decompilation facilities

Project description

hermes-dec is a reverse-engineering tool which can be used for disassembling and decompiling React Native files compiled into the Hermes VM bytecode (HBC) format.

For a wider presentation of its purpose, please see our presentation blog post.

Background

The Hermes VM for React Native was announced by Facebook on the 12 July 2019. The initial release of Hermes was version 0.1.0 (bytecode version 59), Github tags 0.0.1 to 0.0.3 correspond to pre-public release.

However, Hermes is the default compilation target for React Native on Android only since React Native 0.70 (released on 5 September 2022), as explained here.

Before that, and since React Native 0.60.2, the Hermes VM was an opt-in feature. Hermes for iOS is supported since version 0.64 of React Native (released on the 12 March 2021).

React Native is used by a wide variety of significant mobile applications, as exposed on the React Native showcase page.

A variety of technical documentation regarding the Hermes VM, which is published as an open-source project under the BSD license, including various design documents in the Markdown format, which can be read on Github as well as on Facebook's website for React documentation.

In Android applications released under the .APK format, the Hermes bytecode (HBC) file is usually located at:

$ file assets/index.android.bundle
assets/index.android.bundle: Hermes JavaScript bytecode, version 84

On non-Hermes based setups of React Native, this file usually contains minified/Webpacked JavaScript code.

Installation

The application itself only relies on the Python 3.x standard library for now.

You can install the tool through the following commands:

sudo snap install --classic uv
uv tool install hermes-dec

# Or with pipx:
pipx install hermes-dec

Usage

If you didn't install the tool system-wide using the command above, you can also download the source using this command and find the same utilities at the root:

$ git clone git@github.com:P1sec/hermes-dec.git
$ cd hermes-dec/

For an Android application, you should extract the Hermes bundle file from the .APK file through using your favorite unzipping tool (an .APK file is a renamed .ZIP archive):

$ 7z x my_application.apk
$ cd my_application

And check the type of the assets/index.android.bundle React Native bundle file which, in the case of a React Native-based application, should be either a plain-text minified JavaScript bundle file or an Hermes bytecode file:

$ file assets/index.android.bundle
assets/index.android.bundle: Hermes JavaScript bytecode, version 84

If the concerned file is indeed an Hermes JavaScript bytecode file, you may then decode most of its file headers using the following utility (which output may not be stable over time):

hbc-file-parser assets/index.android.bundle

You may then disassemble the contents of the React Native bytecode file to the /tmp/my_output_file.hasm output file using the following command (leave out the second parameter in order to send the disassembled content to the standard output):

hbc-disassembler assets/index.android.bundle /tmp/my_output_file.hasm

And perform the decompilation to pseudo-code (which is not valid JavaScript yet as it does not retranscribe loop/conditional structures) using the following command:

hbc-decompiler assets/index.android.bundle /tmp/my_output_file.js

Extra documentation

You can find auto-generated documentation for the Hermes VM opcodes here.

This is an useful tool to understand the generated assembly code.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hermes_dec-0.1.2.tar.gz (218.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hermes_dec-0.1.2-py3-none-any.whl (546.8 kB view details)

Uploaded Python 3

File details

Details for the file hermes_dec-0.1.2.tar.gz.

File metadata

  • Download URL: hermes_dec-0.1.2.tar.gz
  • Upload date:
  • Size: 218.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for hermes_dec-0.1.2.tar.gz
Algorithm Hash digest
SHA256 1493015f62168fed79c186d8d4042307bed71527d1af2da3b656870df8bc7d84
MD5 e6b4626676606cc4fe2a9055f8ea87f1
BLAKE2b-256 60f0fdf12487fdf12e7748548fd311c32261ed0c2f57cc7d317ef448fc2a0483

See more details on using hashes here.

Provenance

The following attestation bundles were made for hermes_dec-0.1.2.tar.gz:

Publisher: python-publish.yml on P1sec/hermes-dec

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file hermes_dec-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: hermes_dec-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 546.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for hermes_dec-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 31cc3080d81502bda2d345733b7f7eb0d8a5cd5ace78dfd00e719975f4fb96d3
MD5 ff6d5d3cff6cf34a59dca8c4bc7e829d
BLAKE2b-256 8e79f64c83c8cb0ad9954c31a5f64d0eb4bc1cb5da8ffc2ea85b700d37b2fa11

See more details on using hashes here.

Provenance

The following attestation bundles were made for hermes_dec-0.1.2-py3-none-any.whl:

Publisher: python-publish.yml on P1sec/hermes-dec

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page