как защитить код python

Как защитить исходный код Python?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Защитить исходный код странички ASP
Технология ASP.NET позволяет компиллировать странички *.ASP (Слышал, что получается *.ASPX) Можно.

Перевести исходный код на Python
#include #include #include int i0, i1; double x0, sigma, h, tay.

как защитить код python. tick. как защитить код python фото. как защитить код python-tick. картинка как защитить код python. картинка tick. Помощь в написании контрольных, курсовых и дипломных работ здесь.Как узнать исходный код метода из dll через код C#?
Как узнать исходный код метода из dll через код C#? помогите, пожалуйста!! :sorry:

Как получить исходный код *.exe или отредактировать его исполняемый код?
Собственно возможно ли декомпилить его так, чтобы можно было потом обратно скомпилировать? Или.

snow78, защитить никак, можно обфусцировать код.

а какие популярные компании распространяют питоновский код, скомпилированный в exe?

Добавлено через 2 минуты
Да вот и подтверждение по ссылке выше(с хабра).»Бинарные файлы модулей *.pyc и *.pyo (байт-код) легко декомпилируются, поэтому распространять их в чистом виде нельзя (если уж мы решили не показывать исходники по-настоящему).»

Если бы они могли на 100% защитить свои программы, то не появлялись бы их пиратские копии.Есть разные пути защиты своих программ, один из них, это тот, о котором сказал Garry Galler, это держать исходник на сервере. Так чаще всего поступают с играми, которые работают в режиме онлайн. Для локальных игр используют игровые приставки, но и они по моему часто требуют подключения к интернет серверу. Есть еще один путь, это богатый сервис сопровождения через интернет, чего лишаются те, кто использует пиратские программы, что склоняет пользователей использовать лицензионные продукты. Но на все эти варианты защиты, требуется наличие большого штата разработчиков, которые работают именно на обеспечение защиты. Если Вы не работаете в большой мощной фирме, то сомневаюсь, что Вы сможете заработать на продукте, который разработали в одиночку (если он даже будет пользоваться спросом), пытаясь организовать массовую продажу. Просто продукт, если он будет пользоваться спросом, разойдется без Вашего участия. Заработать программированием Вы можете только выполняя уникальные заказы, как на свою компанию, так и на стороне.
Ну или если Вы собрав талантливых единомышленников создадите революционный продукт, который постоянно будет совершенствоваться, так что пираты просто не будут успевать за Вами взламывать программы, что бы пиратские программы безнадежно устаревали. Или Ваша программа, что бы быть актуальной, должна постоянно обновлять информацию. Как например библиотеки у Касперского, или программы 1С, которые постоянно отслеживают все законодательные изменения и так далее.

Добавлено через 18 минут
snow78, Кстати, я читал про проект, разрабатываемый компанией Касперского. Если они от него не отказались, то это пожалуй самый перспективный способ защиты. Они планировали создать макеты, включая операционные системы, что бы потом для каждого заказчика из макета быстро создавать уникальный код, с которым не смогут разобраться хакеры, так как на этот код не будет универсального исходника. Для разных заказчиков будут, даже одни и те же задачи, реализованы с помощью разных кодов, включая индивидуальные ОС. Не знаю, получается у них реализовать эту задумку или нет, но идея очень мощная. Правда и реализовать такую идею может только большой мощный коллектив талантливых разработчиков.

Источник

Как защитить Python-приложения от внедрения вредоносных скриптов

как защитить код python. . как защитить код python фото. как защитить код python-. картинка как защитить код python. картинка . Помощь в написании контрольных, курсовых и дипломных работ здесь.

Python-приложения используют множество скриптов. Этим и пользуются злоумышленники, чтобы подложить нам «свинью» — туда, где мы меньше всего ожидаем её увидеть.

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

Python-код нужно размещать в безопасных местах

Модель безопасности Python основана на трёх принципах:

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

Папка Downloads — уязвимая локация

Существует множество способов заставить браузеры (а иногда и другое программное обеспечение) поместить файлы с произвольными именами в папку Downloads («Загрузки») без ведома пользователя. Эту уязвимость использует атака под названием «Подмена DLL». В нашем случае речь пойдёт о скриптах Python, но идея та же самая.

