Как предотвратить декомпиляцию или проверку кода Python? - PullRequest
5 голосов
/ 17 июня 2011

давайте предположим, что существует большой коммерческий проект (a.k.a Project), который использует Python под капотом для управления плагинами для настройки новых поверхностей управления, которые могут быть присоединены и использованы Project.

Произошла небольшая утечка информации, некоторая часть Python API проекта просочилась в общедоступную информацию, и люди смогли писать скрипты Python, которые вызывались базовой реализацией Python как часть механизма загрузки плагинов Project.

Далее, используя модуль inspect и необработанные показания __dict__, люди смогли узнать основную часть базовой реализации Project на Python.

Есть ли способ сохранить секретные коды Python в секрете?

Быстрый просмотр документации Python показал способ подавления импорта модуля inspect таким образом:

import sys
sys.modules['inspect'] = None

Решает ли это проблему полностью?

Ответы [ 4 ]

11 голосов
/ 17 июня 2011

Нет, это не решает проблему.Кто-то может просто переименовать модуль проверки в другое и импортировать его.

То, что вы пытаетесь сделать, невозможно.Интерпретатор Python должен быть в состоянии взять ваш байт-код и выполнить его.Кто-то всегда сможет декомпилировать байт-код.Они всегда смогут создать AST и просмотреть поток кода с именами переменных и классов.

Обратите внимание, что этот процесс также можно выполнить с помощью скомпилированного языкового кода;разница в том, что вы получите сборку.Некоторые инструменты могут вывести структуру C из сборки, но у меня недостаточно опыта, чтобы комментировать детали.

Какую конкретную информацию вы пытаетесь скрыть?Не могли бы вы сохранить серверную часть алгоритма и превратить свое программное обеспечение в клиента, который касается вашего веб-сервиса?Хранение кода на компьютере, которым вы управляете, является единственным способом действительно сохранить контроль над кодом.Вы не можете вручить кому-либо запертую коробку, ключи от коробки и не позволить им открыть коробку, когда им нужно открыть ее, чтобы запустить.Это та же самая причина, по которой DRM не работает.

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

8 голосов
/ 17 июня 2011

Нет способа сохранить код вашего приложения в секрете.

Честно говоря, если группа преданных и решительных хакеров (в хорошем смысле, а не в уничижительном смысле) может взломать модель безопасности подписывания кода PlayStation, то у вашего приложения нет шансов. Как только вы отдадите свое приложение в руки кого-то за пределами вашей компании, оно может быть переработано.

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

Но вы должны подумать о своей бизнес-модели. Если вы видите людей, которые увлечены вашим продуктом как угрозу, если вы видите тех, кто готов потратить время и силы на настройку вашего продукта, чтобы персонализировать свой опыт как опасность, возможно, вам нужно пересмотреть свой подход к безопасности. , Предполагая, что вы не работаете в сфере DRM, или у вас есть подобная модель, которая предполагает получение денег от неохотных потребителей, рассмотрите возможность разработки подхода, предусматривающего обмен информацией с вашими пользователями и предоставление им возможности совместно улучшить ваш продукт.

4 голосов
/ 17 июня 2011

Есть ли способ сохранить секретные коды Python в секрете?

Нет, нет.

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

1 голос
/ 17 июня 2011

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

Однако вы можете значительно усложнить процесс, например, путемвозиться с внутренностями Python.Однако, прежде чем перейти к как сделать это, я бы посоветовал вам оценить , чтобы сделать это.Обычно сложнее «украсть» ваш код (в конце концов, чтобы полностью его расширить, нужно полностью его понять), чем самому его кодировать.Однако чистый, не вызывающий сомнений интерфейс плагинов Python может быть жизненно важен для создания целой экосистемы вокруг вашей программы, намного перевешивая возможные недостатки, когда кто-то заглядывает в ваши, возможно, не идеально разработанные внутренние компоненты кодирования.

...