как расшифровать php код

Расшифровка и деобфускация PHP-скриптов

Тема декодирования зашифрованных PHP-скриптов уже однажды мной затрагивалась в посте PHP и зашифрованный код. В нем я описал способ получения значений всех инициализированных переменных и списка объявленных функций в скрипте, зашифрованным протектором ionCube. Тогда, в 2009 году, расшифровать скрипт под ionCube было проблематично – на тот момент существовали лишь платные сервисы. Однако с ростом популярности ionCube стало ясно, что рано или поздно его постигнет участь Zend Encoder (сейчас Zend Guard), павшего в 2008 году перед ставшими повсеместно доступными “дезендерами”. Действительно, за последнее время появилось множество декодеров ionCube, можно даже найти бесплатные онлайн-сервисы. Один из них позволяет расшифровать практически любые скрипты. О нем, а также о других способах расшифровки расскажу в данной статье.

Прежде всего необходимо иметь представление о том, какие существуют виды защиты PHP-скриптов. Всего их можно выделить три:

Итак, имея скрипт, зашифрованный неизвестным для вас алгоритмом, прежде всего необходимо определить с помощью чего он зашифрован. В этом может помочь отличный инструмент PCL’s PHPiD. Распознает множество протекторов, например тот же ionCube:

как расшифровать php код

Определив протектор, можно поискать существующие решения для расшифровки того или иного энкодера. Но в большинстве случаев поможет сервис dezend.me.

как расшифровать php код

Он открылся совсем недавно, но уже сейчас имеет большой функционал: расшифровка серверных средств защиты ionCube 6.5, Zend, Nu-Coder, а также декодирование и деобфускация любых скриптов, зашифрованных без использования дополнительных расширений PHP. К сожалению, результаты расшифровки ionCube оставляют желать лучшего, в некоторых участках кода тестового скрипта пришлось исправлять вручную. А вот универсальный декодер справляется заметно лучше, правда не хватает нормального форматирования кода. В целом, сервис оставил положительные впечатления, надеюсь, не закроется 🙂

Источник

Деобфускация PHP кода

как расшифровать php код
Так уж случилось, что на днях мне попался один нужный PHP скрипт, но обфусцированный.
По какой-то причине он никак не работал. Я пишу на PHP достаточно давно, и мне очень нравится отлавливать нестандартные ситуации в скриптах, особенно когда при выполнении в логах нет ошибок, а скрипт просто не выполняет своих предназначенных обязанностей, руки так и чесались расшифровать. Последней каплей стало то, что автора этого скрипта не было в сети, чтобы помочь решить мою проблему. Скрипт кстати куплен моим товарищем, собственно он и попросил помочь.

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

Анализирование кода

Вот один из этих скриптов, открывая такой скрипт в блокноте, мы увидим:
как расшифровать php код

Разобьем для начала его на строки:
как расшифровать php код
и сохраним в файл encoded_script.php

Видно что тут код разбит на 4е части. В каждой выполняется eval.
Для удобства дешифровки eval воспользуемся расширением для PHP — Evalhook. Его написал Stefan Esser за что ему большущее спасибо. С помощью него можно расшифровывать в несколько проходов например монстров закодированных через www.php-crypt.com функциями eval, gzuncompress, base64_decode и тд.

Установка evalhook

Скачиваем архив с исходниками

Распаковываем и собираем расширение для PHP

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

где encoded_script.php — закодированный файл.
Для получения исходного кода просто жмем «Y» несколько раз в процессе деобфускации. Каждый новый Y будет расшифровывать следующий eval. Ну что ж вооружимся консолью и в бой!

Деобфускация и декодирование

1-й eval расшифровали, нужный нам код находится между символами»—-«. Впоследствии после всех шагов нужно будет его скопировать в файл. Нажимаем Y и продолжаем расшифровывать.
2-й проход:

Ну вот и всё, дальше продолжать нет смысла, потому что внутри нашего шифрованного файла, как видно по коду, includ’ится еще один зашифрованный файл, но мы его потом отдельно расшифруем. Главное правило сколько у нас eval, столько раз жмём Y, иначе наш скрипт выполнится вплоть до исполнения кода целиком, нам это не нужно.

Собираем полученное в один файл

Чтобы не было всё в каше без пробелов пропустим это добро через php beautifier, дабы получить нормальные отступы.

Наш код уже становится похож на человечный
как расшифровать php код

сохраним полученный код в тот же файл и выполним его просто через консоль (можно и в браузере):

получаем заветные названия функций:

Окончательная замена функций:

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

Кстати деобфускация помогла мне решить проблему, из-за чего не работал скрипт, но это уже другая история…

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

UPD от автора скрипта:

zuziken (20:30:15 2/02/2012)
*THUMBS UP*
zuziken (21:10:42 2/02/2012)
Спс за обзор, но код пишет программист, а не я:-)

Источник

Кодирование и декодирование PHP кода

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

Очень краткий ликбез по внутреннему устройству интерпретатора PHP

