Bien le bonjour.
Voici une petite classe sans prétention que je viens d'écrire vous permettant d'obfusquer partiellement une source php. c'est un code assez intéressant, car contenant énormément de regex et d'appels à des fonction récursives.
Je mettrai la classe à jour au fur et à mesure.
Voici un script avant:
[code:1:d9a3489756]
<?php
include "myClass.php";
include "../../../../config.php";
function voici_Une_Chaine_Compliquee($chaine){
return $chaine;
}
$encodedStr="turlichon";
include "../../config.php";
mysql_connect($database_host, $database_username, $database_password);
mysql_select_db($database_name);
$str[0]='"'.$encodedStr.'"';
$str[2]+=2;
$user_id=35;
voici_Une_Chaine_Compliquee("/\"/");
$sql="SELECT * FROM users WHERE userid='$user_id'";
$instance=new classTest1();
$instance->tralala();
echo $turlututu;
/**
* Voici une superbe page bien commentee
*/
echo "VAR=".$var."ENDVAR";
$turlututu="caca";
//include "../../../config.php";
// Une variable
$une_variable=0;
$une_variable2=1;
# Un commentaire
$name=$_GET['une_variable_test1'];
$name34=$name;
$name34;
echo "NOTRE VARIABLE TEST=".$name;
echo "Bienvenue sur mon super site!";
echo "VAR THAT HAS NOT TO BE CHANGED:".$database_host."<br>";
?>
<div>
PAGE A OBFUSQUER
<img src="une belle image de tortue">
</div>
<?
echo "Voici la page a obfusquer. Il s'agit de la suite de nombre de 1 a 10";
for($i=0; $i<10;$i++){
echo "Votre nombre est:$i \n";
}
?>
[/code:1:d9a3489756]
Et après obfuscation:
[code:1:d9a3489756]
<?php include"\x6d\x79\x43\x6c\x61\x73\x73\x2e\x70\x68\x70";include"\x2e\x2e\x2f\x2e\x2e\x2f\x2e\x2e\x2f\x2e\x2e\x2f\x63\x6f\x6e\x66\x69\x67\x2e\x70\x68\x70";function voici_Une_Chaine_Compliquee($rexqzdhgsp){ return $rexqzdhgsp;} $jrjpluwuey="\x74\x75\x72\x6c\x69\x63\x68\x6f\x6e";include"\x2e\x2e\x2f\x2e\x2e\x2f\x63\x6f\x6e\x66\x69\x67\x2e\x70\x68\x70";mysql_connect($database_host,$database_username,$database_password);mysql_select_db($database_name);$tfuyxmzdws[0]="\x22".$jrjpluwuey."\x22";$tfuyxmzdws[2]+=(-25 +91 - 64);$bkomqbmwzz=(-33 +86 - 18);voici_Une_Chaine_Compliquee("\x2f\x5c\x22\x2f");$pmvliljjsh="\x53\x45\x4c\x45\x43\x54\x20\x2a\x20\x46\x52\x4f\x4d\x20\x75\x73\x65\x72\x73\x20\x57\x48\x45\x52\x45\x20\x75\x73\x65\x72\x69\x64\x3d\x27$bkomqbmwzz\x27";$ibedyjspxp=new classTest1();$ibedyjspxp->tralala();echo $riwhqmxurr;echo"\x56\x41\x52\x3d".$utkriegwwz."\x45\x4e\x44\x56\x41\x52";$riwhqmxurr="\x63\x61\x63\x61";$pciuepeqei=(48 +17 - 65);$kejonlydkb=(40 +49 - 88);$qlodrizgsb=$_GET["\x75\x6e\x65\x5f\x76\x61\x72\x69\x61\x62\x6c\x65\x5f\x74\x65\x73\x74\x31"];$cmboyljdxg=$qlodrizgsb;$cmboyljdxg;echo"\x4e\x4f\x54\x52\x45\x20\x56\x41\x52\x49\x41\x42\x4c\x45\x20\x54\x45\x53\x54\x3d".$qlodrizgsb;echo"\x42\x69\x65\x6e\x76\x65\x6e\x75\x65\x20\x73\x75\x72\x20\x6d\x6f\x6e\x20\x73\x75\x70\x65\x72\x20\x73\x69\x74\x65\x21";echo"\x56\x41\x52\x20\x54\x48\x41\x54\x20\x48\x41\x53\x20\x4e\x4f\x54\x20\x54\x4f\x20\x42\x45\x20\x43\x48\x41\x4e\x47\x45\x44\x3a".$database_host."\x3c\x62\x72\x3e";?>
<div>
PAGE A OBFUSQUER
<img src="une belle image de tortue">
</div>
<? echo"\x56\x6f\x69\x63\x69\x20\x6c\x61\x20\x70\x61\x67\x65\x20\x61\x20\x6f\x62\x66\x75\x73\x71\x75\x65\x72\x2e\x20\x49\x6c\x20\x73\x27\x61\x67\x69\x74\x20\x64\x65\x20\x6c\x61\x20\x73\x75\x69\x74\x65\x20\x64\x65\x20\x6e\x6f\x6d\x62\x72\x65\x20\x64\x65\x20\x31\x20\x61\x20\x31\x30";for($wralhlsdwi=(-22 +98 - 76);$wralhlsdwi<(-83 +98 - 5);$wralhlsdwi+=(105-53-51)){ echo"\x56\x6f\x74\x72\x65\x20\x6e\x6f\x6d\x62\x72\x65\x20\x65\x73\x74\x3a$wralhlsdwi\x20\x5c\x6e";} ?>
[/code:1:d9a3489756]
On voît ici que le GET est conservé ainsi que que la variable $database_host qui a été définie dans config.php, qui est en dehors de la zone d'obfuscation.
Voici l'obfuscation de la classe:
Avant:
[code:1:d9a3489756]
<?php
include "myClass2.php";
include "configuration/test/configuration_vars.php";
/**
* @brief Ceci est une jolie classe de test
*/
class classTest1{
// Une variable
public $variableDeClasse2;
private $variableDeClasse1;
public function __construct(){
$arg="caca";
$this->variableDeClasse2="turlututu";
$this->variableDeClasse1=$arg;
}
public function tralala(){
echo "MA VARIABLE DE CLASSE=".$this->variableDeClasse1." AINSI QUE ".$this->variableDeClasse2."<br>";
return 1;
}
}
?>
[/code:1:d9a3489756]
Après:
[code:1:d9a3489756]
<?php include "\x6d\x79\x43\x6c\x61\x73\x73\x32\x2e\x70\x68\x70";include "\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x74\x69\x6f\x6e\x2f\x74\x65\x73\x74\x2f\x63\x6f\x6e\x66\x69\x67\x75\x72\x61\x74\x69\x6f\x6e\x5f\x76\x61\x72\x73\x2e\x70\x68\x70";class classTest1{ public $ygbbwzrvvx;private $jyuqwrfgix;public function __construct(){ $choywytsnt="\x63\x61\x63\x61";$this->ygbbwzrvvx="\x74\x75\x72\x6c\x75\x74\x75\x74\x75";$this->jyuqwrfgix=$choywytsnt;} public function tralala(){ echo "\x4d\x41\x20\x56\x41\x52\x49\x41\x42\x4c\x45\x20\x44\x45\x20\x43\x4c\x41\x53\x53\x45\x3d".$this->jyuqwrfgix."\x20\x41\x49\x4e\x53\x49\x20\x51\x55\x45\x20".$this->ygbbwzrvvx."\x3c\x62\x72\x3e";return 1;} } ?>
[/code:1:d9a3489756]
Il reste à tester ça plus en profondeur, puis à implémenter l'obfuscation des classes et des fonctions et l'ajout de junk code.
[color=red:d9a3489756]Testé avec succès sur un projet relativement gros. Merci de signaler les bugs que vous pouvez repérer.[/color:d9a3489756]
http://www.openbio.fr , onglet sources.
J'ai commencé la rédaction d'une documentation, que vous pourrez trouver sur http://www.openbio.fr , dans l'onglet doc.
La tortue.
[color=blue:d9a3489756]MAJ - 04/08/2010: Correction de bugs divers, implementation de l'obfusaction de variables. Compatibilité avec les tableaux et les variables POST/GET. Allegement d'une partie des regexs.[/color:d9a3489756]
[color=blue:d9a3489756]MAJ - 05/08/2010: Correction d'un bug dans la fonction d'encodage des chaines. Compatibilité avec les variables globales de PHP. Support des classes, Support des arguments de fonctions. Construction d'un arbre des dépendances: Gestion et obfuscation récursive des includes. Non obfuscation des variables définies dans un include situé en dehors du répertoire de travail.[/color:d9a3489756]
[color=blue:d9a3489756]MAJ - 06/08/2010: Automatisation de la construction de l'arborescence des répertoires. Support des instructions require et require_once.[/color:d9a3489756]
[color=blue:d9a3489756]MAJ - 09/08/2010: Correction de plusieurs bugs liés aux sigils, correction de la génération de l'arborescence des dépendances.[/color:d9a3489756]
[color=blue:d9a3489756]MAJ - 10/08/2010: Correction d'un bug lié aux échappements multiples de caractères spéciaux.[/color:d9a3489756]
[color=red:d9a3489756]MAJ - 17/08/2010: Mise en ligne d'une démo à http://www.openbio.fr/tools/[/color:d9a3489756]
[color=green:d9a3489756]TODO - 21/08/2010: J'aurais finalement du utiliser le tokenizer pour parser ma source. Je referai ça quand j'aurais (et si j'en ait un!) un moment[/color:d9a3489756]