2012-11-08 39 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