Obfuscation php

Moderator: Mod

Obfuscation php

Postby TorTukiTu » Tue Aug 03, 2010 3:21 pm

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]
Last edited by TorTukiTu on Sat Aug 21, 2010 7:32 am, edited 59 times in total.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby Manu404 » Tue Aug 03, 2010 5:36 pm

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"
User avatar
Manu404
 
Posts: 2219
Joined: Tue Feb 26, 2008 3:44 pm
Location: ::1:

Postby TorTukiTu » Tue Aug 03, 2010 8:19 pm

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?
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby THE-DEATH » Wed Aug 04, 2010 8:32 pm

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...
User avatar
THE-DEATH
 
Posts: 971
Joined: Wed Jul 23, 2008 10:49 am
Location: 127.0.0.1

Postby Sliim » Wed Aug 04, 2010 11:37 pm

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
User avatar
Sliim
Site Admin
 
Posts: 1177
Joined: Fri May 16, 2008 12:53 pm

Postby TorTukiTu » Thu Aug 05, 2010 8:21 am

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.
Last edited by TorTukiTu on Thu Aug 12, 2010 1:15 pm, edited 1 time in total.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby TorTukiTu » Thu Aug 05, 2010 2:56 pm

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.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby Sliim » Thu Aug 05, 2010 10:48 pm

[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]
Last edited by Sliim on Tue Jan 25, 2011 7:32 pm, edited 2 times in total.
User avatar
Sliim
Site Admin
 
Posts: 1177
Joined: Fri May 16, 2008 12:53 pm

Postby TorTukiTu » Tue Aug 17, 2010 3:15 pm

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.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby SHAGUAR » Tue Jan 25, 2011 1:26 pm

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...
SHAGUAR
Projets
 
Posts: 114
Joined: Wed Feb 24, 2010 1:44 pm

Postby TorTukiTu » Tue Jan 25, 2011 6:01 pm

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.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby SHAGUAR » Wed Jan 26, 2011 4:45 pm

Et donc avec ta class, on obfusque et le serveur le lis tel quel ou faut run ta class avec ?
SHAGUAR
Projets
 
Posts: 114
Joined: Wed Feb 24, 2010 1:44 pm

Postby TorTukiTu » Wed Jan 26, 2011 5:25 pm

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.
Last edited by TorTukiTu on Wed Jan 26, 2011 5:36 pm, edited 1 time in total.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby SHAGUAR » Wed Jan 26, 2011 5:31 pm

Bon je vais faire ca. C'est suffisant pour les noobs qui ont accès à mon FTP, ils ne vont, je pense, pas reverse.
SHAGUAR
Projets
 
Posts: 114
Joined: Wed Feb 24, 2010 1:44 pm

Postby TorTukiTu » Wed Jan 26, 2011 5:43 pm

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.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Next

Return to Php

Who is online

Users browsing this forum: No registered users and 1 guest

cron