Page 1 of 2

Obfuscation php

PostPosted: Tue Aug 03, 2010 3:21 pm
by TorTukiTu
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]

PostPosted: Tue Aug 03, 2010 5:36 pm
by Manu404
Sympa comme petite classe. J'attend de voire comment elle vas tourner.
Juste un petit conseil, rapidshare n'est pour moi pas le meilleur outil pour faire tourner ce genre de projet. De plus tu n'as qu'une source a publier. J'ai pensé a cela : http://hackbbs.pastebin.org/445876
Ca évitera au moin d'attendre et rend la source accessible à tous.
N'hésite pas a éditer si tu trouve mon initiative trop "cavalière"

PostPosted: Tue Aug 03, 2010 8:19 pm
by TorTukiTu
Tu as tout à fait raîson, Manu.

J'avais pas pensé à pastebiner. J'ai écris cette classe à l'arrache pendant ma pause de midi =). Je pense que je continuerais à faire ça ces prochains jours.

C'est un mini-projet, mais bon, au rythme d'une heure par jour, il y a moyen que ça dure un moment.

Il ya carrément moyen d'améliorer la chose:
- On pourrai condenser la plupart des regex, voire faire carrément sans regex.
- Les fonctions sont trop longues et certaines boucles pourraient être optimisés.
- Pour finir, le code ne suit et ne suivra aucun modèle précis.

En l'occurence, j'ai juste besoin d'un petit script pour obfusquer mes sources perso. J'ai pensé qu'il pourrait être utile à certains. A priori tout marche bien. Mais comme je n'ai pas fait les choses rigoureusement, je n'ai moi même pas confiance. Pensez bien à vérifier le bon fonctionnement de vos script si vous utilisez cette classe.

La tortue.

PS.: pour le mail de devBBS, ça marche pour vous?

PostPosted: Wed Aug 04, 2010 8:32 pm
by THE-DEATH
turtle si t'es modo sur dbbs alors je crois que c'est normal, au dernieres news ya pas de recup pour les modos faut voir avec manu directement. Sinon alors je sais pas...

PostPosted: Wed Aug 04, 2010 11:37 pm
by Sliim
Sympa ton petit projet tortue :).

Néanmoins j'ai une 'tite question, mais d'où tu sors une idée pareille ? toi qui te bats pour le partage tu veux obfusquer tes codes ??? (à prendre sur le ton de l'humour :)).

je regarderais le code quand j'aurais un peu de temps, ça a l'air intéressant d'analyser la façon dont tu procèdes :p.

++
Sliim

PostPosted: Thu Aug 05, 2010 8:21 am
by TorTukiTu
Hello Sliim,

[color=red:ea8dc3260c]J'ai supprimé ma réponse, c'est plus prudent, j'ignore qui lira ce post.[/color:ea8dc3260c]

La tortue.

PostPosted: Thu Aug 05, 2010 2:56 pm
by TorTukiTu
Je poursuis mon travail, la classe est maintenant capable de générer un arbre des dépendances afin d'obfusquer dans l'ordre optimal les différents fichiers.

Demain, je gérerai le cas des dépendances situés en dehors de l'espace de travail (et qui ne doivent donc pas être obfusqués!). [FAIT]

N'hésitez pas à me signaler vos remarques ou les éventuels bugs que vous avez pu détecter.

La tortue.

PostPosted: Thu Aug 05, 2010 10:48 pm
by Sliim
[quote:7d078f2c9e="TorTukiTu"]Hello Sliim,

[color=red:7d078f2c9e][Edit Sliim] Tortu tu as zappé d'edit mon quote :). C'est maintenant fait. [/Edit][/color:7d078f2c9e]

La tortue.[/quote:7d078f2c9e]

Haha, ok ok, je comprend mieux :p.

En tout cas t'as l'air plutôt réactif sur ce projet, faut que je look ça :).

++
[u:7d078f2c9e]Sliim[/u:7d078f2c9e]

PostPosted: Tue Aug 17, 2010 3:15 pm
by TorTukiTu
Bonjour à tous,

J'ai mi une démo en ligne de ma classe d'obfuscation.

Vous pouvez l'utiliser pour obfusquer rapidement vos sources sans avoir a télécharger la classe.

[url]http://www.openbio.fr/tools/[/url]

La tortue.

PostPosted: Tue Jan 25, 2011 1:26 pm
by SHAGUAR
Sympa ca, je suis actuellement à la recherche un outil rapide pour obfusquer un code PHP. Je veux obfusquer une classe, qui doit se connecter à un site avec mon compte, c'est juste histoire qu'on puisse pas me voler la classe, ni mon mot de passe ( ceux qui ont accès à mon FTP ).

