(Раз)опаковъчна функция за PHP хитреци

„Сакън нещо добро направя…“
от зла майна

Има една практика, която мене лично доста ме е дразнила, когато съм се натъквал на нея – да си енкриптнеш кода амнайсе хиляди пъти и после хитроумно да го забиеш в апликацията си. Не, че аз съм особено умен, ама все съм си мислел, че тази техника е ужасно подозрителна и повечето хора не биха се сетили, че в този гаден стринг може да се крие злокобен логър или всякаква друга гад. Най-малкото не можеш да си смениш линковете, които понякога са доста нагли.

Среща се по 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 код, който ти трябва и можеш вече спокойно да го разгледаш и да решиш дали да не го промениш и плеснеш на мястото на кодирания хеш. :)

Много гадно обяснявам, зная…

2 коментара за “(Раз)опаковъчна функция за PHP хитреци”

  1. Марио Пешев

    Програмисти! :)

  2. tL_

    хаха :) интересно ми е дали видя, че първата функция е непълна :P

Разпиши се