Браузеры стали более серьёзно относиться к этому и постепенно пытаются сделать так, чтобы посещённые пользователем сайты не могли тайно сбрасывать файлы в его папку Downloads.

Как работает атака

Вроде бы ничего страшного, но, оказывается, две недели назад на совершенно другом сайте, который вы посетили, какой-то XSS JavaScript без вашего ведома загрузил pip.py с вредоносными программами в вашу папку Downloads.

Авария!

Странное поведение PYTHONPATH

Несколькими абзацами выше я писал:

единственная локация (кроме папки с установленным Python), которая будет автоматически добавлена в ваш sys.path по умолчанию, — это папка с главным скриптом или исполняемым файлом.

Так, а что здесь делает словосочетание «по умолчанию»? Какие ещё локации можно добавить?

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

Останется только запустить его:

Пока всё идёт неплохо.

Точно, это совсем не безопасно!

Если по каким-то причинам вы этого сделать не можете, то используйте лайфхак:

В bash и zsh это даст вот такой результат:

Ну вот, теперь нет никаких лишних двоеточий и пустых записей.

Проблема гораздо серьёзнее

Существует несколько вариантов опасного развития событий, связанных с запуском Python-файлов из папки Downloads:

Предостережения

В общем, просто избегайте использования Downloads в качестве текущего рабочего каталога и любые скрипты, которые вы хотите использовать, перед запуском переместите в более подходящее место.

Важно понимать, откуда Python берёт код, который будет выполнять. Позволить кому-либо выполнить хотя бы одну строку левого Python-скрипта равносильно предоставлению полного контроля над вашим компьютером!

Производственная необходимость

Читая такую статью с «советами и лайфхаками» по безопасности очень легко предположить, что автор очень умён, знает кучу мелочей, которую и другие должны знать и постоянно думать об этом. Но на самом деле, это не совсем так. Я объясню.

За многие годы работы я с завидной периодичностью наблюдал, как пользователи не понимали, откуда Python загружает код. Например, люди помещают свою первую программу, использующую Twisted, в файл с именем twisted.py. Но ведь в этом случае импорт библиотеки просто невозможен!

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

Поэтому «просто всё время будь осторожнее» не является надёжным рецептом. Те ИТ-специалисты, которые несут ответственность за продукты с большим количеством пользователей, действительно обязаны быть более осторожными. По крайней мере, должны быть проинформированы об особенностях работы тех или иных инструментов разработки.

Баг или фича.

Ничего из того, что я описал выше, на самом деле не является настоящей «ошибкой» или «уязвимостью». Я не думаю, что разработчики Python или Jupyter сделали что-то по ошибке. Система работает так, как она спроектирована, и это, наверное, можно объяснить. Лично у меня нет идей, как можно что-то в ней изменить, не урезая ту мощь Python, за которую мы так его ценим.

Одно из моих любимых изобретений — это SawStop, уникальная система безопасности для настольных пил. Она позволяет останавливать вращение пильного диска в течении 5 миллисекунд — при контакте с человеческим телом. До изобретения этой системы настольные пилы были инструментами чрезвычайно опасными, но они выполняли важную производственную функцию. На настольных пилах было сделано много очень полезных и важных вещей. Тем не менее, верно также и то, что на настольные пилы приходилась непропорционально большая доля несчастных случаев в деревообрабатывающих цехах. Теперь SawStop экономит много пальцев каждый год.

Таким образом, подробно описав сложности при работе со скриптами Python, я также надеюсь натолкнуть на размышления некоторых инженеров по безопасности. Можно ли сделать SawStop для выполнения произвольного кода для интерактивных интерпретаторов? Какое решение могло бы предотвратить некоторые из описанных выше проблем?

Оставайтесь в безопасности, друзья.

На правах рекламы

VDSina предлагает безопасные серверы на Linux или Windows — выбирайте одну из предустановленных ОС, либо устанавливайте из своего образа.

Источник

Как защитить код Python?

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

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

Есть ли хороший способ справиться с этой проблемой? Желательно с готовым решением.

Программное обеспечение будет работать в системах Linux (поэтому я не думаю, что py2exe справится с задачей).

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

