Ofuscación de código PHP

Ofuscación de código PHP

La ofuscación de código es el encubrimiento de información haciendo que sea mas confuso el tratar de leerlo, esto es algo que se utiliza en programación para hacer que un código fuente sea muy confuso de entender, pero al momento de compilarlo o interpretarlo funciona correctamente, esto es practicado mas que nada como una forma de proteger tu código para evitar sea pirateado o solo para hacerlo ilegible y que seas tu el único para poder darle mantenimiento.

Les dejo unos ejemplos de ofuscación con PHPtambién un ofuscador en el que estuve trabajando, espero les sea de interés y utilidad.

En PHP se puede realizar el cambio de los textos entre comillas dobles para utilizar valores octales o hexadecimales, como por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// Caracteres normales
echo "Hola mundo!";
 
// Caracteres en octal
echo "\110\157\154\141\40\155\165\156\144\157\41";
// Se usa una diagonal invertida "\" antes de cada numero octal
// Para poder obtener el numero octal de un carácter, se puede utilizar esta función: decoct( ord( "A" ) );
 
// Caracteres en hexadecimal
echo "\x48\x6f\x6c\x61\x20\x6d\x75\x6e\x64\x6f\x21"; 
// Se usa una diagonal invertida y una X "\x" en tes de cada numero hexadecimal
// Para poder obtener el numero hexadecimal de un carácter, se puede utilizar esta función: dechex( ord( "A" ) );
 
// Mezcla de caracteres en octal y hexadecimal
echo "\110\x6f\154\x61\40\x6d\165\x6e\144\x6f\41";
?>

De esa forma se imprimirá en los 4 casos “Hola mundo!”, pero ahora es mas difícil de leer que es lo que se tiene entre las comillas y solo nosotros que tenemos el código fuente sin ofuscar, sabemos que es lo que dice antes de correrlo.

También se pueden cambiar algunas funciones de php por una variable con su nombre, otras funciones como “echo”, “return” y “eval”, no pueden ser renombradas de lo contrario no pueden ejecutarse.

Para el ejemplo supongamos que también cambiamos la forma de imprimir el “Hola mundo!” para que no sea legible que se va a imprimir una cadena de texto, por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// Para que funcione en lugar de usar "echo" se usara "printf"
printf ( "\x48\x6f\x6c\x61\x20\x6d\x75\x6e\x64\x6f\x21" );
 
// Se sustituye la función por una variable
$var = "printf";
$var ( "\x48\x6f\x6c\x61\x20\x6d\x75\x6e\x64\x6f\x21" );
 
// Se puede cambiar la forma de escribir "printf" por octales y hexadecimales
$var = "\160\x72\151\x6e\164\x66";
$var ( "\x48\x6f\x6c\x61\x20\x6d\x75\x6e\x64\x6f\x21" );
 
// Se puede cambiar el nombre de la variable por algo mas confuso
$4b21a5d389f70a = "\160\x72\151\x6e\164\x66";
$4b21a5d389f70a ( "\x48\x6f\x6c\x61\x20\x6d\x75\x6e\x64\x6f\x21" );
?>

Ahora contamos con un código difícil de comprender para muchas personas, de esa forma solo nosotros sabemos que ese código imprimirá la cadena “Hola mundo!”, y solo nosotros contamos con el primer código sin ofuscar, por lo que solo nosotros podemos hacer modificaciones al código.

¿Que tanto se puede ofuscar un código?

Tanto como el programador quiera, podemos agregar que se cambien caracteres con respecto a un diccionario, podemos cifrar el código en base64, podemos hacer una infinidad de cosas.

Les dejo un ejemplo sobre como seria un cifrado en base64 del “Hola mundo!”, después de esto les recomiendo hacer sus propias pruebas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// El código cifrado en base64 (sin el "<?php" y "?>", mas adelante lo explico)
"JGEgPSAiXDE2MFx4NzJcMTUxXHg2ZVwxNjRceDY2IjsNCiRhICgiXDExMFx4NmZcMTU0XHg2MVw0MFx4NmRcMTY1XHg2ZVwxNDRceDZmXDQxIik7"
 
// Para poder obtener el código no cifrado se descifra en base64
base64_decode ( "JGEgPSAiXDE2MFx4NzJcMTUxXHg2ZVwxNjRceDY2IjsNCiRhICgiXDExMFx4NmZcMTU0XHg2MVw0MFx4NmRcMTY1XHg2ZVwxNDRceDZmXDQxIik7" );
 
// El código descifrado debe ser ejecutado (aquí no se puede tener un código con "<?php" y "?>")
eval ( base64_decode ( "JGEgPSAiXDE2MFx4NzJcMTUxXHg2ZVwxNjRceDY2IjsNCiRhICgiXDExMFx4NmZcMTU0XHg2MVw0MFx4NmRcMTY1XHg2ZVwxNDRceDZmXDQxIik7" ) );
 
// Cambiamos "base64_decode" para hacerlo mas difícil de entender, pero no se puede hacer con "eval"
$a07f983d5a12b4 = "\142\x61\163\x65\66\x34\137\x64\145\x63\157\x64\145";
eval ( $a07f983d5a12b4 ( "JGEgPSAiXDE2MFx4NzJcMTUxXHg2ZVwxNjRceDY2IjsNCiRhICgiXDExMFx4NmZcMTU0XHg2MVw0MFx4NmRcMTY1XHg2ZVwxNDRceDZmXDQxIik7" ) );
 
// Se eliminan espacios innecesarios para que todo este en una linea
$a07f983d5a12b4="\142\x61\163\x65\66\x34\137\x64\145\x63\157\x64\145";eval($a07f983d5a12b4("JGEgPSAiXDE2MFx4NzJcMTUxXHg2ZVwxNjRceDY2IjsNCiRhICgiXDExMFx4NmZcMTU0XHg2MVw0MFx4NmRcMTY1XHg2ZVwxNDRceDZmXDQxIik7"));
?>

Existen diferentes maneras de acomodar nuestro código, de igual forma podemos crear nuestro propio ofuscador de código, tanto para PHP como para cualquier otro lenguaje.

Si desean poden ofuscar su código PHP o entretenerte en descifrar como lo ofusco, les dejo que prueben un ofuscador PHP que realice.