как закрыть исходный код python
Как защитить исходный код Python?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Защитить исходный код странички ASP
Технология ASP.NET позволяет компиллировать странички *.ASP (Слышал, что получается *.ASPX) Можно.
Перевести исходный код на Python
#include #include #include int i0, i1; double x0, sigma, h, tay.
Как узнать исходный код метода из dll через код C#?
Как узнать исходный код метода из dll через код C#? помогите, пожалуйста!! :sorry:
Как получить исходный код *.exe или отредактировать его исполняемый код?
Собственно возможно ли декомпилить его так, чтобы можно было потом обратно скомпилировать? Или.
snow78, защитить никак, можно обфусцировать код.
а какие популярные компании распространяют питоновский код, скомпилированный в exe?
Добавлено через 2 минуты
Да вот и подтверждение по ссылке выше(с хабра).»Бинарные файлы модулей *.pyc и *.pyo (байт-код) легко декомпилируются, поэтому распространять их в чистом виде нельзя (если уж мы решили не показывать исходники по-настоящему).»
Если бы они могли на 100% защитить свои программы, то не появлялись бы их пиратские копии.Есть разные пути защиты своих программ, один из них, это тот, о котором сказал Garry Galler, это держать исходник на сервере. Так чаще всего поступают с играми, которые работают в режиме онлайн. Для локальных игр используют игровые приставки, но и они по моему часто требуют подключения к интернет серверу. Есть еще один путь, это богатый сервис сопровождения через интернет, чего лишаются те, кто использует пиратские программы, что склоняет пользователей использовать лицензионные продукты. Но на все эти варианты защиты, требуется наличие большого штата разработчиков, которые работают именно на обеспечение защиты. Если Вы не работаете в большой мощной фирме, то сомневаюсь, что Вы сможете заработать на продукте, который разработали в одиночку (если он даже будет пользоваться спросом), пытаясь организовать массовую продажу. Просто продукт, если он будет пользоваться спросом, разойдется без Вашего участия. Заработать программированием Вы можете только выполняя уникальные заказы, как на свою компанию, так и на стороне.
Ну или если Вы собрав талантливых единомышленников создадите революционный продукт, который постоянно будет совершенствоваться, так что пираты просто не будут успевать за Вами взламывать программы, что бы пиратские программы безнадежно устаревали. Или Ваша программа, что бы быть актуальной, должна постоянно обновлять информацию. Как например библиотеки у Касперского, или программы 1С, которые постоянно отслеживают все законодательные изменения и так далее.
Добавлено через 18 минут
snow78, Кстати, я читал про проект, разрабатываемый компанией Касперского. Если они от него не отказались, то это пожалуй самый перспективный способ защиты. Они планировали создать макеты, включая операционные системы, что бы потом для каждого заказчика из макета быстро создавать уникальный код, с которым не смогут разобраться хакеры, так как на этот код не будет универсального исходника. Для разных заказчиков будут, даже одни и те же задачи, реализованы с помощью разных кодов, включая индивидуальные ОС. Не знаю, получается у них реализовать эту задумку или нет, но идея очень мощная. Правда и реализовать такую идею может только большой мощный коллектив талантливых разработчиков.
Об одном способе защиты исходников 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:
И более интересный пример, в котором производятся некоторые вычисления. Здесь все импорты и вызовы функций из зашифрованных модулей скрыты в бинарном модуле. Скачать архив можно по ссылке.
Как защитить 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 приложений
Метод #1: защита через шифрование данных (Sentinel Data File Protection)
Защита приложения Python с помощью Sentinel Data File Protection состоит из трех этапов:
Защищенное приложение может распространяться путем упаковки защищенного с помощью Envelope интерпретатора вместе с зашифрованными *. pyc файлами (например, с использованием pyinstaller ).
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту Python приложения для Windows с помощью Sentinel Data File Protection, можно найти в директории:
C:\Users\ \Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \data_file_protection
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
C:\Users\ \Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app
Директория data_file_protection содержит:
● build_dfp_protected_python2_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python2 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилит ы шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● envelope_python2.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python2 (python27.dll) для приведенного выше сценария.
● build_dfp_protected_python3_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python3 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилит ы шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● envelope_python3.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python3 (python37.dll) для приведенного выше сценария.
Для Linux
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
Директория data_file_protection содержит:
● build_dfp_protected_python2_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python2 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● build_dfp_protected_python3_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python3 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
Процесс защиты
Шаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope :
Сборка приложения и зависимостей в *. py модуль
Запустите pyinstaller с параметрами: «- d noarchive » для требующего защиты*. py модуля, например:
Результатом этого шага является автономная папка ( dist / application _ name >), содержащая ваше приложение и все его зависимости.
Примечание: Если установленный pyinstaller не поддерживает ключ «- d noarchive «, он слишком стар и его необходимо обновить с помощью команды pip :
Шифрование *.py модулей
Используйте dfcrypt для шифрования чувствительных модулей байт-кода вашего приложения, например:
Хотя это и не является строго обязательным, рекомендуется использовать ключ «— key :» для указания общего ключа шифрования для всех модулей приложения. Это позволяет использовать логику кэширования, которая может существенно улучшить время запуска приложения, использующего большое количество защищенных модулей. Не указывая «— key :», команда dfcrypt выбирает случайный ключ для каждого файла.
Когда закончите с шифрованием, замените исходные файлы их зашифрованным аналогом, например:
copy encrypted/moduleA.pyc dist//
copy encrypted/moduleB.pyc dist//
Защита интерпретатора Python
Защитите с помощью Envelope библиотеку интерпретатора Python (*. dll / *. so ) с поддержкой возможности чтения зашифрованных файлов данных:
Например в Linux и Python 2:
Ключ «—dfp» активирует Data File Protection, что позволяет защищенному интерпретатору Python выполнять зашифрованные модули Python.
В Windows используйте Sentinel Envelope и активируйте Data File Protection Version 2.
Скопируйте выходные файлы Envelope в дтректорию: dist/.
Чтобы развернуть защищенное приложение, просто скопируйте папку dist / application _ name > на целевой компьютер.
Метод #2: экспорт модулей через Cython и защита с помощью Sentinel Envelope
Защита приложения Python с помощью Cython и Sentinel Envelope состоит из трех этапов:
Защищенное приложение можно распространять, предоставляя защищенные модули расширения Python вместе со стартовым скриптом вашего приложения (например: pyinstaller ).
Примеры защиты
Для Windows
C:\Users\ \Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \cythonize_and_envelope
C:\Users\ \Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app
Директория cythonize_and_envelope содержит:
● build_python2.bat Этот сценарий защищает и упаковывает пример приложения для Python2 под Windows, с использованием: кода разработчика DEMOMA, Cython, компилятора Microsoft Visual C ++ для Python 2.7, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py2modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py3modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.
Для Linux
Пример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории:
Директория cythonize_and_envelope содержит:
● build_python2.sh
Этот сценарий защищает и упаковывает приложение для Python2 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
● build_python3.sh
Этот сценарий защищает и упаковывает приложение для Python3 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.
Процесс защиты
Шаги для создания защищенного приложения с использованием Cython и Sentinel Envelope :
Cython может быть установлен с использованием команды pip :
Запустите cython и укажите, должен ли он обрабатывать код как Python 2 или Python 3:
Установите требуемый компилятор:
● Python2: C:\Users\ \AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat» amd64
● Python3: C:\ \VC\Auxiliary\Build\vcvarsall.bat» amd64
apt install python2-dev
apt install python3-dev
Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope
Пример команды для защиты для Linux :
Для Windows используйте Sentinel Envelope точно так же, как при защитите обычного dll / exe файла.