February 21, 2023

Деобфусцируем код PyArmor

Какие программы нужны?

Process Hacker 2

Python ( версия, на которой написан скрипт, узнать можно через Process Hacker)

PyInjector

Decompyle++(pycdc) (исходный код, ниже объясню, как превратить его в exe-файлы.)

Я взял простой скрипт и зашифровал его с помощью PyArmor в исполняемый файл:

res = input('Enter a password: ')
if res == 'b57Gihj675vkc8cmrcimricm':
    input('Yes! It was the corrcet password.')

else:
    input('Bad password:(')

Для начала необходимо скачать файлы из репозитория GitHub: клик

Далее сохраняем папку methods где-то у себя, она нам позже пригодится.

Исполняемый файл(exe)

Исполняемый файл(exe) Если у вас exe-файл и он скомпилирован с помощью pyinstaller, то вам очень повезло.

Скачиваем PyInstaller Extractor и закидываем в папку с exe-файлом.

Открываем консоль.

Вводим python pyinstxtractor.py main.exe, где main.exe - это имя вашего исполняемого файла и видим подобную картину:

Если возникла ошибка "Missing cookie, unsupported pyinstaller version or not a pyinstaller archive", значит этот файл собран не при помощи pyinstaller.

Если все успешно, можно идти дальше.

В папке с файлами появилась папка "main.exe_extracted", где "main" - имя вашего исполняемого файла.

Переходим в нее и ищем файл "_pytransform.dll", если он там есть, то значит скрипт защищен PyArmor'ом.

Если же данной dll-ки нету, то значит скрипт не накрыт и достать код будет еще легче.

Находим Байт-код программы(файл с расширением .pyc, например main.pyc).

Используем декомпилятор(pycdc.exe main.pyc, где main.pyc - имя вашего файла) и получаем:

Как видим, это PyArmor.

Вводи команду:

pycdc.exe main.pyc > main.py

Это мы сохраняем вывод из консоли в файл "main.py", далее нам нужны файлы "_pytransform.dll" и "main.py".

Создаем папку с именем "pytransform", а уже в ней создаем файл "__init__.py", в нее вставляем данный код:

https://pastebin.com/CKDZzdKN

Также в данную папку закидываем "_pytransform.dll".

И опять открываем консоль:

И запускаем основной скрипт:

Как видим скрипт успешно запустился.

Скрипт Python

Если у вас обычный скрипт Python, который также может быть накрыт PyArmor'ом, то вы также сможете получить исходный код.

Обычно у него такая структура:

Получаем исходный код

У нас есть 3 способа, с помощью которых мы можем попробовать получить исходный код. Я использовал только 2 из них, поэтому про них и напишу.

Метод 1:

Из папки "method 2" мы копируем файл "code.py", и закидываем в папку с основным скриптом(который накрыт PyArmor).

Далее инжектим PyInjector, подробнее будет описано в спойлере "Инжектим PyInjector", который находится ниже.

У нас должна появиться папка "dump", в которой появиться файл "main.pyc"(у вас может быть другое название, зависит от названия самого скрипта)

С помощью декомпилятора мы превращаем байт-код в читаемый. Подробнее про декомпилирование будет ниже.

Инжектим PyInjector:

Скачиваем PyInjector, переносим эти DLL в папку.

Запускаем ваш скрипт и открываем Procces Hacker 2(от имени администратора).

Находим наш процесс и инжектим DLL:

Нажимаем по процессу ПКМ и ищем пункт "Miscellaneous", а в нем пункт "Inject DLL...",

Находим DLL-ки PyInjector и инжектим.

Способ 2:

Из папки "method 3" мы копируем файл "bypass.py", и закидываем в папку с основным скриптом(который накрыт PyArmor).

Далее мы запускаем скрипт этой командой:

python bypass.py main.py - на место main.py вы ставите название вашего скрипта.

Вводим несколько раз "yes".

И у нас также, как и в первом способе должна появиться папка dump, в которой будет байт-код.

С помощью декомпилятора мы превращаем байт-код в читаемый. Подробнее про декомпилирование будет ниже.

Компилируем Decompyle++

Заходим на сайт и скачиваем CMake.

Заходим в GitHub репозиторий, скачиваем его, переименуем в "pycdc" и копируем в другую папку, например в "test123".

Добавляем C:\Program Files\CMake\bin к переменным вашей системной среды в PATH.

Заходим в папку "test123", структура должна быть такой:

Открываем консоль:

И вводим команды по порядку:

cmake pycdc
cd ../
cmake --build test123

В папке "test123\Debug" должны появится файлы:

Нам нужны только "pycdc.exe" и "pycdas.exe", они оба нам пригодятся.

Вы можете добавить их в локальные переменные, чтобы легче вызвать, но можно в принципе каждый раз копировать их в папку.

Вот мы и скомпилировали Decompyle++.

Декомпилируем байт-код

Существует несколько вариаций декомпиляторов:

https://github.com/rocky/python-uncompyle6 Для Python 3.8 и ниже.

https://github.com/zrax/pycdc Для всех версий Python.

https://github.com/rocky/python-decompile3Для версий Python 3.7-3.8

https://github.com/greyblue9/unpyc37-3.10Для версий Python 3.7-3.10

Я использую Decompyle++, поэтому в статье о ней и рассказал.

Если использовать этот декомпилятор, то нужно перейти в папку с ботом и прописать данную команду:

pycdc.exe main.pyc, где main.pyc - это ваш файл с байт-кодом.

В консоль должно вывести код.

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

В данном случае можно ислодовать код, который выведете команда pycdas.exe main.pyc

Ссылка на канал - @slivmens

Наш чат - @slivmenss_chat

Слив курсов - @slivmens_sklad

Кино в telegram - @kinozzztg