Ya hemos probado a usar ChatGPT para desofuscar código, ahora lo vamos a probar para lo contrario, ofuscarlo.
Puedes ver el resultado en el siguiente vídeo de mi canal de Youtube:
Prueba 1: Hola mundo en C
#include <stdio.h>
int main() {
// printf() displays the string inside quotation
printf("Hello, World!");
return 0;
}
Resultados:
Como ofuscación es bastante pobre:
#include <stdio.h>
#define p printf
#define r return
int main() {
p("H");
p("e");
p("l");
p("l");
p("o");
p(",");
p(" ");
p("W");
p("o");
p("r");
p("l");
p("d");
p("!");
r 0;
}
Otro intento con mejor pinta aunque sigue sin ser perfecto y la cadena de texto sigue expuesta:
#include <stdio.h>
#include <string.h>
char *encode(char *str) {
static char buffer[256];
int i;
for (i = 0; str[i] != '\0'; i++) {
buffer[i] = str[i] + 1; // se suma 1 al código ASCII de cada caracter
}
buffer[i] = '\0';
return buffer;
}
char *decode(char *str) {
static char buffer[256];
int i;
for (i = 0; str[i] != '\0'; i++) {
buffer[i] = str[i] - 1; // se resta 1 al código ASCII de cada caracter
}
buffer[i] = '\0';
return buffer;
}
int main() {
char *message = "Hello, World!";
char *encoded_message = encode(message);
char *decoded_message = decode(encoded_message);
printf("%s", decoded_message);
return 0;
}
El último intento tiene mejor pinta pero un ser humano seria capaz de entenderlo fácilmente ya que solo trata de añadir un
#include <stdio.h>
#define a(e)(char)(e-1)
#define b(e)(char)(e+1)
int main() {
char* m = b('G') + a('F') + b('m') + a('n') + b('m') + a('k') + b('`') + b('V') + a('m') + a('o') + b('y') + b('q') + b('t') + b('u') + b('k') + b('w') + a('t');
char* c = m;
while(*c) {
putchar(*c);
c++;
}
return 0;
}
Para ver si obtiene mejor resultado le especifico desde el principio que no se pueda leer «Hello, world» y ChatGPT cumple….a su manera:
#include <stdio.h>
#define H e##l##l##o
#define W o##r##l##d
#define S(x) #x
int main() {
printf("%s, %s!", S(H), S(W));
return 0;
}
Prueba 2: Fibonacci en C
Para la segunda prueba le pediremos que ofusque el siguiente código en C que calcula la serie de Fibonacci y veremos como lo ofusca:
El primer resultado no es malo (omitiendo las cadenas que ya hemos visto que no entiende que hay que «ocultarlas»):
#include <stdio.h>
#include <stdlib.h>
unsigned long long f(int n){
unsigned long long a,b,c;
if (n<=0) return 0;
if (n==1) return 1;
a=0,b=1;
for(int i=2;i<=n;i++)c=a+b,a=b,b=c;
return c;
}
int main(int a,char **b){
printf("fibo[%s] = %llu\n",b[1],f(atoi(b[1])));
return 0;
}
Pidiéndole que lo ofusque aun más el resultado es bueno aunque falta añadir una linea con F(x) para que funcione:/s
#include <stdio.h>
#include <stdlib.h>
#define O unsigned long long
#define F(x) O f(x){O a,b,c;if(x<=0)return 0;if(x==1)return 1;a=0,b=1;for(int i=2;i<=x;i++)c=a+b,a=b,b=c;return c;}int main(int a,char**b){printf("fibo[%s] = %llu\n",b[1],f(atoi(b[1])));return 0;}
Prueba 3: Fibonacci en JS
fibonacci(n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
Resultados:
function f(n){if(n<=1){return n}else{return f(n-1)+f(n-2)}}
Y:
var f=function(g){if(g<=1){return g;}else{return f(g-1)+f(g-2);}};