«Есть ли хороший способ справиться с этой проблемой?» Нет. Ничто не может быть защищено от обратного проектирования. Даже встроенное ПО на DVD-машинах было перепроектировано, и ключ шифрования AACS был открыт. И это несмотря на то, что DMCA считает это уголовным преступлением.

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

Лицензии. Контракты. Условия и положения. Это все еще работает, даже когда люди могут читать код. Обратите внимание, что некоторые из ваших компонентов на основе Python могут потребовать уплаты сборов перед продажей программного обеспечения с использованием этих компонентов. Кроме того, некоторые лицензии с открытым исходным кодом запрещают скрывать источник или происхождение этого компонента.

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

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

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

Предложите это как веб-сервис. SaaS не требует загрузки для клиентов.

Python не тот инструмент, который вам нужен

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

Если вы хотите что-то, что вы не видите, ищите другой инструмент. Это не плохо, важно, что существует несколько разных инструментов для разных целей.

Запутывание действительно трудно

Даже скомпилированные программы могут быть перепроектированы, поэтому не думайте, что вы можете полностью защитить любой код. Вы можете анализировать запутанный PHP, взламывать ключ шифрования флэш-памяти и т. Д. Новые версии Windows взламываются каждый раз.

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

Защита кода переоценена

Компилировать Python и распространять двоичные файлы!

Разумная идея:

Таким образом, код Python (байтовый) не останется, и вы, я думаю, выполнили какое-то разумное количество мер по укрывательству, которые (например, ваш работодатель) могли ожидать от обычного кода. (.NET или Java менее безопасны, чем этот случай, поскольку этот байт-код не запутывается и может быть относительно легко декомпилирован в разумный источник.)

Cython становится все более и более совместимым с CPython, поэтому я думаю, что он должен работать. (На самом деле я рассматриваю это для нашего продукта. Мы уже создаем некоторые сторонние библиотеки в виде pyd / dll, поэтому доставка нашего собственного кода Python в виде бинарных файлов не является для нас слишком большим шагом.)

Смотрите этот пост в блоге (не мной), чтобы узнать, как это сделать. (спасибо @hithwen)

Сумасшедшая идея:

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

Вне сумасшедшего

Возможно, вы сможете создать один исполняемый файл, если сможете статически связывать (и оптимизировать) среду выполнения Python и все библиотеки (dll). Таким образом, было бы трудно перехватывать вызовы в / из python и любых библиотек фреймворка, которые вы используете. Это не может быть сделано, если вы используете код LGPL.

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

Вот мои предложения:

(a) Напишите критические фрагменты кода в виде библиотек C или C ++, а затем используйте SIP или swig, чтобы представить API C / C ++ в пространстве имен Python.

(б) Используйте Cython вместо Python

(c) В обоих случаях (a) и (b) должна быть возможность распространять библиотеки в виде лицензионного двоичного файла с интерфейсом Python.

Знает ли ваш работодатель, что он может «украсть» любые идеи, которые другие люди получают из вашего кода? Я имею в виду, если они могут читать твои работы, то ты можешь их. Возможно, рассмотрение того, как вы можете извлечь выгоду из сложившейся ситуации, принесет лучшую отдачу ваших инвестиций, чем опасение того, сколько вы можете потерять.

[EDIT] Ответ на комментарий Ника:

Ничего не получено и ничего не потеряно. Клиент имеет то, что он хочет (и заплатил за это, так как он сделал изменение самостоятельно). Так как он не выпускает изменения, как будто это не случилось для всех остальных.

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

Опять же у нас есть два случая: первоначальный клиент продал всего несколько копий. Это означает, что они все равно не заработали много денег, так зачем беспокоиться. Или они продаются в объеме. Это означает, что у вас больше шансов узнать о том, что они делают, и что-то с этим сделать.

Вместо этого, как упоминалось во многих постерах, сделайте это:

Я написал подробную статью о том, как настроить Cython для проекта Python, посмотрите его:

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

Таким образом, проверки лицензии могут быть выполнены в безопасности вашей собственной серверной комнаты.

Хотя идеального решения не существует, можно сделать следующее:

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

Хотя это не кроссплатформенное или чисто Python-решение, оно будет работать.

