Hola mundo ofuscados

« Ingeniería del software en Microsoft | Las cualidades del Clipo de Office »

En fitzrovian.com podemos encontrar varios Hola Mundo escritos en C ofuscado. Se llama código ofuscado a aquel en el que se utilizan todos los artificios posibles para dificultar al máximo la lectura del programa, a modo de chiste, broma, y pasatiempo.

A continuación he copiado cada uno de ellos, junto con una explicación de cómo imprime "Hello world" cada programa, explicación a la que podéis acceder pulsando sobre el botón del mismo nombre.

¿Cuántos podéis descifrar por vosotros mismos?

hello1.c

#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio.h>
_____

hello2.c

#include<stdio.h>
main(){
    int x=0,y[14],*z=&y;*(z++)=0×48;*(z++)=y[x++]+0×1D;
    *(z++)=y[x++]+0×07;*(z++)=y[x++]+0×00;*(z++)=y[x++]+0×03;
    *(z++)=y[x++]-0×43;*(z++)=y[x++]-0×0C;*(z++)=y[x++]+0×57;
    *(z++)=y[x++]-0×08;*(z++)=y[x++]+0×03;*(z++)=y[x++]-0×06;
    *(z++)=y[x++]-0×08;*(z++)=y[x++]-0×43;*(z++)=y[x]-0×21;
    x=*(--z);while(y[x]!=NULL)putchar(y[x++]);
}

hello3.c

#include<stdio.h>
#define __(a) goto a;
#define ___(a) putchar(a);
#define _(a,b) ___(a) __(b);
main()
{ _:__(t)a:_('r',g)b:_('$',p)
  c:_('l',f)d:_(' ',s)e:_('a',s)
  f:_('o',q)g:_('l',h)h:_('d',n)
  i:_('e',w)j:_('e',x)k:_('\n',z)
  l:_('H',l)m:_('X',i)n:_('!',k)
  o:_('z',q)p:_('q',b)q:_(',',d)
  r:_('i',l)s:_('w',v)t:_('H',j)
  u:_('a',a)v:_('o',a)w:_(')',k)
  x:_('l',c)y:_('\t',g)z:___(0x0)}

hello4.c

int n[]={0×48,
0×65,0×6C,0×6C,
0×6F,0×2C,0×20,
0×77,0×6F,0×72,
0×6C,0×64,0×21,
0×0A,0×00},*m=n;
main(n){putchar
(*m)!='\0′?main
(m++):exit(n++);}

hello5.c


main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<<
1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1
<<1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(
1<<1)<<(1<<1))+((1<<1)<<(1<<(1>>1)))+ (1
<<(1>>1))),(((1<<1)<<(1<<1)<<(1<<1)<< (1
<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1)))- ((1
<<1)<<(1<<(1>>1)))),(((1<<1)<<(1<<1)<<(1
<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(1<<(1>>1
)))-((1<<1)<<(1<<(1>>1)))),(((1<<1)<< (1
<<1)<<(1<<1)<<(1<<1))-((1<<1)<<(1<<1)<<(
1<<(1>>1)))-(1<<(1>>1))),(((1<<1)<<(1<<1
)<<(1<<1))+((1<<1)<<(1<<1)<<(1<<(1>>1)))
-((1<<1)<<(1<<(1>>1)))),((1<<1)<< (1<<1)
<<(1<<1)),(((1<<1)<<(1<<1)<<(1<<1)<<(1<<
1))-((1<<1)<<(1<<1))-(1<<(1>>1))),(((1<<
1)<<(1<<1)<<(1<<1)<<(1<<1))-((1<<1)<< (1
<<1)<<(1<<(1>>1)))-(1<<(1>>1))), (((1<<1
)<<(1<<1)<<(1<<1)<<(1<<1))- ((1<<1)<< (1
<<1)<<(1<<(1>>1)))+(1<<1)), (((1<<1)<< (
1<<1)<<(1<<1)<< (1<<1))-((1<<1)<< (1<<1)
<<(1<<(1>>1)))-((1<<1) <<(1<< (1>>1)))),
(((1<<1)<< (1<<1)<<(1<<1)<< (1<<1))- ((1
<<1)<<(1<<1)<<(1<<1))+((1<<1)<< (1<<(1>>
1)))), (((1<<1)<<(1<<1) <<(1<<1))+(1<<(1
>>1))),(((1<<1)<<(1<<1))+((1<<1)<< (1<<(
1>>1))) + (1<< (1>>1)))}; for(i=(1>>1);i
<(((1<<1) <<(1<<1))+((1 <<1)<< (1<<(1>>1
))) + (1<<1)); i++) printf("%c",n[i]); }

hello6.c

#include <stdio.h>
#define _(_) putchar(_);
int main(void){int i = 0;_(
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++i)_(++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++i)_(++++++++++++++
i)_(--++i)_(++++++i)_(------
----------------------------
----------------------------
----------------------------
----------------------------
----------------i)_(--------
----------------i)_(++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++++
++++++++++++++++++++++++++i)
_(----------------i)_(++++++
i)_(------------i)_(--------
--------i)_(----------------
----------------------------
----------------------------
----------------------------
----------------------------
------i)_(------------------
----------------------------
i)return i;}
Relacionadas

Comentarios
  1. DrLecter

    Cabe acotar que existe gente que ofusca código no a modo de chiste, broma, o pasatiempo sino con el fin de causar problemas de organización, de competencia o para volverse 'imprescindibles' para el stakeholder. Saludos.

  2. Cuervo

    Me he quedado ofuscado!!! jajaja

  3. jajaja están muy buenos los códigos.
    El que lo hizo tiene tiempo de sobra.

  4. Ahh, la belleza del C, me he perdido en varias :D

    Para entender "al ojo" algo así hay que ser como el tipo de Matrix que al mirar el código veía mujeres rubias, morenas, etc.

  5. En la Semana ESIDE o ESIDE WORDS llevan años organizando concursos de programación ofuscada, nunca he participado pero no dudo de que lleguen buenos trabajos ;)
    En la Facultad somos asi :P

  6. [...] Enlace: | Manuales de C Vía: | MundoGeek [...]

  7. Así es como se debe hacer, hombre. Cualquier cosa que sea más avanzada es herejía.

    Excepto quizás el C++. El C++ es bueno si no usas strings ni herencias.

  8. Se me olvidaba, por si a alguien le interesa:
    http://semana.eside.deusto.es/index.php/Concursos

    Es ahi dónde aparece el concurso ;)

  9. El abuso nunca es bueno, pero también es necesario. :P

  10. Muchas gracias newton, muy interesante :)

  11. [...] Mundo Geek, colección de "Hola Mundo" escritos en C ofuscado, esto sí que es código legible, [...]

  12. [...] Hola Mundos en C ofuscados [...]

  13. valenluis

    Coincido con koki respecto a lo de matrix xD

  14. lord_bionyx

    Ofuscado? nunca lo habia oido… pero en fin, probe algunos codigos y funcan… hay que tener tiempo pa' hacer algo asi… XD

  15. Juan

    No hay que tener tiempo pa' hacer algo así sino un cerebro e mucha imaginación!!!

Deja un comentario