„Сакън нещо добро направя…“
от зла майна
Има една практика, която мене лично доста ме е дразнила, когато съм се натъквал на нея – да си енкриптнеш кода амнайсе хиляди пъти и после хитроумно да го забиеш в апликацията си. Не, че аз съм особено умен, ама все съм си мислел, че тази техника е ужасно подозрителна и повечето хора не биха се сетили, че в този гаден стринг може да се крие злокобен логър или всякаква друга гад. Най-малкото не можеш да си смениш линковете, които понякога са доста нагли.
Среща се по WP теми. Аз поне съм го виждал на няколко. Преди време и в хостинг компанията бях го виждал, ама бях ужасно тъп още, че да схвана какво се случва. Сега обаче съм нахитрял и не ме кефи някой да слага код в сайта ми, въпреки че ползвам негова тема. Ето малко дебилски иструкции за процеса на опаковане и разопаковане на подобни лайна. Ако мислиш, че съм тъп и съм драснал малоумен код – кажи си го! Приветствам критики :)
Почваме с кратко въведение в опаковането. Да речем, имаш си код, дето искаш да опаковаш – my-code.php – може да е цял отрязък с HTML, CSS, JS, PHP, путки майни набити в него, няма никакви проблеми, стига да може да се изпълни като PHP код. Щото после ще ползваме PHP функция да го вадим, не за друго :) Та този файл си го запазваш някъде, в готовност да го подадеш на опаковчика.
Ето грозната функция:
<?php //------------------------------------------------------------------------------ /* function: nestStuff - this is a POC function, lacks refinements !!!!! args: $file - a file with code to be 'nested' $loops - how many loops to run returns: nastry long string :) */ function nestStuff ($file, $loops = 37) { $fo = fopen ($file, "r"); $string = fread ($fo, filesize ($file)); for ($i = 1; $i <= $loops; $i++) : $string = gzdeflate($string); // deflate $string = base64_encode($string); // encode //echo 'Iteration: '.$i.'<br />'; endfor; return $string; } /* end function nestStuff --*/ ?>
Резултатът е ужасно дълъг стринг, който няма да ти показам, защото ще счупи темата на блога, ама си е бая големичък. За да не се чудиш какво да го чиниш, можеш да насочиш горната функция към файл и да си я запишеш прилежно. След това я взимаш и отиваш във файла на темплейта, на мястото, където искаш да се появява дадения начален код от my-code.php. Туряш следното парче клавиатурни отпадъци в условния финален файл nested-content.php:
<?php eval(gzinflate(base64_decode('the_nasty_long_string'))); ?>
Сейв, рефреш – тараааам – изгрява! Супер, станал си герой. Сега обаче, нека се поставим в обувките на някой, който вижда само финалния резултат – nested-content.php и иска да се отърве от гадните линкове във фуутъра си. Как да се докопа до изначалния код, за да го види и промени?
Ето как: Първо се убеди, че си имаш файл, който изглежда като nested-content.php. Ако трябва, направи си сам такъв, копирайки нещата от файла на хитреца. После го прекарваш през това:
<?php $filename_full = 'nested_content.php'; $verbose = 0; $filename_base = basename ($filename_full,'.php'); $content = ""; echo "Using: ".$filename_base.".php\n"; echo "Read...\n"; $fp1 = fopen ($filename_full, "r"); $content = fread ($fp1, filesize ($filename_full)); fclose($fp1); echo "Decode...\n"; while ( is_nested($content) ) $content = denest($content); dump($content,TRUE); function is_nested ($text) { return preg_match("/eval\(gzinflate/",$text); } function denest ($text) { global $verbose; $text=preg_replace("/<\?php|<\?|\?>/", "", $text); if ($verbose) dump ($text,FALSE); eval(preg_replace("/eval/", "\$text=", $text)); if ($verbose) dump ($text,FALSE); return $text; } function dump ($text,$final) { static $counter = 0 ; global $filename_base; $filename_new = ($final) ? ($filename_base.".done.php") : ($filename_base.".".sprintf("%04d", ++$counter).".php"); echo "Writing ".$filename_new."\n"; $fp2 = fopen($filename_new,"w"); fwrite($fp2, trim($text)); fclose($fp2); } ?>
Намира се много лесно на php.net. Няма особена нужда от обяснения – подаваш nested-content.php, и се забавляваш. Ако ти е хрумне да пуснеш дебъгера, приготви се за n нови файлове, където n е броят на итерации на опаковане, които хитрецът е извършил :) Във финалния файл ще имаш чистия изходен PHP код, който ти трябва и можеш вече спокойно да го разгледаш и да решиш дали да не го промениш и плеснеш на мястото на кодирания хеш. :)
Много гадно обяснявам, зная…
Програмисти! :)
хаха :) интересно ми е дали видя, че първата функция е непълна :P