Обфускация байт-кода python через мутацию интерпретатора

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

Я слушал сеанс, сделанный Джованни Баджо (основатель PyInstaller), он сказал, что Dropbox делает это:

  1. байт-код-скремблирование путем перекомпиляции CPython переводчик и при этом стандартный интерпретатор CPython не сможет его запустить, только перекомпилированный интерпретатор cpython.
  2. все, что вам нужно сделать, это тасовать цифры ниже define loadup 8.

Я никогда не проходил исходный код Python, поэтому я не буду утверждать, что полностью понимаю приведенные выше слова.

Мне нужно услышать голос экспертов: как это сделать? И если после перекомпиляции я смогу упаковать свое приложение, используя доступные инструменты, такие как PyInstaller?

обновление:

Я сделал некоторые исследования о том, как Dropbox делает этот тип обфускации / мутации, и я нашел это:

по данным Хаген Фрич, они делают это в два этапа:

  1. они используют шифр чая вместе с RNG, засеянным некоторыми значениями в объект кода каждого модуля python. Они настроили переводчика соответственно так, что это

    a) Расшифровывает модули и

    b) предотвращает доступ к расшифрованным объектам кода.

    Это был бы простой путь, просто позволяя dropbox расшифровать все и сбросить модули с помощью встроенного маршаллера.

  2. еще один используемый трюк - это ручное скремблирование опкодов. К сожалению, это может быть исправлено только полуавтоматически, таким образом, их monoalphabetic шифр подстановки оказалась весьма эффективной с точки зрения выиграть время.

Я все еще хочу больше информации о том, как это можно сделать, больше, я не знаю, как расшифровка происходит в этом процессе... Мне нужен голос всех экспертов ... обычные парни, где вы?

1 ответов


Я полагаю, речь идет о перетасовке чисел в include/opcode.h. Я не вижу #define loadup там, хотя, но, возможно, это относится к какой-то старой версии Python. Я не пробовал этого.

это будет запутать ваш .pyc файлы, чтобы они не могли быть проверены любыми инструментами, которые распознают normal .pyc файлы. Это может помочь вам скрыть некоторые меры безопасности внутри вашей программы. Однако злоумышленник может (например) извлечь пользовательский интерпретатор Python из вашего приложения bundle и рычаги, чтобы проверить файлы. (Просто запустите интерактивный интерпретатор и начните расследование, импортировав и используя dir в модуле)

Также обратите внимание, что ваш пакет наверняка будет содержать некоторые модули из стандартной библиотеки Python. Если злоумышленник догадается, что вы перетасовали опкоды, он может выполнить байтовое сравнение между вашей версией и обычной версией стандартного модуля и обнаружить ваши опкоды таким образом. Чтобы предотвратить эту простую атаку, один можно защитить модули с помощью правильного шифрования и попытаться скрыть шаг дешифрования в интерпретаторе, как указано в обновленном вопросе. Это заставляет злоумышленника использовать отладку машинного кода для поиска кода дешифрования.


Я не знаю, как расшифровка происходит в этом процессе...

вы бы изменили часть интерпретатора, который импортирует модули и вставляете туда код расшифровки C.