Bref, je voulais en fait savoir quel outil est le mieux pour éviter la "dé-obfuscation" du code : Le tiens, ou celui-ci :

[code:1:04566e0115]<?php
$nom_fichier = 'steam.class.php';

$fichier = trim(file_get_contents($nom_fichier));
$fichier = preg_replace("/^<\?(php)?/", '', $fichier);

$fichier = preg_replace("/\?>$/", '', $fichier);

echo '<h1>Encodage</h1>';

echo '<p>Nom : '.$nom_fichier.'</p>';

$b64 = base64_encode($fichier);

echo '<p>Base 64 : '.$b64.'</p>';

$tr = strtr($b64, " kCV]4m.DNvM>lstIKLBE6}ghf8
[QAowPSR9ibX3cO{up=0anq27jF1eJx/UWGrzHT<5yZYd",
"ACv.sfKXY{dEn58wjIBToFUtb9>gL}=kqeZ0RuD[4lz
Om<12PyHSWJGp7MaiVQr/cN]h63x");

echo '<p>Translation : '.$tr.'</p>';

$enc = "\$__c='".$tr."';";

$enc .= "\$__s=strtr(\$__c,\"ACv.sfKXY{dEn58wjI
BToFUtb9>gL}=kqeZ0RuD[4lz Om<12PyHSWJGp7MaiVQr/
cN]h63x\",\" kCV]4m.DNvM>lstIKLBE6}ghf8[QAowPSR9i
bX3cO{up=0anq27jF1eJx/UWGrzHT<5yZYd\");";

$enc .= '$__d=strrev("edoced_46esab");eval(\'$__
x=$__d("$__s");\');eval($__x);';

echo '<h1>Résultat</h1>';

echo '<textarea cols="100" rows="10">';
echo '<?php '.$enc.' ?>';

echo '</textarea>';
[/code:1:04566e0115]

Je cherche vraiment un truc simple, je veux pas me casser le c*l avec un gros truc genre Zend Encoder etc...

PostPosted: Tue Jan 25, 2011 6:01 pm
by TorTukiTu
L'intérêt de l'outil que j'ai développé est qu'il gère les dépendances.

Autrement dit, si tu obfusques un fichier qui fait appel à des variables se trouvant dans un autre fichier non obfusqué, ces variables seront conservées, et ton fichier obfusqué restera compatible. Le script que tu proposes ne fait pas ça.

Ensuite, à toi de voir en fonction de tes besoins. Pour ce qui est de la classe ci-dessus, je ne me rappelle plus de quelle version il s'agit. Il se peut qu'elle soit buguée.
Tiens moi au courant, du bon fonctionnement (ou des bugs!) de la classe, si ça marche mal, j'irai rechercher la version qui va bien dans mes archives.

La tortue du 974.

PostPosted: Wed Jan 26, 2011 4:45 pm
by SHAGUAR
Et donc avec ta class, on obfusque et le serveur le lis tel quel ou faut run ta class avec ?

PostPosted: Wed Jan 26, 2011 5:25 pm
by TorTukiTu
Plus besoin de la classe une fois obfusqué. Ca ne change en rien le fonctionnement du code, ça ne fait que ralentir la compréhention du code pour un être humain.

Si tu veux t'assurer que ta source ne parte pas dans la nature ou ne soit jamais (ou pas) réversé, n'utilise surtout pas ces classes. il te faut un outil d'obfuscation qui travaille au niveau de l'interpréteur php, pas directement au niveau du code.

Typiquement, ce genrs d'outil (ioncube par exemple) ne laisse dans les fichiers source d'origine qu'une version chiffrée du code. Le déchiffrement se fait à la volée. Ce qui implique l'ajout d'une librarie à l'interpréteur PHP.

La tortue du 974.

PostPosted: Wed Jan 26, 2011 5:31 pm
by SHAGUAR
Bon je vais faire ca. C'est suffisant pour les noobs qui ont accès à mon FTP, ils ne vont, je pense, pas reverse.

PostPosted: Wed Jan 26, 2011 5:43 pm
by TorTukiTu
Je viens de lire la fonction que tu as posté. C'est vraiment bidon, en gros, il ne fait que mettre ton code en base_64. N'importe qui peux réaliser les opérations inverses et retrouver la source originale. Dans le cas de la classe que j'ai crée, c'est impossible. Le code est totalement réécris d'une autre façon.