2009-04-07 5 views
15

Le code C obfusqué suivant imprime les mots à "12 jours de Noël". J'essayais de comprendre comment cela fonctionnait. Je suis fondamentalement complètement perdu. Quelle est la signification des trois arguments non typés à main dans l'appel initial, la série de caractères après le premier retour, les arguments numériques négatifs aux appels à main? Eek! Je le fais en pensant peut-être que je vais apprendre quelques coins intéressants du langage C, donc les réponses dans ce sens sont les plus bienvenus.Trois arguments à la main, et d'autres astuces obfuscating

#include <stdio.h> 
main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_, 
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? 
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t, 
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#\ 
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \ 
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \ 
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \ 
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ 
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \ 
}'+}##(!!/") 
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1) 
    :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a, 
"!ek;dc [email protected]'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);} 
+0

Cela vient-il de l'IOCCC? – Zifre

+0

Je ne me souviens pas où je l'ai trouvé. Pardon. – Leonard

+1

Oui, c'est de la ioccc: http://www.ioccc.org/1988/phillipps.c –

Répondre

12

Quelqu'un est déjà parti et a inversé ceci: http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/. Lis juste ça. Ça va expliquer comment tout cela fonctionne.

+0

Un couple de caractères de cette ligne d'ouverture, la recherche sur le Web, Wikipedia, et je me suis retrouvé dans le même article. +1 – gbarry

+0

@gbarry: La même approche m'a conduit à http://udel.edu/~mm/xmas/ –

1

Certains systèmes Unix ne passent pas seulement le nombre d'arguments et les arguments principaux, mais aussi un vecteur pour l'environnement (voir http://en.wikipedia.org/wiki/Main_function_(programming)). Je suis assez sûr que c'est ce que cet exemple obfusqué attendait.

Je ne pense pas que vous pouvez apprendre beaucoup de ce code obfusqué. C'était probablement un concurrent du obfuscated c contest.

Questions connexes