April 12, 2023

Защищаем свой Python софт от взлома

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

Первым делом, разберем терминологию.

Pyinjector - это херь с помощью которой можно внедрить свой python код в уже исполняемый файл написанный на питоне

Тема на гитхабе - https://github.com/call-042PE/PyInjector

Байт-код - это херь которая получается из твоего исходного кода, она понятна для ядра питона, но еще читабельна для обычного чела, и может декомпилироваться в обычный код с помощью библиотек по типу uncompyle6

Обфускация - это херь с помощью которой можно запутать код от прочтения обычным человеком, но так же существует деобфускация

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

Джанк-код (junk-code) - код который не несет пользы в работе программы, но запутывает реверсера

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

Компиляция

разберем сначала компиляцию, так как похуй какую защиту ты намудрил если достанут исходный код

Pyinstaller

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

Pyarmor

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

Nuitka

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

Защита

Кряк можно разбить на две части, с внедрением и без

без внедрения можно подменить ответ от сервера через http debugger и подобные софты, но от такого защититься довольно просто, используем шифрование, для этого на сервере и на клиенте надо держать по статическому ключу шифрования, и лучше его сделать часто используемым словом, который часто можно найти в памяти, просто спрятать, потому что в память он все равно попадет, после этого шифруем вместе с статусом лицензии допустим текущую дату в timestamp или любую другую динамическую информацию, что бы нельзя было подменить прошлым валидным ответом

теперь разберем вариант кряка с внедрением

с помощью внедрения кода в уже исполняемый файл можно сделать следующее

  1. подменить любую функцию, класс, глобальную переменную
  2. перехватить аргументы, допустим ты передал в hashlib.md5 текст, происходит подмена функции md5, и я узнаю текст который ты собирался туда передать, и так же могу вернуть собственный ответ
  3. вывести названия всех функций, классов, переменных
  4. вызывать функцию со своими аргументами
  5. подменить функцию импорта и узнать что ты импортировал, и подменить в определенной библиотеке функцию/класс/переменную

и это только то что известно мне, наверняка есть еще пару приколов которые можно обнаружить

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

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

exec = None

eval = None

это защитит от базового конфига pyinjector, так как он использует exec для внедрения

используйте python 10+ версии при компиляции, это так же защитит от базового конфига pyinjector

Теперь советы по джанк коду

допустим у нас есть либа PyQt5 (не используйте именно ее), в ней овер дохера функций, классов, и тому подобных, вот из нее импортируем все

после этого мы суем важные аспекты проверки лицензии, да и вообще функционал в подклассы этих классов

например проверка лицензии будет вызываться не как check_license(), а например PyQt5.ShowMetrics.data.__init__(), так же надо сделать много разных одинаковых или нет функций проверок лицензий, в разных частях классов, и вызывать рандомно какую-то из них

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

дополнительно можно накинуть на уже готовый файл vmprotect или подобные протекторы которые защищают от инжекта dll

на этом все, пишите какие еще сделать статьи

https://t.me/injuankanal