2012-11-08 13 views
5

Ecco l'esempio ben noto di codice offuscato in C che genera testi di "12 giorni di natale". Ho cercato di capire la logica del codice che spiega come effettivamente il testo viene stampato. Ma non sono in grado di capire lo stesso.Logica di '12 giorni di natale '

#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); 
} 

Qualcuno può guidarmi dove posso trovare la spiegazione di questo snippet di codice?

risposta

5

Per rispondere alla tua domanda di follow-up a RedX, seguendo le informazioni sul link qui sopra, (fare riferimento al codice completo reverse-engineered qui: http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/final.html), esegue il seguente per decodificare la stringa:

  1. ci sono 2 grandi stringhe nel codice:

    "@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' ')# \ 
    }'+}##(!!/"; 
    

    e

    "!ek;dc [email protected]'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"; 
    
  2. utilizza la seconda stringa di ricercare il carattere corretto per visualizzare (il seguente è la seconda stringa formattata in 2 righe)

    !ek;dc [email protected]'(q)-[w]*%n+r3#l,{}: 
    nuwloca-O;m .vpbks,fxntdCeghiry 
    

    Esempio: Il primo carattere corda 1 è @. Cercando sulla seconda stringa, '@' sulla prima riga si allinea con 'O'. Continuando nella stessa logica, riceverai @n'+,# = On the. In breve, compensa la posizione corrente per 31 (printf("%c"), s[index]+31)

  3. Il codice principale passa i caratteri dalla stringa 1 e quindi viene convertito in stringa leggibile in inglese utilizzando l'algoritmo di cui sopra. Se hai seguito il collegamento del reverse engineering, ci sono alcune stringhe che sono costanti in tutti i versi, ad esempio: "Sul" ... "di Natale il mio vero amore mi ha mandato". Nella stringa codificata sopra, queste stringhe sono delimitate dal carattere '/'.

+0

Il link che hai postato è morto. – Kapocsi

Problemi correlati