Русский / Russian English / Английский

Сейчас на форуме: Adler (+1 невидимый пользователь)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Вопросы новичков —› Как поменять одну строчку кода в python .exe?
Посл.ответ Сообщение

Ранг: 1.2 (гость)
Статус: Участник

Создано: 11 января 2020 12:14 New!
Цитата · Личное сообщение · #1

Есть программа на python .exe собранная через PyInstaller. Ну я ее распаковал успешно с помощью pyinstxtractor.py. Потом успешно декомилировал байт-код файлов .pyc с помощью uncompyle6 и получил на выходе .py. Поменял интересующий код, запустил, открылось окошко, можно переключатся между вкладками, но когда запускаю одну из функций программы, которая создает новый процесс, то спустя некоторое время этот процесс завершается с кодом 9 (причем каждый раз в разном месте). Никаких исключений или ошибок. Просто код 9.
Может я чего то не доставил... Есть какие то другие способы собрать? Ну например вытащить только один интересующий файл из архива PYZ поменять код, запихнуть обратно и потом уже собирать используя этот файл PYZ.
Мне бы какой то мануал, а то в интернете только разборку нашел, а обратную сборку нет...



Ранг: 11.7 (новичок)
Статус: Участник

Создано: 11 января 2020 13:59 · Поправил: AE New!
Цитата · Личное сообщение · #2

Мягко говоря, Питон - это не моё, но по моему в Гугле навалом всего по сборке в ЕХЕ-шник...
Я бы попробовал, для начала, просто разобрать-собрать (ничего не изменяя), посмотреть как этот процесс пойдет, будут ли ошибки, мб декомпиль "как везде"...



Ранг: 1.2 (гость)
Статус: Участник

Создано: 11 января 2020 16:05 New!
Цитата · Личное сообщение · #3

Как раз таки разобрать-собрать, чтобы все работало и является основной проблемой. Еще посмотрел, думал файл hosts подправить, но там не получится. Программа использует RSA: генерирует произвольную строку из 16ти символов, шифрует ее вместе с данными, отправляет на сервер. Ответ же шифрует с помощью AES и этой строки. Клиент уже, имея строку, расшифровывает ответ. Думал узнать эту случайную строку, но так как RSA я не вижу это возможным, открытая экспонента 65537.



Ранг: 60.9 (постоянный)
Статус: Участник

Создано: 11 января 2020 18:26 New!
Цитата · Личное сообщение · #4

А прямо байткод патчить если? Там же вроде il или я ошибаюсь?




Ранг: 324.3 (мудрец)
Статус: Участник

Создано: 11 января 2020 20:16 New!
Цитата · Личное сообщение · #5

van9petryk пишет:
Думал узнать эту случайную строку, но так как RSA я не вижу это возможным


van9petryk пишет:
генерирует произвольную строку из 16ти символов, шифрует ее вместе с данными, отправляет на сервер.


Найди, где генерится строка.



Ранг: 422.3 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 11 января 2020 23:24 New!
Цитата · Личное сообщение · #6

Если верить гуглу, exit code 9 - process killed by system, because out of memory for execute python script. Т.е. явные мелкие неприятности со сборкой.
van9petryk пишет:
Ну например вытащить только один интересующий файл из архива PYZ поменять код, запихнуть обратно и потом уже собирать используя этот файл PYZ.

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

van9petryk пишет:
Программа использует RSA

Так вопрос - просто зарегать прогу или узнать, какие секретные данные от сервера приходят?



Ранг: 1.2 (гость)
Статус: Участник

Создано: 12 января 2020 19:35 New!
Цитата · Личное сообщение · #7

_MBK_сейчас копаю в этом направлении.
Достал из .exe интересующий .pyc файл с помощью pyi-archive_viewer (это такая дополнительная утилита от самих разработчиков упаковщика PyInstaller для просмотра содержимого архива .exe или архива .pyz который лежит в этом .exe).
Ну .pyc был сжат с помощью DEFLATE (это PyInstaller сжимает каждый файл, посмотрел в исходниках, но в новой версии все поменялось, они собирают файлы в архив .pyz не сжатыми, а сжимают весь архив .pyz). Но мне повезло (наверно), использовалась более старая версия, поэтому сжатый .pyc с легкостью превратил в несжатый (то есть декомпрессии всего архива .pyz не понадобилась).

А теперь смотрю, как пропатчить этот файл .pyc, чтобы True изменить на False. [url=Вот тут]https://nedbatchelder.com/blog/200804/the_structure_of_pyc_files.html[/url] есть информация по структуре файла .pyc. Пока что сижу читаю.
Из вариантов еще декомпиляция в исходный код, правка, и компиляция обратно в .pyc. Правда, скорей всего изменится длина, и его уже запихнуть обратно будет не так просто.

Добавлено спустя 2 минуты
DenCoderНу в исходном коде .py я вижу где она генерируется.И что дальше? Или вы имели ввиду найти в отладчике x64dbg?

Добавлено спустя 10 минут
ELF_7719116 по-моему это -9 = out of memory, а у меня просто 9. Смотрел exit code WinApi, то там 9 = The storage control block address is invalid.

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



Ранг: 60.9 (постоянный)
Статус: Участник

Создано: 12 января 2020 19:46 New!
Цитата · Личное сообщение · #8

