Silva Rerum

Dziś jest sobota, 19 maja 2012 r.

eval(gzinflate(base64_decode...

funkcja eval() jest często wykorzystywana do zabezpieczenia kodu źródłowego porzez jego niemożliwe do prostego odczytania zakodowanie za pomocą wielokrotnego wywołania gzdeflate() i base64_encode(). "Problem" można jednak szybko rozwiązać, zapisują zakodowany fragmet kodu do pliku encoded.php, a następnie uruchamiając poniższy skrypcik, który wygeneruje plik decoded.php z jawną postacią kodu.

<?php
   $content = file_get_contents("encoded.php");
   while (preg_match("/eval\(gzinflate/",$content))
   {
       $content=preg_replace("/<\?|\?>/", "", $content);
       eval(preg_replace("/eval/", "\$content=", $content));
   }
   file_put_contents("decoded.php", $content);
?>
Kodowanie polega po prostu na procesie odwrotnym. W poniższym przykładzie chcemy np. zakodować fragment kodu generujący napis "Hello world" czyli "echo 'Hello world';". W tym celu na fragmencie kodu php wykonujemy najpierw funkcję gzdeflate(), a następnie base64_encode().

<?php
   echo 'Hello world';
   $plain = "echo 'Hello world';";
   $encoded = base64_encode(gzdeflate($plain));
   echo $encoded;
   eval(gzinflate(base64_decode($encoded)));
?>

Przykład praktyczny kodowania

Powiedzmy, że chcemy zakodować taki oto plik decoded.php:

<?php
   $txt1 = 'Hello';
   $txt2 = ' World!';
   echo $txt1. $txt2;
?>
Kiedy wykonamy na nim poniższy skrypt:

<?php
   $plain = file_get_contents("decoded.php");
   $plain = preg_replace("/<\?php|<\?|\?>/", "", $plain);
   $content = base64_encode(gzdeflate($plain));
   $content = "<?php\n eval(gzinflate(base64_decode('" . $content . "')));\n?>";
   file_put_contents("encoded.php", $content);
?>
Otrzymamy plik encoded.php z zakodowaną treścią:

<?php
 eval(gzinflate(base64_decode('4+Xi5eJUKakoMVSwVVD3SM3JyVe3hgoZgYQUwvOLclIUwYKpyRn5CmDFemDKCCjIywUA')));
?>
Wykonanie skryptów decoded.php i encoded.php skutkuje dokładnie tym samym - wyświetleniem napisu "Hello Worold!", przy czym z praktycznego punktu widzenia drugi skrypt jest zupełnie nieczytelny. Trzeba jednak pamiętać, że nie jest to tak na prawdę "szyfrowanie", a jedynie przekształcenie kodu w formę, która uniemożliwia bezpośrednie odczytanie kodu przez człowieka.