5

How do I convert the following byte code to normal python code? I got this code by decompiling a pyc file. Some of the code was decompiled to its original code but the majority did not. Any idea how I can get this byte code to its source code?

L. 174       396  BUILD_LIST_0          0
             398  STORE_FAST               'javascripts'

L. 177       400  SETUP_LOOP          490  'to 490'
             402  LOAD_GLOBAL              range
             404  LOAD_CONST               0
             406  LOAD_GLOBAL              len
             408  LOAD_FAST                'incident_tags'
             410  CALL_FUNCTION_1       1  '1 positional argument'
             412  CALL_FUNCTION_2       2  '2 positional arguments'
             414  GET_ITER
             416  FOR_ITER            488  'to 488'
             418  STORE_FAST               'i'

L. 178       420  LOAD_GLOBAL              str
             422  LOAD_FAST                'incident_tags'
             424  LOAD_FAST                'i'
             426  BINARY_SUBSCR
             428  LOAD_ATTR                text
             430  CALL_FUNCTION_1       1  '1 positional argument'
             432  LOAD_GLOBAL              list_of_incidents
             434  COMPARE_OP               not-in
         436_438  POP_JUMP_IF_FALSE   462  'to 462'

L. 179       440  LOAD_FAST                'javascripts'
             442  LOAD_METHOD              append
             444  LOAD_FAST                'incident_tags'
             446  LOAD_FAST                'i'
             448  BINARY_SUBSCR
             450  LOAD_METHOD              get_attribute
             452  LOAD_STR                 'href'
             454  CALL_METHOD_1         1  '1 positional argument'
             456  CALL_METHOD_1         1  '1 positional argument'
             458  POP_TOP
             460  JUMP_BACK           416  'to 416'
           462_0  COME_FROM           436  '436'

L. 181       462  LOAD_GLOBAL              print
             464  LOAD_STR                 'Ignore '
             466  LOAD_FAST                'incident_tags'
             468  LOAD_FAST                'i'
             470  BINARY_SUBSCR
             472  LOAD_ATTR                text
             474  BINARY_ADD
             476  LOAD_STR                 '. It is already completed.'
             478  BINARY_ADD
             480  CALL_FUNCTION_1       1  '1 positional argument'
             482  POP_TOP
         484_486  JUMP_BACK           416  'to 416'
             488  POP_BLOCK
           490_0  COME_FROM_LOOP      400  '400'

L. 184   490_492  SETUP_LOOP         3694  'to 3694'
             494  LOAD_GLOBAL              range
             496  LOAD_CONST               0
             498  LOAD_GLOBAL              len
             500  LOAD_FAST                'javascripts'
             502  CALL_FUNCTION_1       1  '1 positional argument'
             504  CALL_FUNCTION_2       2  '2 positional arguments'
             506  GET_ITER
           508_0  COME_FROM           636  '636'
         508_510  FOR_ITER           3692  'to 3692'
             512  STORE_FAST               'i'

L. 187       514  LOAD_FAST                'self'
             516  LOAD_ATTR                driver
             518  LOAD_METHOD              execute_script
             520  LOAD_FAST                'javascripts'
             522  LOAD_FAST                'i'
             524  BINARY_SUBSCR
             526  CALL_METHOD_1         1  '1 positional argument'
             528  POP_TOP

L. 189       530  LOAD_GLOBAL              time
             532  LOAD_METHOD              sleep
             534  LOAD_CONST               1
             536  CALL_METHOD_1         1  '1 positional argument'
             538  POP_TOP
5
  • It's not something available in standard Python, and I'm not aware of any 3rd-party tools that do this kind of conversion. Commented Sep 20, 2021 at 17:22
  • Some potential tools are listed in this question: stackoverflow.com/questions/1149513/… Commented Sep 20, 2021 at 17:23
  • This wouldn't be trivial, there's not just some built-in function that will do this. You'd be better off googling for projects that already exist. Of course, this is going to be very version dependent. Commented Sep 20, 2021 at 17:25
  • This amount of bytecode is trivial to decompile by hand. Are you really asking about some larger, unspecified body of code? Commented Sep 20, 2021 at 22:49
  • 2
    @DavisHerring Yes. I just showed a snippet of the data Commented Sep 24, 2021 at 19:50

2 Answers 2

2

I suggest you use the uncompyle6 module. (You need the raw .pyc or .pyo file though). To install, run

~$ pip install uncompyle6

Then, to decompile any Python bytecode file, run

~$ uncompyle6 path/to/bytecode/file.pyc

For an overview of all available options, run

~$ uncompyle6 -h

It supports all Python versions from 2.4 to 3.8. You can find the project' homepage at https://github.com/rocky/python-uncompyle6.

Sign up to request clarification or add additional context in comments.

Comments

2

I achieved this using by importing the dis module and using the dir() method to get the __code__ of each function, further used the dir() to get the co_code and finally using dis function to get the bytecodes.

The process is really tedious but it gave me the results I was looking for and can be automated if you understand the concept.

def add(a,b):
    return a+b

# This displays all attributes available to the add function.
# There are tons of them but I'm only interested in the __code__.
dir(add)
my_object = add.__code__

# This displays a list of available attributes to the code object (my_object) but 
# I'm only interested in the co_code attribute.
dir(my_object)
code = my_object.co_code

# Convert the co_code object to list.  This displays the bytecode but to
# view it in human readable form use dis.opname
list(code)
import dis

# To view all available attributes.  I'm interested in a only few of them.
dir(dis) 
dis.opname()  # supply the bytecode value.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.