Обфускация строк на PHP
За несколько лет исследований различных кодировщиков и обфускаторов PHP-скриптов я изучил все используемые в них приемы сокрытия значений текстовых строк. Это могут быть названия функций или какие-то данные, которые должны быть представлены в виде строки. Так вот, во всех разобранных крипторах и обфускаторах символы в строке кодировались всего лишь несколькими способами: вариации преобразования строки из последовательности base64, декодирование из URL-encoded символов, escape-последовательности, упаковка строки в бинарные данные или результат функции chr по ординалу символа. Все подобные преобразования легко поддаются статическому анализу и декодированию типа замены по регулярным выражениям, то есть надежность сокрытия данных стремится к нулю.В очередной раз экспериментируя с PHP, я решил на практике проверить, как поведет себя оператор инкремента и декремента в случае нецифровых значений. Согласно документации, при выполнении инкремента строковых переменных PHP следует соглашениям Perl, и рассматривает строку как условное число с базой значащих символов в диапазоне [a-z], [A-Z] и [0-9], причем одновременно. Проще всего это понять на следующих примерах:
Code (PHP) : Убрать нумерацию
- $a='K';
- $a++;
- echo $a;
- // L
Code (PHP) : Убрать нумерацию
- $a='a6';
- $a++;
- echo $a;
- // a7
Code (PHP) : Убрать нумерацию
- $a='fZ9';
- $a++;
- echo $a;
- // gA0
Code (PHP) : Убрать нумерацию
- $a='ZZ';
- $a++;
- echo $a;
- // AAA
На служебные символы и символы, не относящиеся к латинскому алфавиту или цифрам, правило инкремента также не распространяется:
Code (PHP) : Убрать нумерацию
- // Декремент
- $a='ManHunter';
- $a--;
- echo $a;
- // ManHunter
Code (PHP) : Убрать нумерацию
- // Служебные символы
- $a='+#';
- $a++;
- echo $a;
- // +#
Code (PHP) : Убрать нумерацию
- // Кириллица
- $a='ПРИВЕТ';
- $a++;
- echo $a;
- // ПРИВЕТ
Code (PHP) : Убрать нумерацию
- $a='';
- $a.='a';
- $a++;
- $a.='a';
- $a++;
- $a++;
- $a.='a';
- $a++;
- $a++;
- $a++;
- $a.='0';
- $a++;
- echo $a;
- // bcd1
Code (PHP) : Убрать нумерацию
- $a='azz';
- $a++;
- echo $a;
- // baa
В качестве "боевого" примера, название функции "base64_decode" можно превратить вот в такое адское месиво, совершенно неподъемное для статического анализатора:
Code (PHP) : Убрать нумерацию
- // base64_decode
- $_=($__=@a).($___=@z).$___;++$_;$_++;$_++;$_++;++$_;$_++;$_++;++$_;++$_;$_++;$_++;
- ++$_;$_++;++$_;$_++;$_++;$_++;++$_;$_++;$_.=$__;++$_;$_++;++$_;$_.=@+_;++$_;$_++;
- $_++;$_++;++$_;$_++;$_++;++$_;++$_;$_++;$_++;++$_;$_++;++$_;$_++;++$_;$_.=@+_;
- $_++;++$_;$_++;++$_;$_.=@_;$_.=$__;$_++;++$_;$_++;$_.=$__;$_++;++$_;$_++;$_++;
- $_.=$__;$_++;++$_;$_.=$__;$_++;$_++;++$_;++$_;$_++;++$_;$_++;$_++;++$_;$_++;$_++;
- ++$_;$_++;$_++;$_.=$__;++$_;$_++;$_++;$_.=$__;$_++;++$_;$_++;++$_;
- eval($_('ZWNobyAnSGVsbG8sIHdvcmxkISc7'));
Пока что все изложенное остается в состоянии "proof of concept" и теоретических выкладок, но не исключено, что я изготовлю и собственный криптор для PHP-скриптов. Повторюсь, что подобных способов обфускации строк "в дикой природе" я пока не встречал.
Просмотров: 3793 | Комментариев: 10
Метки: PHP, обфускация
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
stream
(12.04.2021 в 12:41):
+100500
Алексей
(20.07.2019 в 15:52):
Все бы хорошо, НО если убрать последний инкремент "++$_;" и вывести код, то название функции становится очевидным. В итоге быстро узнаем функцию которой закодирован код, но реализация красивая!
morgot
(01.01.2019 в 12:20):
Идея очень интересная, спасибо.
proba
(09.12.2016 в 12:44):
В общем, мне понравилось. :-) Возьму на вооружение.
ManHunter
(09.12.2016 в 11:06):
Декремент используется просто в качестве мусора.
proba
(09.12.2016 в 11:00):
echo "Hello World!";
Смущали "заморочки" подобные create_function, md5, mcrypt_create ..., но замена eval на echo спасало положение. Декремент расставляется произвольно или есть какая-то последовательность всё же?
Смущали "заморочки" подобные create_function, md5, mcrypt_create ..., но замена eval на echo спасало положение. Декремент расставляется произвольно или есть какая-то последовательность всё же?
ManHunter
(14.09.2016 в 09:08):
Так никто и не разобрался с кодировщиком? Или очень сложно, или нахрен никому не нужно. Предполагаю второй вариант.
ManHunter
(07.09.2016 в 17:09):
Пример зашифрованного hello world: http://rgho.st/private/6rYgNpz...9a7b4b9e31f9
Обфускации исходного текста скрипта нет, только шифрование. Разобрать, конечно, можно, но займет время. На паблик этого криптора, скорее всего, не будет.
Обфускации исходного текста скрипта нет, только шифрование. Разобрать, конечно, можно, но займет время. На паблик этого криптора, скорее всего, не будет.
ManHunter
(07.09.2016 в 00:21):
Не вижу связи между паранойей и крипторами.
Станислав
(06.09.2016 в 19:03):
Как главный параноик буду ждать с нетерпением криптор...
Добавить комментарий
Заполните форму для добавления комментария