При выполнении PHP-скрипта, он парсится и компилируется в опкоды внутренней виртуальной машины PHP.
Из каждого файла PHP получаются:
— массив классов: в каждом классе — информация о классе, свойства класса и массив методов класса
— массив функций
— «тело скрипта» — код вне классов и функций

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

Сами опкоды (операции внутренней виртуальной машины PHP) внутри какой-нибудь функции выглядят так:

Важный момент: файлы в скомпилированном виде достаточно сильно отличаются даже между подверсиями интерпретатора PHP. Оно и понятно: сам для себя скомпилировал — сам и выполнил.

Как работают энкодеры

Существуют два принципиально разных типа энкодеров.

Первые — работают исключительно средствами самого языка. Они делают код нечитаемым с помощью base64-кодирования, zip-ования, разных манипуляций со строками, и все в конце концов используют функцию eval(). Все это очень похоже на обфускаторы в Javascript. Выглядит это как-то так:

Снимается такая защита очень просто, в самых сложных случаях — за несколько часов. Еще один крупный минус — серьезно страдает производительность. Поэтому для серьезного применения такую защиту использовать не рекомендуется.

Второй тип энкодеров использует свои подключаемые модули для интерпретатора PHP, которые называются загрузчиками (loader-ы). В этом случае, как правило, кодируется не сам исходный код, а результаты его компиляции, т.е. внутренние структуры и опкоды. Это уже гораздо более серьезная защита — даже если раскодировать сами опкоды, по ним еще надо восстановить исходный PHP-код. К тому же, с точки зрения производительности, дополнительные затраты на раскодирование часто компенсируются экономией на компилировании кода, т.е. скорость выполнения закодированных скриптов зачастую даже выше, чем у исходного кода.

Во время загрузки интерпретатора PHP, loader-ы энкодеров вешают свои обработчики на функции загрузки PHP-файлов, компиляции и выполнения, для того, чтобы работа с закодированными файлами была бы прозрачной для самого интерпретатора.

Основная сложность для энкодеров — это сделать так, чтобы опкоды, скомпилированные под одной версией PHP во время кодирования, работали бы под другой версией PHP при декодировании. Практически все loader-ы у всех энкодеров после декодирования делают необходимые правки, чтобы обеспечить такую совместимость. Главный игрок на этом рынке — IonCube — в свое время приложил огромные усилия для решения этой задачи, и его loader-ы могут на лету корректно выполнить опкоды от PHP 4.x на PHP 5.x, а по возможности — даже наоборот!

Обфускация

Также, для дополнительной защиты, большинство энкодеров дает возможность обфусцировать идентификаторы: имена переменных, названия функций, классов. Этот процесс, как правило, односторонний — наподобие хэширования, и к тому же в результате часто получаются имена с непечатными символами, которые отлично работают, но которые нельзя использовать напрямую в декомпилированных текстах. Например, как записать функцию с именем… *диктую по байтам* 0x0D, 0x07, 0x03, 0x0B, 0x02, 0x04, 0x06?

Отдельно внимание уделяется тому, чтобы обфусцированные имена работали бы корректно. Например, в коде вызывается функция checkLicense — loader обфусцирует название на лету, получает < 0x0D, 0x07, 0x03, 0x0B, 0x02, 0x04, 0x06 >и ищет уже этот ключ в хэш-таблице с названиями функций.

Zend Guard даже предоставляет run-time функции zend_obfuscate_function_name и zend_obfuscate_class_name, которые позволяют вычислить обфусцированные имена для функций и классов, чтобы облегчить связывание закодированных файлов с незакодированными.

Декодеры наносят ответный удар

Для создания декодера нужны две вещи: получать расшифрованные опкоды и уметь декомпилировать их в исходный код PHP.

Для получения опкодов кому-то пришла в голову светлая идея — сделать свою сборку интерпретатора PHP, которая бы вместо выполнения раскодированного скрипта — отправляла бы его на декомпилирование. Не нужно возиться с чтением формата энкодера и его защитами — loader энкодера сам делает всю нужную работу!

Какое-то время это работало неплохо, потом авторы некоторых энкодеров додумались заменять раскодированные функции заглушками, а реальный код прятать и доставать каждую вызываемую функцию только в момент ее непосредственного выполнения.
В ответ, авторы декодеров стали модифицировать loader-ы от энкодеров, чтобы те не применяли такие заглушки.
Довольно большой минус оказался в том, что для каждой версии PHP у каждого энкодера были свои loader-ы, которые к тому же частенько обновлялись. Приходилось много и часто патчить, хотя и несложно — просто отключить вызов функции-другой.

Это надолго затормозило тех, кто «патчил loader-ы». Во-первых, пришлось долго разбираться, почему вроде бы правильно вытащенные опкоды декомпилируются с ошибками. Во-вторых, тут уже не получалось просто поменять пару байт в loader-е.

На сцену вышли те немногие, кто прикладывал больше усилий — реверсил и разбирался в формате закодированных файлов.

Вторая часть в работе декодера — декомпилирование. Это — сложная, но интересная, чисто алгоритмическая задача.

Когда-то светлые головы написали пару неплохих алгоритмов декомпилирования для PHP. Большинство тех, кто занимается декодированием PHP сейчас, написать свой декомпилятор не могут, поэтому используют те, что есть, с минимальными правками.

