如何反编译pyinstaller exe,返回源代码?

逆向工程 Python 反汇编者
2021-07-01 15:01:51

Python版本,这个方法试过:3.7.5, 3.6.0, 3.5.0, 2.7.17? (我知道,我太绝望了,无法找回我的消息来源。)

我在反编译 exe 时遇到问题。我有点删除了错误的文件夹,现在我只剩下.exe, 由 pyinstaller 制作的,没有别的。所以基本上我decompile pyinstaller exes谷歌搜索了如何,我发现我首先使用这个:https : //github.com/countercept/python-exe-unpacker/blob/master/pyinstxtractor.py将其分解为.pyc文件,然后uncompyle6获取源代码。问题是它pyinstxtractor不以.pyc格式返回源代码,所以我基本上必须自己转换它,然后向其中添加“魔术数字”,以便uncompyle6将其视为.pyc. 如果你想知道我是如何得到幻数的,那么我只是使用了一个十六进制编辑器来查看另一个的幻数.pyc,那就是pyinstxtractor吐出来然后我只是将它们粘贴到主文件中。所以在那之后,我写

uncompyle63 name_of_pyc.pyc

我收到这个错误:

Traceback (most recent call last):
  File "c:\python\lib\site-packages\xdis\load.py", line 208, in load_module_from_file_object
    co = marshal.loads(bytecode)
ValueError: bad marshal data (unknown type code)
Traceback (most recent call last):
  File "c:\python\lib\site-packages\xdis\load.py", line 208, in load_module_from_file_object
    co = marshal.loads(bytecode)
ValueError: bad marshal data (unknown type code)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\python\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\python\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python\Scripts\uncompyle6.exe\__main__.py", line 9, in <module>
  File "c:\python\lib\site-packages\uncompyle6\bin\uncompile.py", line 194, in main_bin
    **options)
  File "c:\python\lib\site-packages\uncompyle6\main.py", line 261, in main
    source_encoding, linemap_stream, do_fragments)
  File "c:\python\lib\site-packages\uncompyle6\main.py", line 161, in decompile_file
    source_size) = load_module(filename, code_objects)
  File "c:\python\lib\site-packages\xdis\load.py", line 116, in load_module
    get_code=get_code,
  File "c:\python\lib\site-packages\xdis\load.py", line 222, in load_module_from_file_object
    "Ill-formed bytecode file %s\n%s; %s" % (filename, kind, msg)
ImportError: Ill-formed bytecode file Bot.pyc
<class 'ValueError'>; bad marshal data (unknown type code)

有什么其他方法可以反编译 pyinstaller 可执行文件(如果这个方法没用)?

1个回答

正如您所说,.pyc文件以魔法(每个 python 版本)+时间戳开头。尽管这些文件结构正确,但这些工具有时无法读取这些文件。总之,反编译不需要这个元数据。

如果您可以到达编组代码的开头,通常在距.pyc文件开头的偏移 8 处,您可以使用 python 的内置dismarshal库:

import dis
import marshal
f = open("file.pyc","rb")
f.seek(8) #assuming there are magic numbers at the beginning
code = marshal.load(f)
dis.dis(code)

不方便的是,它将代码打印到stdout而不是将其作为文本返回给调用者。

确保从.pyc最初编译的 python 版本运行代码