Decriptare file PHP protetti con SourceCop

Mi è capitato oggi di imbattermi in un file criptato, di questo tipo:

<?php if(!function_exists('findsysfolder')){function findsysfolder($fld){$fld1=dirname($fld);$fld=$fld1.'/scopbin';clearstatcache();if(!is_dir($fld))return findsysfolder($fld1);else return $fld;}}require_once(findsysfolder(__FILE__).'/911006.php');$REXISTHECAT4FBI='BLABLA';g0666f0acdeed38d4cd9084ade1739498(f0666f0acdeed38d4cd9084ade1739498(__FILE__));$REXISTHEDOG4FBI='BLABLABLA';$REXISTHECAT4FBI='94CD76CD371C5A7BC70C186E779C293B9B49BACA5A781A6'; eval(y0666f0acdeed38d4cd9084ade1739498('1034 6 E73D03055E3',$REXISTHEDOG4FBI));?>

Dopo una rapida ricerca ho scoperto che tale codice è prodotto da un simpatico programma (a pagamento), di nome SourceCop.

Questo programma permette di criptare dei file PHP, in modo da poterli distribuire ma senza renderli apparentemente comprensibili per un essere umano.

Apparentemente. Perché in pochi minuti ho trovato un rapido modo per decriptarli, vediamolo insieme.

  • Modificare il file ./scopbin/911006.php, e modificare la stringa:
    return (strstr($s,'echo')==false?

    in:

    return (strstr($s,'NONROMPERE')==false?
  • tornare al file criptato, e alla fine del file modificare:
    eval(y0666f0acdeed38d4cd9084ade1739498('1034 6 E73D03055E3',$REXISTHEDOG4FBI));

    in:

    echo(y0666f0acdeed38d4cd9084ade1739498('1034 6 E73D03055E3',$REXISTHEDOG4FBI));
  • eseguire lo script, e verrà mostrato il sorgente precedentemente criptato.
  • servire freddo. (D)

Per capire cosa ho fatto: il programma lascia salvato il codice criptato in una variabile, che decripta alla fine del file e la esegue (attraverso eval). Quindi è sufficiente stampare a video il contenuto della variabile già decriptata, invece che eseguirla.

Nota: nel file 911006.php c’è una debolissima protezione contro attacchi di questo tipo: si controlla che il file criptato non contenga funzioni come echo(), print()

Ovviamente basta eliminare questo piccolo controllo per poterle comodamente utilizzare.