Все декомпиляторы в открытом доступе правильно восстанавливают только 90-95%% кода. Остальное приходится исправлять вручную, и тут очень большую роль играют опыт программирования на PHP и опыт декомпилирования, т.к. ошибки возникают обычно типовые.

Подводя итог: никакого полностью автоматического декодирования для основных коммерческих энкодеров пока нет.

Как защититься от декодирования

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

Юридические аспекты

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

На территории Евросоюза есть такая лазейка: разрешается «обеспечивать совместимость экземпляров ПО, которыми вы владеете, и для этого, при необходимости, обходить встроенные системы защиты». При этом прямой запрет на reverse engineering у каждого энкодера все-таки имеет приоритет.

Получается, что «я скачал программу из Интернета, которая достала мне незашифрованные опкоды» или «я использовал специальную сборку интерпретатора PHP, которая сохраняет расшифрованные опкоды» — это условно-легальные способы декодирования. «Условно» — потому что если дело все-таки дойдет до суда, еще непонятно, кто окажется прав.

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

Интересные факты и байки

Большая часть энкодеров последние пару лет всего лишь чуть-чуть меняет формат файлов «под капотом», и выпускается под видом новой версии.

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

Фрилансеры настолько часто используют куски кода из документации PHP и со StackOverflow, что словарь, составленный из идентификаторов, взятых оттуда из примеров, позволяет обычно деобфусцировать под 90% всех имен в среднем проекте.

За все время работы я встретил всего лишь пять различных декомпиляторов PHP. Три из них были написаны русскоязычными программистами, еще один — китайцем и еще один — божились, что французом. Мелочь, а приятно — горд за «наших» 🙂

При этом большинство русскоязычных клиентов просит по-свойски сделать работу бесплатно 🙂

Несколько раз получалось так, что декодировать определенный формат файлов мог только я. И одни и те же файлы приходили на декодирование через нескольких разных посредников одновременно.
Особенно меня повеселила такая история: негр с африканским именем и со швейцарским гражданством, разругался с фрилансером-программистом из Австралии, не заплатил ему за работу и остался с парочкой закодированных недоделанных файлов на своем сайте. Долго искал на фрилансерских биржах того, кто их раскодирует, пока наконец один индус не впарил ему свои услуги.
Три недели этот индус кормил заказчика завтраками, а сам усиленно искал реального исполнителя. Параллельно заказчик (жук еще тот) под другим именем и сам продолжал искать других декодировщиков на все тех же фрилансерских биржах. Нашел меня, отдал мне проект… и тут же, буквально через полчаса, ко мне постучался индус и с чувством явного облегчения стал уговоривать сделать и его проект тоже. Я сравнил файлы, и…
Конечно, стоило бы в воспитательных целях взять у обоих 100% предоплаты… но я просто заставил их пообщаться и разобраться между собой.
По итогам, индус до сих пор не забывает поздравить меня с днем рождения.
Заказчик даже дал мне бонус, а сейчас переехал в Эстонию (!) потому что там дешевле жить, и периодически уговаривает меня поучаствовать в каких-то его сомнительных прожектах.

UPD. Пришлось вырезать часть примера с eval-закодированым кодом, потому что Kaspersky выдавал на него предупреждение. Спасибо nokimaro!

Источник

Деобфускация странного php кода?

19000 символов, а тут ограничение в 10000, так что я его загрузил на файлообменный хостинг.

как расшифровать php код

Деобфусцировать можно тут: phpdecoder

Что это: WSO Version 2.5 (веб-шелл)

Описание:
— Авторизация
— Информация о сервере
— Файловый менеджер (Копирование, переименование, перемещение, удаление, чмод, тач, создание файлов и папок)
— Просмотр, hexview, редактирование, давнлоад, аплоад файлов
— Работа с zip архивами (упаковка, распаковка)
— Консоль
— SQL менеджер (MySql, PostgreSql)
— Выполнение PHP кода
— Работа со строками + поиск хеша в онлайн базах
— Биндпорт и бек-коннект (Perl)
— Поиск текста в файлах
— *nix/Windows
Из фишек
— Антипоисковик (проверяется User-Agent, если поисковик, тогда возвращается 404 ошибка)
— Консолька запоминает введенные команды. (перемещаться по ним можно с помощью стрелок вверх, вниз при фокусе на поле для ввода)
— Можно использовать AJAX
— Малый вес (22.8 KB)
— Выбор кодировки, в которой работает шелл.

как расшифровать php код

как расшифровать php код

Получаем строку
eval(gzinflate(base64_decode(‘7X1.
И снова выводим то что нам нужно (eval в той строке 2 раза встречается)
echo (gzinflate(base64_decode(‘7X1.
Вот и исходный код в более понятном варианте (смотреть с отключенным JS в браузере).

Источник

Как расшифровать (декодировать) чужеродный код в php странице?

Подломали сайт на WP, напичкали своим зашифрованым кодом. Хочу знать, что там. Онлайн-декодерами не смог прочесть. Чем можно декодировать?

Код такой:
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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *