sexta-feira, 14 de outubro de 2016

IOCCC - International Obfuscated C Code Contest






Falae pessoal , dessa vez eu não vim aqui explicar algo e sim mostrar algo que eu até uns tempos não conhecia e achei que seria legal trazer esse tipo de conteudo aqui, ainda mais para quem curte programar em C ( como eu ) ... ah ... talvez saiam mais 2 posts hoje ... não é certeza , mas tenho idéia de fazer outros 2 ainda hoje ...

PS : Pretendo fazer outro post sobre isso outra hora !

( Bom , eu sei que talvez tenham alguns aqui que estavam esperando que esse post fosse a segunda parte do post anterior sobre assembly e sei que a alguns devem estár reagindo mais ou menos assim ... sorry )



( Mas fiquem calmos, quem curte programar pelo menos vai gostar talvez =p )

Bom , primeiramente o'que é ioccc ( International Obfuscated C Code Contest ) IOCC é uma competição que premia os autores dos códigos mais ilegíveis possivel ( Mas claro , o programa deve funcionar corretamente ) !

( Ou é conhecida por alguns apenas por "Ofuscação de código", ja lhe passou essa idéia na cabeça ? ofuscar seu código para que ninguem o edita-se ou retira-se seus créditos ? creio que tecnicas de ioccc te ajudem nisso se você for programador em C )

PS : O código que eu apresentei no final ( feito por mim ) é apenas um exemplo para quem quer se aprofundar no assunto ( e no final do post vou deixar um PDF sobre o assunto )

Site oficial : http://www.ioccc.org/

Algumas regras dessa competição ...

1 ) Você deve entrar com um programa completo ( que tenha alguma utilidade tambem ) ...

2 ) O source-code do seu programa não pode passar de 4096 bytes de comprimento ... isso inclui espaços em branco, tabs, quebras de linha, caracters especiais e dentre outras coisas !

3 ) O seu programa , tanto o source-code tanto o executavel devem ter apenas permissões de leitura ...

Bom , vai seguindo por ae ... você pode checar a lista completa dessas regras no link abaixo :

http://www.ioccc.org/2004/rules

Essa competição pode ser vista em vários sentidos ... o principal é mostrar o poder que tem a linguagem C e como você pode fazer as mesmas coisas de milhares de formas diferentes ... aproveitando até algumas caracteristicas da linguagem ....

Vamos a alguns exemplos de códigos IOCCC ( os códigos asseguir não são de minha autoria ) ...

Começando por um clássico hello world hahaha

1)
<--code

#include "stdio.h"
#define e 3
#define g (e/e)
#define h ((g+e)/2)
#define f (e-g-h)
#define j (e*e-g)
#define k (j-h)
#define l(x) tab2[x]/h
#define m(n,a) ((n&(a))==(a))

long tab1[]={ 989L,5L,26L,0L,88319L,123L,0L,9367L };
int tab2[]={ 4,6,10,14,22,26,34,38,46,58,62,74,82,86 };

main(m1,s) char *s; {
    int a,b,c,d,o[k],n=(int)s;
    if(m1==1){ char b[2*j+f-g]; main(l(h+e)+h+e,b); printf(b); }
    else switch(m1-=h){
        case f:
            a=(b=(c=(d=g)<<g)<<g)<<g;
            return(m(n,a|c)|m(n,b)|m(n,a|d)|m(n,c|d));
        case h:
            for(a=f;a<j;++a)if(tab1[a]&&!(tab1[a]%((long)l(n))))return(a);
        case g:
            if(n<h)return(g);
            if(n<j){n-=g;c='D';o[f]=h;o[g]=f;}
            else{c='\r'-'\b';n-=j-g;o[f]=o[g]=g;}
            if((b=n)>=e)for(b=g<<g;b<n;++b)o[b]=o[b-h]+o[b-g]+c;
            return(o[b-g]%n+k-h);
        default:
            if(m1-=e) main(m1-g+e+h,s+g); else *(s+g)=f;
            for(*s=a=f;a<e;) *s=(*s<<e)|main(h+a++,(char *)m1);
        }
}


-->code



Eae embaralhou sua cabeça ? Se sim , essa era a inteção =p


Quem quiser testar o código é só compilar normalmente com o gcc mesmo ( se você utiliza ele )

$ gcc ioccc.c -o ioccc

Esse proximo faz uma animação na tela cujo vou colocar um gif abaixo mostrando !

<--code

  1. //
  2. k;double sin()
  3. ,cos();main(){float A=
  4. 0,B=0,i,j,z[1760];char b[
  5. 1760];printf("\x1b[2J");for(;;
  6. ){memset(b,32,1760);memset(z,0,7040)
  7. ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
  8. >i;i+=0.02){float c=sin(i),d=cos(j),e=
  9. sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
  10. h*e+f*g+5),l=cos (i),m=cos(B),n=s\
  11. in(B),t=c*h*g-f* e;int x=40+30*D*
  12. (l*h*m-t*n),y= 12+15*D*(l*h*n
  13. +t*m),o=x+80*y, N=8*((f*e-c*d*g
  14. )*m-c*d*e-f*g-l *d*n);if(22>y&&
  15. y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
  16. ".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
  17. printf("\x1b[H");for(k=0;1761>k;k++)
  18. putchar(k%80?b[k]:10);A+=0.04;B+=
  19. 0.02;}}/*****####*******!!=;:~
  20. ~::==!!!**********!!!==::-
  21. .,~~;;;========;;;:~-.
  22. ..,--------,*/
  23.  
-->code

Saida:




Incrivel não ? Calma , tem outro ! ( Esse faz um desenho no terminal , cujo vocês veram print logo abaixo )




<--code

#include<stdio.h> 
main() 
{ 
int i,l,u; 
char *ilu="STILL THINKING HOW I DID IT? 
!r/g.g#i.g/g!j/g.g#i.g/g+g!q0g!mag/h(g!m]g+g!p<g!h`i!l`g!k`g!h 
<g+g!p}g!i}g!i}g!h0g!g]g}g!g}h`g!h}g+g!p<g!h`g}g`g!h}g`h]g`g0g} 
g0g!g}g`g!h<g+g!q]g!n`g!o0g+g!r]g`h!g]g`g0h!g]g}g!g}g!j0g+g!n`g! 
i0g!h}g!g}g!g]g`g0g]g`g0g!h0g(g+g!m}g!g]g!h]g0g`g0g]g!n0g(g+g!m]g 
`g]g}g!g0g!g`h!gag]g!j0g(g+g!p]g0g`g0g`h]g!hag]g0g(g!k/g.h>g(g0g 
g]g+g!i`j-g`h0g`h-g`k-g`l*g0g!i0g|gg~i+g!i.g-g.k-g.h]g.h-g.k- 
g.i-g]g(g.g(g!g|hg~h+g!q`h0g]g`g!r(g.h>g/g]g~g0g+g!p0g`g0g!g 
}g]h+g!u]g0g"; 
for(i=28;l=ilu[i++];) 
for(u=(*(ilu+++i)-((1<<6)+(1<<5)+(1<<2)+(1<<1)));u--;) 
putchar(!((l-11)^(1<<5))?l-1-(1<<5):l-1);
}
-->code


Saida:




Foda né ? tem outros ...

Site cujo retirei esses exemplos : https://www.quora.com/What-is-the-most-obfuscated-C-code-you-have-ever-seen

Agora pra não ficar apenas um CTRL+C de códigos de IOCC eu resolvi tentar fazer o meu código própio ( que ficou bem BÁSICO ;-; ) com o mesmo contexto do primeiro código que eu passei ... apresentar um hello world ...

Como o código é de minha autoria eu vou explicar linha por linha para quem estiver curioso ...

<--code

#include <stdio.h>
void main(){int y,i[14]={0x48,0x65,0x6c,0x6c,0x6f,0x20,0x1,0x77,
0x6f,0x6c,0x72,0x64,0xA};
for(y=0;y<=13;y++)printf("%c",i[y]);}

-->code

Buguei mais ainda você ? kkk calma ... esse código é infantil se visto por outros olhos ... bom vamos começar pela biblioteca stdio ...

STDIO significa standard library input output ...

Ela é usada para você poder utilizar funções de entrada e saida de dados , no nosso caso é o "printf" 

Bom , seguindo ... void main() eu não sei se preciso explicar ... utilizei void apenas para economizar código ( e porque eu não gosto de ficar botando return 0; no final de cada código ) ... bom o void indica que uma função não irá retornar nada , no caso dispensa o uso do return 0;

Agora pulamos para "int y,i[15]={0x48,0x65,0x6c,0x6c,0x6f,0x20,0x1,
0x77,0x6f,0x6c,0x72,0x64,0xA};"

Parece complicado não ? rsrs
Mas não é =p

Primeiramente vemos que estamos declarando uma variavel de tipo int e um vetor de tipo int ... o'que são esses códigos hexadecimal dentro do vetor ?

São numeros da tabela ascii ... para quem não sabe , cada caracter existente é numerado na tela ascii , desde espaços em branco , quebras de linha , tabs, acentos e por ae vai ... cada caracter tem um numero é basicamente isso kkk

E se você pega um desses numeros , por exemplo 97 que é o valor do "a" minusculo ... e converte esse valor inteiro pra caracter , vera que ele ira te retornar o caracter "a"  ( avaaa ) ... como no código a seguir ...

<--code

#include <stdio.h>
int numero = 97;
printf("%c \n",numero);

-->code

Basta compilar e testar ae :)

Bom , tendo isso em mente , agora partiremos para o'que são os códigos hexadecimais do vetor i ... para quem ja se perdeu estamos falando do código abaixo ...


"int y,i[15]={0x48,0x65,0x6c,0x6c,0x6f,0x20,0x1,
0x77,0x6f,0x6c,0x72,0x64,0xA};"

Esses numeros hexadecimais do vetor "i" é exatamente numeros da tabela ascii referentes a cada caracter do hello world ...

Por exemplo ...

H = 0x48 ( em decimal ascii 72 )
E = 0x65  ( em decimal ascii 101 )
L = 0x6c  ( em decimal ascii 108 )
L = 0x6c   ( em decimal ascii 108 )
O = 0x6f   ( em decimal ascii 111 )
(espaço em branco) = 0x20 ( em decimal ascii 101 )
W = 0x1 ( em decimal ascii 109 )
O = 0x77 ( em decimal ascii 111 )
R = 0x6f ( em decimal ascii 101 )
L = 0x6c ( em decimal ascii 108 )
D = 0x72 ( em decimal ascii 100 )
"\n" = 0xA ( em decimal ascii 10 )

Deu pra entender ?

Para saber a tabela ascii completa , entre no link abaixo ...

O resto do código nem preciso mencionar né ...

Bom , é essa a idéia que eu queira passar , caso alguem queira se aventurar algum dia nessa competição hehe

Fonte(s) de estudo :

Link1 : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.19.9052&rep=rep1&type=pdf

Link2 : https://www.cosic.esat.kuleuven.be/publications/thesis-199.pdf
 

Notou algo errado ou incorreto nesse post ? Nos informe -> Aqui!

Até uma proxima.

4 comentários:

Kasyade disse...

Boa mlk ❤

Unknown disse...

Top meu mlk <3

Unknown disse...
Este comentário foi removido pelo autor.
Rvicente disse...

Muito bom seu trabalho mano.
https://orangetechbr.blogspot.com.br
renatodemaracana1@gmail.com

Postar um comentário

Tecnologia do Blogger.

Popular Posts