SourceCop-pal védett fájlok dekódolása

Default book

A PHP alkalmazások régi problémája az, hogy a PHP-ban írt programot nem igazán lehet leédni, ugyanis a nyelv működési módjából adódóan a forráskód nyílt ASCII vagy más kódolású szöveg.

A Zend által kifejlesztett szokásos megoldás az, hogy a Zend Encryptor programmal lefordítom egy kulccsal védett fájl alakjába a php kódot, a szerverrem a php alá beteszek egy zend decryptor modult, amely a szerveren futás közben visszaállítja az alkalmazás kódját. A módszer hátránya az, hogy a szerveren futó PHP verzió konfigurálására van szükség, a bérelhető tárhelyeken azonban erre általában nincsen lehetőség.

Hasonló okokból az IonCube és más hasonló termékek sem mindig használhatók.

A SourceCop egy PHP oldalak védelmére kidolgozott másik rendszer. A rendszer működésének lényege az obfuscation, azaz zavarjuk össze annyira a kódot, hogy ne legyen értelme visszafejteni. Ehhez az alábbi módszerek használhatóak:

  • Az eredeti változó és függvényneveket valamilyen hosszúságú hexadecimális karaktersorozattal helyettesítjük

  • A kódban lévő terminátor karaktereket (szóköz, tab, soremelés, zárójelek, stb) szintén hexadecimális formába alakítjuk át.

  • Az így kapott forráskódot néhány speciálisan kódoló függvény segítségével elkódoljuk

  • A végleges forrást kiegészítjük olyan kóddal, amely meghívja a dekódoló rutint a futtatáskor és futás közben dekódolja a titkosított forráskódot, amire végül ráadja a vezérlést.

  • A dekódoló rutin maga is kódolva van, hogy ne lehessen a dekódolást egyszerűen visszafejteni.

Nem árulok el nagy titkot akkor, amikor rámutatok ennek a módszernek a hibájára, ugyanis a visszafejtés a dekódoló visszafejtésével kezdődhet.

  • Használhatjuk hozzá a phpCodeBeautifier nevű programot. Ezzel a forráskódból olyan kódot alakíthatunk ki, amely már "szépen" tartalmazza a vezérlési szerkezeteket.

  • Ha megnézzük a visszafejtendő kódokat látjuk, hogy include-ol egy scopbin nevű könyvtárat, amiben egyetlen fájl van a 911006.php. Nyilván ez tartalmazza a visszafejtő rutint. A kód megvizsgálása során látszik, hogy a többi függvény csak kamuból van benne és az igazi visszafejtő rutin a y0666f0acdeed38d4cd9084ade1739498 nevű függvény.

  • Írjuk át ezt a függvényt az eredeti kódban az alábbi módon (vastagított sorok a módosítottak):

function y0666f0acdeed38d4cd9084ade1739498($x897356954c2cd3d41b221e3f24f99bba, $x276e79316561733d64abdf00f8e8ae48) {
    $x0b43c25ccf2340e23492d4d3141479dc = '';
    $x71510c08e23d2083eda280afa650b045 = 0;
    $x16754c94f2e48aae0d6f34280507be58 = strlen($x897356954c2cd3d41b221e3f24f99bba);
    $x7a86c157ee9713c34fbd7a1ee40f0c5a = hexdec('&H' . substr($x276e79316561733d64abdf00f8e8ae48, 0, 2));
    for($x1b90e1035d4d268e0d8b1377f3dc85a2 = 2;$x1b90e1035d4d268e0d8b1377f3dc85a2 < strlen($x276e79316561733d64abdf00f8e8ae48);$x1b90e1035d4d268e0d8b1377f3dc85a2 += 2) {
        $xe594cc261a3b25a9c99ec79da9c91ba5 = hexdec(trim(substr($x276e79316561733d64abdf00f8e8ae48, $x1b90e1035d4d268e0d8b1377f3dc85a2, 2)));
        $x71510c08e23d2083eda280afa650b045 = (($x71510c08e23d2083eda280afa650b045 < $x16754c94f2e48aae0d6f34280507be58)?$x71510c08e23d2083eda280afa650b045 + 1:1);
        $xab6389e47b1edcf1a5267d9cfb513ce5 = $xe594cc261a3b25a9c99ec79da9c91ba5 ^ ord(substr($x897356954c2cd3d41b221e3f24f99bba, $x71510c08e23d2083eda280afa650b045-1, 1));
        if ($xab6389e47b1edcf1a5267d9cfb513ce5 <= $x7a86c157ee9713c34fbd7a1ee40f0c5a)$xab6389e47b1edcf1a5267d9cfb513ce5 = 255 + $xab6389e47b1edcf1a5267d9cfb513ce5 - $x7a86c157ee9713c34fbd7a1ee40f0c5a;
        else $xab6389e47b1edcf1a5267d9cfb513ce5 = $xab6389e47b1edcf1a5267d9cfb513ce5 - $x7a86c157ee9713c34fbd7a1ee40f0c5a;
        $x0b43c25ccf2340e23492d4d3141479dc = $x0b43c25ccf2340e23492d4d3141479dc . chr($xab6389e47b1edcf1a5267d9cfb513ce5);
        $x7a86c157ee9713c34fbd7a1ee40f0c5a = $xe594cc261a3b25a9c99ec79da9c91ba5;
    } 
    echo $x0b43c25ccf2340e23492d4d3141479dc;
    die();
    return $x0b43c25ccf2340e23492d4d3141479dc;
} 		
  • Az átírt függvénybe beszúrt echo visszadja az eredeti forráskódot a standard kimenetre.
  • Írjunk egy rövid batch file-t (decrypt.bat), ami
    • a PHP-n keresztül meghívja a visszaalakítandó kódot, és ennek hatására a PHP kiírja a standard kimenetre az aktuális fájl forráskódját.
    • A batch file második sorában hívjuk meg a phpCodeBeautifier programot.
php.exe %1 > %TEMP%\phpCB.tmp
phpCB --space-after-if --space-after-switch --space-after-while --space-after-end-angle-bracket --glue-amperscore --change-shell-comment-to-double-slashes-comment  --force-large-php-code-tag --force-true-false-null-contant-lowercase  --align-equal-statements --comment-rendering-style PEAR --equal-align-position 50 --padding-char-count 4  %TEMP%\phpCB.tmp > _%1
del  %TEMP%\phpCB.tmp

A batch program hívása:

decrypt.bat test.php

A végeredmény az eredeti fájlhoz képest a visszaalakított és szépen megformázott kódot adja vissza.