2012-11-08 34 views
5

以下是C中生成歌詞'12天聖誕節'的混淆代碼的衆所周知的例子。我試圖找出代碼的邏輯來解釋文本的實際印刷方式。但我無法理解這一點。「12天聖誕節」的邏輯

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

任何人都可以引導我在哪裏可以找到這段代碼片段的解釋?

回答

5

要回答你的後續問題RedX,上面的鏈接的信息,(請參考這裏的完整的逆向工程代碼:http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/final.html),它會執行以下字符串解碼:

  1. 有2個大串代碼:

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

    "!ek;dc [email protected]'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"; 
    
  2. 它使用第二串來查找正確的字符,以顯示(以下是格式化成2行中的第二字符串)

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

    示例:在串1的第一個字符是@。查看第二個字符串,第一行的'@'與'O'對齊。繼續相同的邏輯,你會得到@n'+,# = On the。總之,它將當前位置偏移31(printf("%c"), s[index]+31

  3. 主代碼傳遞字符串1中的字符,然後使用上述算法將其轉換爲英文可讀字符串。如果你遵循了反向工程的鏈接,那麼在所有經文中都會有一些字符串是不變的,例如:「在聖誕節的」......「我發給我的真愛。在上面的編碼字符串中,這些字符串由'/'字符分隔。

+0

您發佈的鏈接已死亡。 – Kapocsi