Я думаю, что есть еще один способ защитить ваш код Python; часть метода запутывания. Я считаю, что была такая игра, как Mount and Blade или что-то, что изменило и перекомпилировало их собственный интерпретатор Python (оригинальный интерпретатор, который, я считаю, с открытым исходным кодом) и просто изменило коды OP в таблице кодов OP, чтобы они отличались от стандартных OP Python. коды.

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

Например, вы можете в модифицированном интерпретаторе разрешить ему проверять наличие определенных комментариев или строк документации в вашем источнике. Вы можете иметь специальные OP-коды для таких строк кода. Например:

ОП 234 предназначен для строки исходного текста «# Авторские права я написал это» или скомпилирует эту строку в коды операций, которые эквивалентны «if False:», если отсутствует «# Copyright». По сути, отключение целого блока кода по неясной причине.

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

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

Источник

Существует ли способ защитить код написанный на Python?

Собственно написана программа на Python. Делает что нужно с тем чем нужно. На это имеется спрос.

Хочу каждую копию:
1. либо привязать к железу
2. либо продавать повремёнку, используя ключ, и чтобы через сайт прога проверяла, активна лицензия или её нужно продлить.
3. ну или сочетание первого пункта со вторым.

Сделать то я сделаю. Вопрос в том, как защитить код, чтобы потом эту «защиту» не выпилили?

При этом задача защиты должна обладать следующими качествами.
1. Чтобы это можно было сделать простому смертному программисту без «танцев с бубном» (а не после того, как прочитал кучу мануалов на английском, где нифига ничего не понятно и всё было написано ещё при царе горохе)
2. Чтобы запускалось и работало на Windows 7-8-10. В идеале хотя бы чтобы был exe-лаунчер.

p.s. естественно Python 3 и скорее всего 64 bit

как защитить код python. 1be831bf3e48464b9d29e8e622839b2b. как защитить код python фото. как защитить код python-1be831bf3e48464b9d29e8e622839b2b. картинка как защитить код python. картинка 1be831bf3e48464b9d29e8e622839b2b. Помощь в написании контрольных, курсовых и дипломных работ здесь.

1) Запускать приложение у себя на сервере по платной подписке;
2) Не использовать python;
3) PyInstaller(код правда скорее всего не защитите, а вот проблем появится вагон и большая тележка).

как защитить код python. e624f55c27ced9b25ee01243698f2e63. как защитить код python фото. как защитить код python-e624f55c27ced9b25ee01243698f2e63. картинка как защитить код python. картинка e624f55c27ced9b25ee01243698f2e63. Помощь в написании контрольных, курсовых и дипломных работ здесь.

Приложение не бот. Работа происходит с большим количеством изображений. Поэтому:
1. У меня нет мощностей инстаграма, поэтому вариант с работой на стороне сервера мне не подходит.

2. В ответе стоит «Ну», видимо должно быть «Не» использовать python. Но вопрос именно про python. Поэтому на мой взгляд крайне некорректно так отвечать. Понятное дело, что можно вечером, после работы уделять пару часов, изучить какой-нибудь курс по C# более углубленно, написать несколько тестовых вариантов, подобрать модули и глядишь через пол-годика-годик переписать это всё на другом языке. Но спрос то сейчас, программа готова и она на Python.

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

4. Это не бот. Под капотом PIL, pyexiv2 и PySide2. Я конечно почитаю статью из предложенного варианта, но что-то у меня какие-то сомнения на этот счёт. Потому что большинство всякого рода защит, которые мне попадались работали с программами по сложности сравнимыми с hello-world. Но в любом случае спасибо.

поэтому вопрос остаётся открытым.

как защитить код python. b58add29d8aabf1d8d2182234007e821. как защитить код python фото. как защитить код python-b58add29d8aabf1d8d2182234007e821. картинка как защитить код python. картинка b58add29d8aabf1d8d2182234007e821. Помощь в написании контрольных, курсовых и дипломных работ здесь.

На linux как-то так:

Но флаги компайлеру конечно свои скармливай.

как защитить код python. e624f55c27ced9b25ee01243698f2e63. как защитить код python фото. как защитить код python-e624f55c27ced9b25ee01243698f2e63. картинка как защитить код python. картинка e624f55c27ced9b25ee01243698f2e63. Помощь в написании контрольных, курсовых и дипломных работ здесь.

