Я использую pyi-archive_viewer для извлечения основного файла .pyc из моего исполняемого файла ELF, скомпилированного с помощью pyinstaller.Executbale называется 'mal', я сохраняю вывод как mal.pyc.
Я исправил магические числа выходного файла mal.pyc из pyi-archive_viewer в '03 F3 0D 0A '.
00000000: 03f3 0d0a 0000 0000 0002 0000 0040 0000 .............@..
00000010: 0073 2b01 0000 6400 0064 0100 6c00 006d .s+...d..d..l..m
00000020: 0100 5a01 0001 6400 0064 0200 6c02 0054 ..Z...d..d..l..T
00000030: 6400 0064 0300 6c03 006d 0400 5a04 006d d..d..l..m..Z..m
00000040: 0500 5a05 0001 6400 0064 0400 6c06 005a ..Z...d..d..l..Z
00000050: 0600 6400 0064 0400 6c07 005a 0700 6400 ..d..d..l..Z..d.
00000060: 0064 0400 6c08 005a 0800 6400 0064 0400 .d..l..Z..d..d..
00000070: 6c09 005a 0900 6400 0064 0400 6c0a 005a l..Z..d..d..l..Z
00000080: 0a00 6400 0064 0400 6c0b 005a 0b00 6400 ..d..d..l..Z..d.
00000090: 0064 0400 6c0c 005a 0c00 6400 0064 0400 .d..l..Z..d..d..
Я выполнил команду 'uncompyle6 -o.mal.pyc 'и я получаю следующую ошибку.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/xdis/load.py", line 150, in load_module
co = marshal.loads(bytecode)
ValueError: bad marshal data (unknown type code)
Traceback (most recent call last):
File "/usr/local/bin/uncompyle6", line 10, in <module>
sys.exit(main_bin())
File "/usr/local/lib/python2.7/dist- packages/uncompyle6/bin/uncompile.py", line 163, in main_bin
**options)
File "/usr/local/lib/python2.7/dist-packages/uncompyle6/main.py", line 146, in main
decompile_file(infile, outstream, showasm, showast, showgrammar)
File "/usr/local/lib/python2.7/dist-packages/uncompyle6/main.py", line 63, in decompile_file
source_size) = load_module(filename, code_objects)
File "/usr/local/lib/python2.7/dist-packages/xdis/load.py", line 163, in load_module
% (filename, kind, msg))
ImportError: Ill-formed bytecode file mal.pyc
<type 'exceptions.ValueError'>; bad marshal data (unknown type code)
Я предполагаю, что это связано с повреждением .pyc?Кто-нибудь может подсказать, где я ошибаюсь?
ОБНОВЛЕНИЕ: Проблема заключается в том, что я исправляю магические числа.
Я использовал скрипт python_exe_unpack.py https://github.com/countercept/python-exe-unpacker и у него есть -pопция, которая автоматически добавляет магическое число для вас ТОЧНО, как я сделал это вручную.
Вот функция из скрипта python_exe_unpack
if is_prepend_magic:
magic = b'\x03\xf3\x0d\x0a' # Default magic for python 2.7
with edited_pyc as prepend_pyc:
pyc_data = open(main_pyc, 'rb')
prepend_pyc.write(magic) # Magic bytes
prepend_pyc.write(b'\0' * 4) # Time stamp
prepend_pyc.write(pyc_data.read())
pyc_data.close()
Так что все это делает, предваряя '03f3 0d0a'
Функция выполнена успешно и выдает файл .py в виде открытого текста.
Где я мог ошибиться, если делал это вручную, я пробовал другой редактор шестнадцатеричных кодов, но тот же результат.Как видно из моего предыдущего заголовка файла, магические числа совпадают?Все, что я делаю, это заменяю первые 8 байтов, сохраняю и выхожу.