Обновил свой давний проект - обфускатор PHP-кода. Теперь он способен генерировать еще более непонятный код.
Возможности обфускатора:
[+] Замена имен переменных
[+] Замена имен функций
[+] Шифрование статических строк
[+] Шифрование имен стандартных функций PHP
[+] Обфускация INTEGER'ов
[+] Сжатие скрипта
[+] Архивация скрипта
[+] Добавление треш-комментариев
[+++] И многое другое, множество удобств
Обфускатор не поддерживает конструкции eval() и $$var_name.
Пример работы. Возьмем такой простой исходный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php $header="Host: www.yandex.ru\r\n"; $header.="User-Agent: MSIE 7.0 Win\r\n"; $header.="Connection: close\r\n"; $header.="\r\n"; $addquery="GET / HTTP/1.0\r\n"; $host='www.yandex.ru'; $fp=fsockopen("tcp://".$host,80,$errno,$errstr,30); stream_set_timeout($fp,30); if(!$fp) { print "<font color=red>Socket error: <i>$errstr ($errno)</i></font><br>"; die(); } fputs($fp,$addquery); fputs($fp,$header); $ret=''; while(!feof($fp)) { $ret.=fgets($fp, 128); } fclose($fp); preg_match("/<strong>([,\d]+)<\/strong><\/td><td>.{1,10}<\/td><\/tr><\/tbody><\/table>/Usi",$ret,$m); $m=isset($m[1]) ? $m[1] : '0,0'; //курс нефти $m=str_replace(',','.',$m); $m=(int)$m*100+mt_rand(1,99); //целая его часть умножена на 100 и прибавлена к рандомному числу от 1 до 99 print $m; //и выведена на экран ?> |
А теперь - несколько вариантов обфускации (показываю без архивации скрипта):
1 |
<? $GLOBALS['_AA_']=Array(base64_decode('Ym' .'Fz' .'Z' .'TY0X2' .'R' .'l' .'Y29kZQ=' .'='),base64_decode('YmFzZ' .'TY' .'0X2RlY29kZQ=' .'='),base64_decode('Y' .'mFz' .'ZTY' .'0X' .'2RlY29kZQ=='),base64_decode('' .'Ym' .'F' .'zZTY0X2Rl' .'Y29kZQ=' .'='),base64_decode('YmF' .'zZT' .'Y0X2R' .'lY29k' .'ZQ=' .'='),base64_decode('' .'YmF' .'zZTY0X2' .'Rl' .'Y2' .'9kZQ=='),base64_decode('YmFz' .'Z' .'TY0X2R' .'lY29kZQ' .'=='),base64_decode('Y' .'mF' .'zZT' .'Y0X2Rl' .'Y' .'29kZQ=='),base64_decode('' .'YmFzZTY' .'0X2' .'RlY29kZQ=='),base64_decode('' .'YmFzZTY0X2RlY' .'2' .'9kZQ=='),base64_decode('YmF' .'zZTY0' .'X' .'2RlY29kZ' .'Q=='),base64_decode('cm91' .'bmQ='),base64_decode('cm91bm' .'Q='),base64_decode('cm91bmQ' .'='),base64_decode('cm9' .'1b' .'mQ='),base64_decode('cm91bmQ='),base64_decode('cm91bmQ='),base64_decode('cm9' .'1bmQ='),base64_decode('cm91' .'b' .'mQ='),base64_decode('cm91bmQ=')); ?><? function AA($i){$a=Array('X0Ff','','Wm5Odlk=','MnQ=','dmNH','VnU=','Yw==','M1J5WldGdA==','WDNObA==','ZEY5MA==','YVcxbGIz','VjA=','Wm5CMWRITT0=','Wm5CMWQ=','SE09','Wm1Wdlpn','PQ==','PQ==','','Wg==','bWRsZEhNPQ==','Wm1Oc2IzTmw=','','Yw==','SEo=','bFoxOXRZ','WFJq','YUE9PQ==','YzM=','UnlYM0psY0d4aFkyVQ==','PQ==','','YlhSZg==','Y21GdVpB','PT0=','U0c5emREb2dkM2QzTG5saGJtUmxlQzV5ZFEwSw==','VlhObGNpMUJaMlZ1ZERvZ1RWTkpSU0EzTGpBZ1YybHVEUW89','UTI5dWJtVmpkR2x2YmpvZ1kyeHZjMlVOQ2c9PQ==','RFFvPQ==','UjBWVUlDOGdTRlJVVUM4eExqQU5DZz09','ZDNkM0xubGhibVJsZUM1eWRRPT0=','ZEdOd09pOHY=','','THp4emRISnZibWMrS0Zzc1hHUmRLeWs4WEM5emRISnZibWMrUEZ3dmRHUStQSFJrUGk1N01Td3hNSDA4WEM5MFpENDhYQzkwY2o0OFhDOTBZbTlrZVQ0OFhDOTBZV0pzWlQ0dlZYTnA=','TUN3dw==','TEE9PQ==','TGc9PQ==','X0Ff','X0Ff','X0Ff','X0Ff','X0Ff','X0Ff','X0Ff','X0Ff','X0Ff','X0Ff');return base64_decode($a[$i]);} ?><? $GLOBALS[AA(0)]=Array($GLOBALS['_AA_'][0](AA(1) .AA(2) .AA(3) .AA(4) .AA(5)),$GLOBALS['_AA_'][1](AA(6) .AA(7) .AA(8) .AA(9) .AA(10) .AA(11)),$GLOBALS['_AA_'][2](AA(12)),$GLOBALS['_AA_'][3](AA(13) .AA(14)),$GLOBALS['_AA_'][4](AA(15) .AA(16) .AA(17)),$GLOBALS['_AA_'][5](AA(18) .AA(19) .AA(20)),$GLOBALS['_AA_'][6](AA(21)),$GLOBALS['_AA_'][7](AA(22) .AA(23) .AA(24) .AA(25) .AA(26) .AA(27)),$GLOBALS['_AA_'][8](AA(28) .AA(29) .AA(30)),$GLOBALS['_AA_'][9](AA(31) .AA(32) .AA(33) .AA(34))); ?><? function ll_($kk_){$kk__=Array(AA(35),AA(36),AA(37),AA(38),AA(39),AA(40),AA(41),AA(42),AA(43),AA(44),AA(45),AA(46));return $GLOBALS['_AA_'][10]($kk__[$kk_]);} ?><?php $kk___=ll_(round(0));$kk___.=ll_(round(0+1));$kk___.=ll_(round(0+0.5+0.5+0.5+0.5));$kk___.=ll_(round(0+1+1+1));$kk____=ll_(round(0+4));$kk_____=ll_(round(0+1.66666666667+1.66666666667+1.66666666667));$kk______=$GLOBALS[AA(47)][round(0)](ll_(round(0+2+2+2)) .$kk_____,$GLOBALS['_AA_'][11](round(0)+round(0+40)+round(0+10+10+10+10)),$kk_______,$kk________,$GLOBALS['_AA_'][12](round(0)+7.5+7.5+7.5+7.5));$GLOBALS[AA(48)][round(0+0.333333333333+0.333333333333+0.333333333333)]($kk______,$GLOBALS['_AA_'][13](round(0)+round(0+5+5)+round(0+3.33333333333+3.33333333333+3.33333333333)+round(0+3.33333333333+3.33333333333+3.33333333333)));if(!$kk______){print"<font color=red>Socket error: <i>$kk________ ($kk_______)</i></font><br>";die();}$GLOBALS[AA(49)][round(0+1+1)]($kk______,$kk____);$GLOBALS[AA(50)][round(0+1.5+1.5)]($kk______,$kk___);$kk_________=ll_(round(0+1.75+1.75+1.75+1.75));while(!$GLOBALS[AA(51)][round(0+4)]($kk______)){$kk_________.=$GLOBALS[AA(52)][round(0+1+1+1+1+1)]($kk______,$GLOBALS['_AA_'][14](round(0)+42.6666666667+42.6666666667+42.6666666667));}$GLOBALS[AA(53)][round(0+6)]($kk______);$GLOBALS[AA(54)][round(0+1.75+1.75+1.75+1.75)](ll_(round(0+2+2+2+2)),$kk_________,$kk__________);$kk__________=isset($kk__________[$GLOBALS['_AA_'][15](round(0)+0.5+0.5)])?$kk__________[$GLOBALS['_AA_'][16](round(0)+0.333333333333+0.333333333333+0.333333333333)]:ll_(round(0+9));$kk__________=$GLOBALS[AA(55)][round(0+4+4)](ll_(round(0+3.33333333333+3.33333333333+3.33333333333)),ll_(round(0+5.5+5.5)),$kk__________);$kk__________=(int)$kk__________*$GLOBALS['_AA_'][17](round(0)+round(0+6.25+6.25+6.25+6.25)+round(0+25)+round(0+5+5+5+5+5)+round(0+25))+$GLOBALS[AA(56)][round(0+3+3+3)]($GLOBALS['_AA_'][18](round(0)+0.2+0.2+0.2+0.2+0.2),$GLOBALS['_AA_'][19](round(0)+round(0+33)+round(0+11+11+11)+round(0+6.6+6.6+6.6+6.6+6.6)));print $kk__________; ?> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<? /* <=====street magic=====> */ /* <David Blaine>: Ага, вот эти ребята... */ $GLOBALS['_X_']=Array(base64_decode('ZnNvY2tvc' .'GVu'),base64_decode('' .'c3RyZW' .'FtX3N' .'ldF9' .'0aW1l' .'b3' .'V0'),base64_decode('' .'ZnB' .'1d' .'HM='),base64_decode('ZnB' .'1dHM='),base64_decode('ZmVvZg=='),base64_decode('' .'ZmdldHM' .'='),base64_decode('ZmNsb3Nl'),base64_decode('cHJlZ19tYXRj' .'aA=' .'='),base64_decode('c3R' .'y' .'X3Jlc' .'GxhY2U='),base64_decode('b' .'XRf' .'cmFuZA==')); /* <Peter>: Ненененене!! */ ?><? /* <Avon>: Нет, нет, Дэвид Блейн, нет! */ /* <David Blaine>: Я делаю особую, уличную магию. */ function /* <David Blaine>: Кто хочет увидеть немного магии? */ X($i){$a=Array('SG9zdDogd3d3LnlhbmRleC5ydQ0K','VXNlci1BZ2VudDogTVNJRSA3LjAgV2luDQo=','Q29ubmVjdGlvbjogY2xvc2UNCg==','DQo=','R0VUIC8gSFRUUC8xLjANCg==','d3d3LnlhbmRleC5ydQ==','dGNwOi8v','','LzxzdHJvbmc+KFssXGRdKyk8XC9zdHJvbmc+PFwvdGQ+PHRkPi57MSwxMH08XC90ZD48XC90cj48XC90Ym9keT48XC90YWJsZT4vVXNp','MCww','LA==','Lg==');return /* <Avon>: Чё мы тебе, долботрясы какие-нибудь? Нет, спасибо! */ base64_decode($a[$i]);} /* <Peter>: Мы целый день шопились, заманались, хотим просто отдохнуть, всё! */ ?><?php /* <David Blaine>: И где вы шопились? */ /* <Peter>: В один магаз ходили новый! */ $_0=X(0); /* <Avon>: Он ещё не трендовый, ты про него не знаешь. */ $_0.=X(1); /* <David Blaine>: И чо купили? */ $_0.=X(2); /* <Avon>: Я купил зеленый свитер, если ты так хочешь знать! */ $_0.=X(3); /* <Peter>: Зеленый свитер! */ $_1=X(4); /* <David Blaine>: Интересно... А ты уверен, что ты не купил тедди беар, плюшевого мишку? */ $_2=X(5); /* <Avon>: Да, я уверен! */ $_3=$GLOBALS['_X_'][0](X(6) .$_2,round(0+26.6666666667+26.6666666667+26.6666666667),$_4,$_5,round(0+15+15)); /* <Avon>: ТЕДДИ БИР!! */ $GLOBALS['_X_'][1]($_3,round(0+30)); /* <Peter>: Чё за херь! */ if(!$_3){ /* <Peter>: Э, ты чо сделал-то, а?! */ print"<font color=red>Socket error: <i>$_5 ($_4)</i></font><br>"; /* <Avon>: Где мой свитер? */ die();} /* <Peter>: Эй, он купил свитер, а он исчез, это ты его стырил? Притырил себе свитер, да это воровство! Отдай его свитер, сволочь! */ $GLOBALS['_X_'][2]($_3,$_1); /* <Avon>: Я потратил 48 долларов, ты, тупой и убогий фокусник! Где он? */ $GLOBALS['_X_'][3]($_3,$_0); /* <Peter>: Питер, глянь чо на тебе! */ $_6= /* <Avon>: Что за херня??? Как? */ X(7); /* <Peter>: В РОТ МНЕ НОГИ!!! */ while(!$GLOBALS['_X_'][4]($_3)){ /* <Avon>: Я держал в руках вещи! */ $_6.=$GLOBALS['_X_'][5]($_3, /* <Peter>: В рот мне ноги! */ round(0+32+32+32+32));} /* <Avon>: А, он уже растянутый, спасибо тебе! */ $GLOBALS['_X_'][6]($_3); /* <Peter>: Слушай, остановись, а? */ $GLOBALS['_X_'][7]( /* <Avon>: Растянул свитер, я его даже не поносил ещё! */ X(8),$_6,$_7); /* <David Blaine>: Эй. Эй, чё ты пьёшь? */ $_7=isset($_7[round(0+0.25+0.25+0.25+0.25)])? /* <Peter>: Оранж соду я пью! Что, в медведя превратишь? Я стакан-то держу! */ $_7[round(0+0.333333333333+0.333333333333+0.333333333333)]: /* <David Blaine>: Оранж соду? Может чё-нить другое оранжевое? */ X(9); /* <Peter>: Чо ещё оранжевое? Ну это, печеньки? */ $_7=$GLOBALS['_X_'][8]( /* <Peter>: ПЕЧЕНЬКИ!!! Стрелять-колотить! */ X(10), /* <Peter>: ПЕЧЕНЬКИ!!! Печеньки! Печеньки! Печеньки! */ X(11),$_7); /* <Peter>: Где оранж сода? Ты чо делаешь вообще, ты чо делаешь? */ $_7=(int)$_7*round(0+50+50)+$GLOBALS['_X_'][9](round(0+0.2+0.2+0.2+0.2+0.2),round(0+99)); /* <Avon>: У меня во рту оранж сода! */ print /* <Peter>: Я на измене, я на измене! */ $_7; /* <Avon>: Какая херня, ты положил её мне в рот! */ ?> |
1 |
<? $GLOBALS['_Q_']=Array(base64_decode('ZnNvY2' .'tv' .'cGVu'),base64_decode('c' .'3' .'RyZWFtX3NldF90aW1l' .'b3' .'V0'),base64_decode('Z' .'nB' .'1dH' .'M='),base64_decode('' .'Z' .'nB1dHM='),base64_decode('Z' .'mVvZg' .'=='),base64_decode('Zmd' .'l' .'d' .'HM='),base64_decode('ZmNsb3N' .'l'),base64_decode('' .'c' .'HJlZ1' .'9t' .'Y' .'XRjaA=='),base64_decode('c3Ry' .'X3JlcGxhY2U' .'='),base64_decode('' .'bXRfcmFuZA==')); ?><? function Q($i){$a=Array('SG9zdDogd3d3LnlhbmRleC5ydQ0K','VXNlci1BZ2VudDogTVNJRSA3LjAgV2luDQo=','Q29ubmVjdGlvbjogY2xvc2UNCg==','DQo=','R0VUIC8gSFRUUC8xLjANCg==','d3d3LnlhbmRleC5ydQ==','dGNwOi8v','','LzxzdHJvbmc+KFssXGRdKyk8XC9zdHJvbmc+PFwvdGQ+PHRkPi57MSwxMH08XC90ZD48XC90cj48XC90Ym9keT48XC90YWJsZT4vVXNp','MCww','LA==','Lg==');return base64_decode($a[$i]);} ?><?php $_0=Q(0);$_0.=Q(1);$_0.=Q(2);$_0.=Q(3);$_1=Q(4);$_2=Q(5);$_3=$GLOBALS['_Q_'][0](Q(6) .$_2,80,$_4,$_5,30);$GLOBALS['_Q_'][1]($_3,30);if(!$_3){print"<font color=red>Socket error: <i>$_5 ($_4)</i></font><br>";die();}$GLOBALS['_Q_'][2]($_3,$_1);$GLOBALS['_Q_'][3]($_3,$_0);$_6=Q(7);while(!$GLOBALS['_Q_'][4]($_3)){$_6.=$GLOBALS['_Q_'][5]($_3,128);}$GLOBALS['_Q_'][6]($_3);$GLOBALS['_Q_'][7](Q(8),$_6,$_7);$_7=isset($_7[1])?$_7[1]:Q(9);$_7=$GLOBALS['_Q_'][8](Q(10),Q(11),$_7);$_7=(int)$_7*100+$GLOBALS['_Q_'][9](1,99);print $_7; ?> |
Не гарантирую, что обфускатор успешно обработает все скрипты, но работоспособность большей их части сохраняется. Если же что-то не работает, попробуйте поиграться с настройками.
Скачать: ZIP
Неплохо, скрипт версии 1.3 занимает всего 34.5 Кб, 1.4 - аж 139 Кб.
Массив $phpfuncs, наверное, намного место увеличил.
Спасибо за обновление!
Ты делаешь особую, уличную магию.
p.s.: У меня во рту оранж сода!
Спасибо за труды!
При добавлении функций скрипт не дописывает php к <?
в итоге получается <? function а надо <?php function
Как правило все хостинги поддерживают и <? и <?php
Это не является проблемой.
Так же ошибка при обфускации INTEGER
Например имеем функцию
function foo($some_int = 0){
}
после обфускации она будет такая
function foo($some_int = round(0)){
}
на это ругается ошибкой
Так же если делаем exit(0)
то получаем exit(round(0))
в итоге команда выведет 0 на экран.
Проблема с дефолтовыми значениями действительно есть, время появится - поправлю.
Обновил обфускатор. Поправлены замены integer в дефолтовых параметров функций, а также замены integer в exit() и die().
А include он поддерживает? Если у меня код разбит на несколько фалов.
В этом случае нужно вручную смотреть, чтобы имена переменных, используемых в обоих файлах, совпадали. В обфускаторе есть поле, куда можно вписать имена переменных, которые не следует обфусцировать.
хорошо обфусцирует )
да, обработка инклюдов бы очень пригодилась,
потом хорошо бы чтоб скрипт абфускатора работал не только http. В большинстве случаев в работе удобнее делать
$ obf.php --param1 --param2 file_to_obfuscate.php > obfuscated.php
Спасибо, я тоже с инклудом не мог разобраться
Интересно... а как потом самому править такой код запутанный?
Ты сам то понял, что спростил !?
Ты исходный код удаляешь что ли ? ^)
Спасибо, очень помогло!
Скачал, спасибо. Попробую. До этого использовал свой вариант (тоже php-файл он не весь скрипт кодирует а только нужные моменты, чтобы быстрее было)
Уже 1.5 давно есть, поищи на блоге.
Здравствуйте!
Мне попался скрипт рекламной сети IQUELA, там во всех php файлах везде этот Дэвид Блэйн, снял с движка первую кодировку gzuncompres теперь осталась Base64
Вот кусок кода из корневого index.php
function /* : Ненененене!! */
_294570954($i){$a=Array('c3FsX3ByZWZpeA==','c3FsX3ByZWZpeA==','c3FsX3ByZWZpeA==','c3FsX3ByZWZpeA==');
или вот так
function _1266945356($i){$a=Array('c2lk','zvjo4erg','bGM=','zvjo4erg','bGM=','z/Dl4vv45e3o5SDx8fvr7uo=',
И так далее много много) и в конце );return base64_decode($a[$i]);}
Пробовал через это: http://www.artlebedev.ru/tools/decoder/advanced/
В лучшем случае 80% нормального кода остальные 20% смайлокод.
Пожалуйста подскажите как эту кодировку можно снять без потерь?
Ручками, если знаешь PHP, то это исключительно вопрос времени.
Могу заплатить за дэшифровку этого скрипта, если цена в разумных пределах будет.
В разумных - вряд ли