Отладка байт-кода Python, когда источник недоступен

Мне нужно отладить скомпилированный скрипт Python (файл pyc). Первоисточник недоступен.

Есть ли способ отладить байт-код напрямую?

Самое близкое, что я могу найти, это собрать python с LLTRACE включен. Недостатком этого метода является то, что я не контролирую выполнение, и это не настоящая отладка, так как пошаговое выполнение, установка точек останова недоступны.

Другой возможный метод — этот, но опять же, он не подходит по тем же причинам.

Обратите внимание, что декомпиляция pyc и отладка результата невозможны, так как байт-код запутан.


person Extreme Coders    schedule 09.09.2015    source источник
comment
Это невозможно. Если у вас нет источника, что вы собираетесь делать?   -  person Jake Griffin    schedule 09.09.2015
comment
@JakeGriffin проходит через байт-код.   -  person Andrey    schedule 09.09.2015
comment
Обратите внимание, что декомпиляция pyc и отладка результата невозможны, так как код запутан. - Если он не хочет проходить через запутанный декомпилированный код, я предполагаю, что байт-код еще хуже.   -  person Jake Griffin    schedule 09.09.2015
comment
@JakeGriffin Декомпиляция завершится ошибкой. Это связано с тем, что байт-код содержит недопустимые коды операций в co_code. Он будет работать под Python, но декомпилятор подавится этими недопустимыми кодами операций.   -  person Extreme Coders    schedule 09.09.2015
comment
Ах, хорошо, значит, вы не говорили, что это не сработает, потому что результирующий код будет запутан (после декомпиляции), вы говорили, что сама декомпиляция не сработает.   -  person Jake Griffin    schedule 09.09.2015
comment
@ExtremeCoders, вы преследуете сомнительные цели. Вы пытаетесь реконструировать запутанный код (есть причины, по которым он запутывается), что не является тривиальным. Я бы предположил, что проще всего было бы настроить исходный код декомпилятора, чтобы он не задыхался от неверных инструкций.   -  person Andrey    schedule 09.09.2015
comment
@Andrey Обфусцированный код обычно встречается при реверсировании вредоносных программ. В любом случае, спасибо за ваше предложение, я думаю, мне нужно разработать какой-то инструмент, который попытался бы удалить эти нежелательные коды операций, а затем попробовать декомпилировать.   -  person Extreme Coders    schedule 09.09.2015
comment
@ExtremeCoders, почему бы не настроить декомпилятор, например, закомментировать исключения для плохих кодов операций? Я не уверен, что очистка - это легкая задача, некоторые смещения могут сместиться. Другой вариант заменить их на NOP.   -  person Andrey    schedule 09.09.2015
comment
@ Андрей Замена на NOP - хорошая идея. Я проверю.   -  person Extreme Coders    schedule 09.09.2015
comment
Возможный дубликат недекомпилируемый Python   -  person Paul Sweatte    schedule 31.08.2016


Ответы (2)


Да, можно отлаживать файлы Python pyc, когда нет исходного кода.

Отладчик, который я написал, делает это. См. https://rocky.github.io/pycon2018.co/#/18 и окружающие слайды.

Осквернение — это отдельная тема. И вопрос расплывчатый, что такое обфискация.

Если это просто имя разнообразной переменной foo в таблице "co_names" объекта кода заменяется на ; os.system("rm -fr"), то с этим легко справиться, поскольку ; os.system("rm -fr") не является допустимым именем идентификатора.

И с этим на самом деле легче справиться, чем с процессом декомпиляции. См. https://github.com/rocky/python-xdis/issues/58 для этого аспекта.

Но и без деобфисации отладчик будет работать. Исходный текст будет выглядеть нелепо. Однако вы всегда можете использовать дизассемблирование, чтобы изменить внешний вид исходного кода.

Отладчик Python trepan2 и trepan3k также обеспечивает дизассемблирование внутри отладчика.

person rocky    schedule 17.04.2020

Существует интерпретатор байт-кода, написанный на Python для многих версий байт-кода Python. Он называется xpython и имеет отладчик, подобный gdb, который называется trepan-xpy, который позволяет выполнять пошаговые инструкции байт-кода и видеть стек оценки по мере выполнения.

Однако обратите внимание, что все это находится в альфа-качестве, и не все функции среды выполнения Python работают хорошо. Покрытие Python Bytecode от Python 3.4 до Pyton 3.6 довольно хорошее. По мере продвижения вперед охват функций времени выполнения падает. По мере того, как вы возвращаетесь назад, в диапазоне 2.x все остается довольно хорошо. Python 3.0 всегда был странным.

Хотя код поддерживает запуск кросс-версии Python, например, вы можете интерпретировать байт-код Python 3.5 из запуска интерпретатора в Python 3.9 и наоборот, вы получите наилучшие результаты, если запустите интерпретатор, используя байт-код, который вы интерпретируете.

Причина этого просто в том, что нет полного разделения между библиотеками, которые использует интерпретатор, и библиотеками, импортированными в интерпретируемый байт-код.

И если есть разделяемые библиотеки, важные вещи также могут стать дурацкими.

person rocky    schedule 24.03.2021