как защитить код python. e624f55c27ced9b25ee01243698f2e63. как защитить код python фото. как защитить код python-e624f55c27ced9b25ee01243698f2e63. картинка как защитить код python. картинка e624f55c27ced9b25ee01243698f2e63. Помощь в написании контрольных, курсовых и дипломных работ здесь.

javedimka, не надо меня оскорблять братан. Тем более что ты не разу не братан. Я попробовал прежде чем написать условия наверное с десяток способов. И твой в том числе. На винде нифига ничего не вышло. А на лине у меня нет клиентов. Ты бы прежде чем понты колотить, сам бы попробовал сделать что-то крупнее «print(«hello world»)» и на винде это всё твоими двумя строчками скомпилировать. А то у нас все такие умные, что писец, а по факту написаны ведь требования. Люди умные их видят и не строят из себя, а ты нет, не видишь? Ну если слепой иди лесом. А если предлагаешь, то предлагай исходя из условий. А условий 2.
1. Должно быть простое понятное действо, где будет ясно для чего я это делаю и почему (т.е. как я описал, чтобы было без танцев с бубном. И в это выражение я вкладываю то, что я должен понимать, что происходит, а не быть шаманом и надеяться на копипаст, который вообще не предназначен для винды от слова совсем)
2. А оно должно работать именно под виндой, потому что заказчики сидят на винде.
И если ты такой умный, но слепой и не видишь требований, то иди лесом.

Источник

Об одном способе защиты исходников Python-программы

Как всё начиналось

Однажды мне пришлось участвовать в разработке одного небольшого проекта для научных расчётов, который разрабатывался на языке программирования Python. Изначально Python был выбран как удобный и гибкий язык для экспериментов, визуализации, быстрого прототипирования и разработки алгоритмов, но в дальнейшем стал основным языком разработки проекта. Надо заметить, что проект был хоть и не большим, но довольно насыщенным технически. Для обеспечения требуемой функциональности, в проекте широко применялись алгоритмы теории графов, математическая оптимизация, линейная алгебра и статистика. Также использовались декораторы, метаклассы и инструменты интроспекции. В процессе разработки пришлось использовать сторонние математические пакеты и библиотеки, например, такие как numpy и scipy, а также многие другие.

Со временем стало ясно, что переписывать проект на компилируемом языке слишком затратно по времени и ресурсам. Скорость работы и потребление памяти не являлись критичными показателями в данном случае и были вполне приемлемыми и достаточными. Поэтому было принято решение оставить всё как есть, и продолжить разработку и поддержку проекта на языке Python. К тому же, документация по большей части уже была написана с использованием Sphinx.

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

Здесь сразу обозначилась новая проблема: как защитить исходные коды нашей Python-библиотеки? Может быть, в ином случае никто бы не стал этим заниматься, я бы уж точно, но в библиотеке были реализованы некоторые ноу-хау, и руководители проекта не хотели, чтобы данные наработки попали к конкурентам. Так как я был одним из исполнителей, мне пришлось озаботиться данной проблемой. Далее я постараюсь рассказать об основной идее, что из этого вышло, и как нам удалось скрыть Python-исходники от лишних глаз.

Что предлагают люди

Как известно, наверное, большинству разработчиков, Python — язык интерпретируемый, динамический с богатыми возможностями интроспекции. Бинарные файлы модулей *.pyc и *.pyo (байт-код) легко декомпилируются, поэтому распространять их в чистом виде нельзя (если уж мы решили не показывать исходники по-настоящему).

Как, я думаю, любой на моём месте, сначала я решил поискать, а что вообще делают люди в таких случаях? Первые же поисковые запросы показали, что люди не знают, что делать и спрашивают об этом на stackoverflow и в других местах, например, вот вопрос на stackoverflow. Поискав, я пришёл к выводу, что везде предлагают несколько спорных способов:

По многим причинам я отбросил все эти способы как неподходящие. Например, обфускация Python-кода. Ну какая может быть обфускация, когда синтаксис языка построен на отступах, а сам язык пронизан «хитрой интроспекцией»? Транслировать все Python-модули в бинарные модули расширения тоже не представлялось возможным, т. к. проект, напомню, был достаточно сложным технически с использованием множества сторонних пакетов, да и сам состоял из большого числа модулей в многоуровневой иерархии пакетов, которые было утомительно перегонять в *.pyd, а потом ловить баги, вылезающие на ровном месте. Возиться с заменой опкодов не хотелось, так как пришлось бы распространять и поддерживать собственную сборку интерпретатора Python, да ещё и компилировать им Python-модули всех используемых сторонних библиотек.

