hermes-dec icon indicating copy to clipboard operation
hermes-dec copied to clipboard

Error KeyError: 1 (Version 96)

Open mragonias opened this issue 1 year ago • 2 comments

I get this error

hbc-decompiler index.android.bundle zamer.js Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "C:\Python311\Scripts\hbc-decompiler.exe\__main__.py", line 7, in <module> File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\hbc_decompiler.py", line 91, in main do_decompilation(state, file_handle) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\hbc_decompiler.py", line 67, in do_decompilation decompile_function(state, global_function_index) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\hbc_decompiler.py", line 52, in decompile_function dehydrated.output_code(state) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\defs.py", line 236, in output_code op.closure_decompile(self) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\defs.py", line 452, in closure_decompile hbc_decompiler.decompile_function(self.state, self.function_id, File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\hbc_decompiler.py", line 52, in decompile_function dehydrated.output_code(state) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\defs.py", line 236, in output_code op.closure_decompile(self) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\defs.py", line 452, in closure_decompile hbc_decompiler.decompile_function(self.state, self.function_id, File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\hbc_decompiler.py", line 50, in decompile_function pass4_name_closure_vars(state, dehydrated) File "C:\Python311\Lib\site-packages\hermes_dec\decompilation\pass4_name_closure_vars.py", line 77, in pass4_name_closure_vars var_name = '_closure%d_slot%d' % (function_body.local_items[token.register].nesting_quantity, ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ KeyError: 1

File: https://www.mediafire.com/file/4wbv2a2c8xu4tjd/index.android.bundle/file

mragonias avatar Aug 17 '24 07:08 mragonias

As a (temporary) workaround you can use Kirlif's fork of hbctool which has a working disassembler up to version 96 or even the official hbcdump disassembler.

Edit: Ah if it's only the decompiler that doesn't work then you don't have too many options unfortunately

devnoname120 avatar Jan 11 '25 21:01 devnoname120

Same issue, only in disassembler.. all others are fine. File is extracted from Tesla Mobile app APK.

    r7 = function(a0, a1, a2, a3, a4, a5, a6) { // Environment: r3
        _fun103486: for(var _fun103486_ip = 0; ; ) switch(_fun103486_ip) {
case 0:
            r1 = a4;
            r4 = a5;
            r2 = a1;
            var _closure1_slot0 = r2;
            var _closure1_slot1 = r1;
            r2 = a6;
            var _closure1_slot2 = r2;
            r2 = Traceback (most recent call last):
  File "/usr/local/bin/hbc-decompiler", line 7, in <module>
    sys.exit(main())
             ~~~~^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/hbc_decompiler.py", line 99, in main
    do_decompilation(state, file_handle)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/hbc_decompiler.py", line 67, in do_decompilation
    decompile_function(state, global_function_index)
    ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/hbc_decompiler.py", line 52, in decompile_function
    dehydrated.output_code(state)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/defs.py", line 236, in output_code
    op.closure_decompile(self)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/defs.py", line 452, in closure_decompile
    hbc_decompiler.decompile_function(self.state, self.function_id,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        parent_environment = self.parent_environment,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        is_generator = self.is_generator,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        is_async = self.is_async)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/hbc_decompiler.py", line 52, in decompile_function
    dehydrated.output_code(state)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/defs.py", line 236, in output_code
    op.closure_decompile(self)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/defs.py", line 452, in closure_decompile
    hbc_decompiler.decompile_function(self.state, self.function_id,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        parent_environment = self.parent_environment,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        is_generator = self.is_generator,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        is_async = self.is_async)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/hbc_decompiler.py", line 50, in decompile_function
    pass4_name_closure_vars(state, dehydrated)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/pass4_name_closure_vars.py", line 77, in pass4_name_closure_vars
    var_name = '_closure%d_slot%d' % (function_body.local_items[token.register].nesting_quantity,
                                      ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
KeyError: 1

As a crude workaround I edited /usr/local/lib/python3.13/dist-packages/hermes_dec/decompilation/pass4_name_closure_vars.py:

from:

                var_name = '_closure%d_slot%d' % (function_body.local_items[token.register].nesting_quantity,
                    token.slot_index)

to:

                if token.register in function_body.local_items:
                    var_name = '_closure%d_slot%d' % (function_body.local_items[token.register].nesting_quantity,
                        token.slot_index)
                else:
                    var_name = '_closure?_slot%d' % token.slot_index

Matthew1471 avatar Oct 25 '25 20:10 Matthew1471