А нет не il
Но все равно первая ссылка по Гуглу https://habr.com/ru/post/140356/



Ранг: 422.3 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 12 января 2020 22:57 New!
Цитата · Личное сообщение · #9

van9petryk пишет:
как то обойти проверку лицензии.

Как альтернативный вариант - подправить загружаемый через импорт python-интерпретатор, чтобы интерпретировать pyc-код в "правильном" ключе. Если править исходный код и обратно перекомпилить, то тогда уж всю проверку регистрации логично вырезать вообще.
van9petryk пишет:
регистрация идет через сервер.

Собственно, известно, с чем именно сверяется ответ от сервака??

Обычно, такой фигней, как python exe (bat exe и тд) страдают читы и малвара. Навскидку не вспомнить, какой обычный софт таким способом писали или регали.



Ранг: 1.2 (гость)
Статус: Участник

Создано: 13 января 2020 01:18 New!
Цитата · Личное сообщение · #10

_MBK_да,я уже разобрался, и успешно модифицировал. Только теперь после сжатия с помощью DEFLATE файл получатся на 3 байта меньше. Буду пытаться повторить некоторые инструкции, или добавить какой то мусор, чтобы добиться такого же количества байт.

Добавлено спустя 1 час 41 минуту
Повторить или добавить не получилось, сразу получал invalid marshaled object. Там есть структура (поле), в которой хранится информация, к какой строке эта часть байт-кода принадлежит. Так что если добавить что-то, то все начинает ехать. Так что все-таки декомпилировал .pyc, добавил мусор в .py, и таким образом методом тыка получил нужное кол-во байт после DEFLATE. Заменил полученными данными оригинальный файл в архиве .pyz.
Все запустилось, но та же проблема, поработает немного и вылетает дочерний процес. Я хз, кривая програма или что.



Ранг: 60.9 (постоянный)
Статус: Участник

Создано: 13 января 2020 07:50 New!
Цитата · Личное сообщение · #11

Все равно не совсем пойму. Вы чуть выше писали что вам таки удалось сжатый архив превратить в несжатый. После этого (без модификации) программа работает нормально или тоже вылетает?



Ранг: 1.2 (гость)
Статус: Участник

Создано: 13 января 2020 14:55 · Поправил: van9petryk New!
Цитата · Личное сообщение · #12

_MBK_Смотрите. Там такая структура .exe
1 struct
2 some_file.pyc
3 some_file.pyc
4 PYZ

Вот этот архив PYZ он не сжатый, но сами файлы внутри него сжаты DEFLATE'ом (в новых версиях PyInstaller наоборот файлы внутри не сжаты, но сжат сам архив - у меня старая версия, то есть архив не сжатый, сжаты файлы)

На странице документации он описан как ZLibArchive.

Ну вот, я вытащил оттуда интересующий .pyc. Он был сжат DEFLATE. Я его
1. распаковал
2. декомпилировал
3. изменил то что интересовало
4. собрал в .pyc обратно
5. и сжал DEFLATE.

Но так как размер после сжатия DEFLATE уже был другим, пришлось добавлять мусор. Ну я вернулся обратно к этапу 3 и кроме модификации начал добавлять мусор и повторять 4-5 чтобы размер был таким же, как у изначального вытащенного с архива PYZ файла.

Добился. После этого, нашел в hex редакторе блок который соответствовал оригинальному файлу, и заменил этот блок модифицированным файлом.

После этого программа работает так же, как и работала после способа описанного в 1м посте - вылетает спустя некоторого времени после запуска одной из функций.

Добавлено спустя 11 минут
ELF_7719116
С чем сверяется ответ? Не совсем понял.
1. Генерируется случайная строка из 16 символов.
2. Берутся данные + строка -> сжимаются -> шифруются с помощью RSA -> отправляются на сервер.
3. Сервер, с помощью private key дешифрует и распаковывает
4. Сервер шифрует ответ AESом. В качестве ключа выступает случайная строка полученная от клиента.
5. Клиент получает ответ и дешифрует его с помощью случайной строки.
6. Дешифрованный ответ либо строка 'done', либо строка 'invalid', либо еще какой то другой, если это не касается лицензии.

Добавлено спустя 15 минут
ELF_7719116
ELF_7719116 пишет:
подправить загружаемый через импорт python-интерпретатор, чтобы интерпретировать pyc-код в "правильном" ключе

Не совсем пойму, что вы имеете ввиду (какой код в каком ключе?)



Ранг: 60.9 (постоянный)
Статус: Участник

Создано: 13 января 2020 16:26 New!
Цитата · Личное сообщение · #13

Такой эффект может иметь три обьяснения 1) некорректная сборка 2) хитрый контроль целостности 3) вы чего то недоглядели в алгоритме и нельзя просто так взять и заменить false на true
Чтобы как то сузить круг поисков попробуйте тупо распаковать-запаковать архив обратно безо всякой правки - он идентичный получмтся с исходным? Если нет, добавить до необходимого размера мусора и попытаться запустить. Так будет отметен хотя бы третий вариант


 eXeL@B —› Вопросы новичков —› Как поменять одну строчку кода в python .exe?
Эта тема закрыта. Ответы больше не принимаются.

Видеокурс ВЗЛОМ