В какой-то момент мне показалось, что эта идея с защитой Python-исходников бесполезная, надо всё это бросить и убедить руководство, что ничего не выйдет и заняться чем-нибудь полезным. Отдаём *.pyc файлы и ладно, кто там будет разбираться? Убедить не получилось, переписывать библиотеку на C++ никому не хотелось, а проект нужно было сдавать. В итоге всё же кое-что получилось сделать. Об этом, если всё ещё интересно, можно прочитать далее.

Что сделали мы

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

Ход моих мыслей был следующим:

Основная идея, думаю, ясна — это более продвинутая обфускация. Как это сделать? Погуглив, я пришёл к выводу, что сделать это вполне реально и даже достаточно просто. С шифрованием исходников всё понятно, зашифровать и/или обфусцировать файлы можно множеством способов, главное, чтобы там была «каша» и «ничего не понятно», а также всё это должно возвращаться к первоначальному виду неизвестным способом (в случае обфускации). Для приведённого здесь примера я буду использовать Python-модуль base64 для «шифрования». В некритичных случаях можно применять замечательный пакет obfuscate.

Python the Importer Protocol

Итак, вроде бы добрались до сути. Можно привести простой пример. Минимальный пример класса, реализующего Importer Protocol, подходящего для наших целей. Он будет заниматься импортом модулей «зашифрованных» base64 из обычной структуры пакетов (в данном случае для простоты мы просто «зашифровали содержимое» файлов, но никак не меняли их имена и структуру пакетов). Считаем, что расширения файлов для наших модулей будут гордо называться «.b64».

Как это работает? Первым делом при создании экземпляра класса собирается информация о модулях нашей библиотеки, которую мы «шифруем». Затем при загрузке конкретного модуля, читается нужный «зашифрованный» файл, «расшифровывается» и импортируется с помощью средств модуля imp уже из «расшифрованной» текстовой строки. Как использовать данный класс? Очень легко. Буквально, одной строчкой включается возможность импортировать «зашифрованные» исходники нашей библиотеки, а по сути ставится хук на импорт:

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

Вот и всё, с этого момента импорт модулей из нашей библиотеки осуществляется с перехватом и «расшифровкой». Наш хук будет дёргаться при любом вызове инструкции import, и если импортируется модули нашей библиотеки, хук будет их обрабатывать и загружать, остальные импорты будут обрабатываться стандартно. Что нам и требовалось для более продвинутой обфускации. Представленный код импортёра и установки хука можно положить уже в *.pyd файл и надеяться на то, что никто не будет его дизассемблировать в надежде понять, что мы тут наворотили. В реальном проекте можно использовать настоящее шифрование, в том числе с использованием аппаратного ключа, что должно повысить надёжность данного метода. Также изменение имён файлов и структуры пакетов может быть полезным для большего запутывания.

Заключение

Возможно, что всё, что тут написано и яйца выеденного не стоит — давно известные истины, либо бред сумасшедшего. Но если вышеописанное кому-то может оказаться полезным, я буду рад. Лично для меня данный опыт был полезен, хотя бы потому, что позволил лучше разобраться в мощной и гибкой системе загрузки и импортирования модулей и Importer Protocol. О тех самых штуках, которые чаще всего не требуются разработчикам для написания программ на Python. Всегда интересно узнать что-то новое.

Спасибо за внимание.

UPD 14.08.2013:
По просьбе tangro сделал минимальный проект, в котором демонстрируется описанный способ, но без настоящего шифрования (применены только некие алгоритмы обратимого преобразования).
Скачать zip-архив можно по ссылке. Нужен Python 2.7 x86 под Windows. Запускать нужно скрипт «test_main.py».

UPD 2:
И более интересный пример, в котором производятся некоторые вычисления. Здесь все импорты и вызовы функций из зашифрованных модулей скрыты в бинарном модуле. Скачать архив можно по ссылке.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *