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
-->code
- //
- k;double sin()
- ,cos();main(){float A=
- 0,B=0,i,j,z[1760];char b[
- 1760];printf("\x1b[2J");for(;;
- ){memset(b,32,1760);memset(z,0,7040)
- ;for(j=0;6.28>j;j+=0.07)for(i=0;6.28
- >i;i+=0.02){float c=sin(i),d=cos(j),e=
- sin(A),f=sin(j),g=cos(A),h=d+2,D=1/(c*
- h*e+f*g+5),l=cos (i),m=cos(B),n=s\
- in(B),t=c*h*g-f* e;int x=40+30*D*
- (l*h*m-t*n),y= 12+15*D*(l*h*n
- +t*m),o=x+80*y, N=8*((f*e-c*d*g
- )*m-c*d*e-f*g-l *d*n);if(22>y&&
- y>0&&x>0&&80>x&&D>z[o]){z[o]=D;;;b[o]=
- ".,-~:;=!*#$@"[N>0?N:0];}}/*#****!!-*/
- printf("\x1b[H");for(k=0;1761>k;k++)
- putchar(k%80?b[k]:10);A+=0.04;B+=
- 0.02;}}/*****####*******!!=;:~
- ~::==!!!**********!!!==::-
- .,~~;;;========;;;:~-.
- ..,--------,*/
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+g!p}g!i}g!i}g!h0g!g]g}
g0g!g}g`g!h<g+g!q]g!n`g!o
i0g!h}g!g}g!g]g`g0g]g`g0g
`g]g}g!g0g!g`h!gag]g!j0g(
g]g+g!i`j-g`h0g`h-g`k-g`
g.i-g]g(g.g(g!g|hg~h+g!q
}g]h+g!u]g0g";
for(i=28;l=ilu[i++];)
for(u=(*(ilu+++i)-((1<<6)
putchar(!((l-11)^(1<<5))?
}-->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:
Boa mlk ❤
Top meu mlk <3
Muito bom seu trabalho mano.
https://orangetechbr.blogspot.com.br
renatodemaracana1@gmail.com
Postar um comentário