Как я задушил питона
Попросил меня братишка значит помочь питона задушить, ну я его нахер послал, не буду я с петушиными языками работать.
Но там было дело чести (точнее ее лишения) поэтому я согласился
Как бы вся трагедия в одном фото, питон обработанный pyinstaller, но на тот момент я не так сильно расстроился пока не увидел это.
Суем файл в detect it easy.
Тут произошло самое страшное, питон не определяется в чекере ,а значит это упаковщик питона самой последней версии из существующих....
О чем это говорит?
Под эту версию питона не существует декомпиляторов, вообще никаких.
Это значит что? Нам предстоит очень увлекательное приключение, и исходники мы не получим. Будем патчить софт практически в блокноте - хекс редакторе. Больше ничего у нас нет.
Что такое pyinstaller?
Pyinstaller - самый продвинутый питоновский упаковщик, он делает питон не таким петуховским и зашкварным, путем линковки всего рантайма питона , а также компиляции питоновского высера в некое подобие нативного кода. (На самом деле это не так, питон конвертируется в некое подобие ассемблера(ущербного), который уже понимает питоновский интерпретатор, развернутый внутри нативного стаба).
Такая адская смесь убивает любую отладку, найти кусок кода отвечающий за лицензию практически невозможно, так как перед нами по сути виртуальная машина для кода.
Также невозможно сделать подмену запроса на сервер - у питона очень сильная сетевуха, которая палит любые кастомные ssl ключи.
В чем вообще проблема, неужели нет никаких наработок? Есть, но все дело в том, что их работа заканчивается на питоне версии 3.9 (даже на нем криво работает), а у нас на секундочку 3.12.7
Единственное что мы можем, добраться до машинно скомпилированного .pyc. Повезло, что нативный стаб по факту zlib архив.
Предлагаю докопаться до самой сути и избавиться от обертки.
А кстати, забыл рассказать о планах всей работы.
1)Вскрываем нативный стаб и получаем питоновский псевдомашинный код.
2)Дизассемблим его как можем, и ищем проверку лицухи.
3)Патчим проверку лицухи в хекс редакторе путем пробы на чистый стаб.
4)Удовлетворяем мое чсв и пишем в софт мои инициалы.
5)Пакуем обратно в нативную обертку.
Ну вот опять здорово я это придумал, пиздец просто, что сам ахуел. В открытых источниках вы кстати не найдете ни одной статьи про патчинг последнего питона.
1)Достаем кишки змеюги
Что мы имеем? pyinstaller это в первую очередь zlib архив, значит просто распакуем его.
Используем pyarchive пакета pyinstaller
Пишем lsd и воруем себе RubotTwitch - основной испольняемый файл .pyc
Нас шлют нахуй, почему-то я не удивлен, ок, нам говорят про магическое число, и мы его посмотрим, открываем файл в нашем блокноте для роботов.
Перед нами вообще нет магического числа для питона версии 3.12.7, неудивительно, что на моем нейроночном оно не запустилось, запускаем через правильный, и дописываем сигнатуру несчастную.
У нас все работает, но ошибки пакетов.
Почему так? Посмотрите как малышка похудела
У нас произошло убийство рантайма нашего змеюги и всех пакетов, но это не страшно, руками поставим.
Отлично, вы достали нашему питону кишки, переходим дальше.
2)Ищем где у нашего питона другие органы
Это все конечно хорошо, но я вам не ЭВМ, чтоб это понимать, нам нужен хотя-бы простенький дизассемблер.
Для упаковки своего кода, кодеры питона создали дизассемблер, убьем их - их же оружием. Нам будет нужен pydisasm.
Для вас я отфильтровал эту машинную рыганину и нашел кусок кода с проверкой.
(Кстати мы уже в человеческом блокноте)
Моя специализация вообще не питон, я в отличие от них по девочкам шарпу.
Но тот кто познал ассемблер, познает любой джит язык.
load global, load fast - питоновские инструкции для пуша в стек различных параметров
call - вызов функции по индексу видимо, который объявлен в шапке.
Здесь у нас инициализация, подготовка стека и вызов функции.
Наша шапка, мы на верном пути, велкоме ту коде.
Тут у нас довольно сложная проверка лицензии, но для нас это только плюс - будет место под мои инициалы =)
3)Пересадка органов
Мы докопались до самой рыганины, ок, но что делать дальше?
Как я уже сказал, я не из этих запрещенных в России организаций, и питоновский аналог ассемблера не знаю, хоть и понимаю его.
Что теперь делать? Не крякать софт трусонюха? Ага щас, есть у меня одна идея.
Создадим пустой стаб, но тут проблема, метод ассинхронный, придется это учесть.
Вот это мы хотим сделать с лицензией, запакуем этот файл.
А теперь распакуем этого франкенштейна и посмотрим снова машинный код
Меняем змее кусок сердца.
Найдем оригинальный кусок лицензии в блокноте для роботов.
С помощью приставки -f bytes я включил отображение байтов инструкций.
Будем искать по инструкции POP_JUMP_IF_FALSE - прыгающий поп довольно редкий персонаж.
Запоминаем паттерн - 729774070000
ctrl + f и мы на месте
Меняем стаб кода на созданный нами, ниже он, нашел также
Берем наши байты стаба и делаем первый патч в начало оригинала
Этого мало, мы же выпендриваемся, и у нас есть импорт, найдем номер принта, у нас он шестой.
Помним мое ЧСВ?
Возвращаемся к строковым константам и аккуратно патчим их
Аккуратно берем, и не дописывая лишних байтов меняем на свои
Патчим вызов строки на стек - это третья константа.
Ну и наконец проверяем наш дизасм код
Мы забыли пропатчить константу на ретурн True.
Софт крякнут, и я как всегда много на себя беру.
4)Сшиваем змею обратно
Окей, мы крутые такие пропатчили машинный код, но как вернуть как було?
Я имею ввиду человеческий .exe
Здравый смысл подсказывает использовать pyinstaller, пробуем
Хуюшки, как в том анекдоте.
Но мы не одноклеточные существа, пробуем другой упаковщик.
Пишем скриптик.
В блокноте)
Кладем лсд к лсд и пишем
Наш свежеиспеченный)
Пробуем запускать
Все как и задумывалось.
Вывод:
Ну, могу сказать, что ни один живой питон не пострадал, моя психика только сильно. Нет ничего невозможного, даже патчить виртуалку вмп голыми руками. Теперь вы тоже умеете производить операции на живых питонах. А еще товарищ Майских найдет ваши грязные секреты даже внутри питона.