2012-11-08 6 views
5

Oto dobrze znany przykład zaciemnionego kodu w C generujący tekst "12 dni świąt Bożego Narodzenia". Próbowałem obliczyć logikę kodu, która wyjaśnia, w jaki sposób drukowany jest tekst. Ale nie jestem w stanie zrozumieć tego samego.Logika '12 dni świąt Bożego Narodzenia '

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

Czy ktoś może mi pomóc, gdzie mogę znaleźć objaśnienie tego fragmentu kodu?

Odpowiedz

5

Aby odpowiedzieć na kolejne pytanie do RedX, zgodnie z informacjami na link powyżej (patrz kompletnego odwrotnej inżynierii kod tutaj: http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/final.html), wykonuje następujące czynności, aby zdekodować ciąg:

  1. są 2 duże sznurki w kodzie:

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

    i

    "!ek;dc [email protected]'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"; 
    
  2. wykorzystuje drugi ciąg odnośnika właściwy znak do wyświetlania (A następnie drugi ciąg sformatowane do 2 rzędów)

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

    przykład: pierwszy znak łańcucha 1 jest @. Patrząc na drugi ciąg, "@" w pierwszym rzędzie pokrywa się z "O". Kontynuując tę ​​samą logikę, otrzymasz @n'+,# = On the. W skrócie przesuwa on aktualną pozycję o 31 (printf("%c"), s[index]+31)

  3. Główny kod przekazuje znaki z ciągu 1, a następnie jest tłumaczony na ciąg tekstowy w języku angielskim, korzystając z powyższego algorytmu. Jeśli podążyliście za linkiem do inżynierii wstecznej, są pewne ciągi, które są stałe we wszystkich wersetach, np. "Na" ... "świąt Bożego Narodzenia moja prawdziwa miłość wysłana do mnie". W powyższym zakodowanym łańcuchu ciągi te są rozdzielane znakiem "/".

+0

Link, który wysłałeś, jest martwy. – Kapocsi