8 Stimmen

Logik der '12 Tage von Weihnachten'

Hier ein bekanntes Beispiel für verschleierten Code in C, der den Text von "12 days of christmas" generiert. Ich habe versucht, die Logik des Codes herauszufinden, die erklärt, wie der Text tatsächlich gedruckt wird. Aber ich bin nicht in der Lage, das gleiche zu verstehen.

#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 i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

Kann mir jemand sagen, wo ich die Erklärung zu diesem Codeschnipsel finden kann?

9voto

Ronaldo Nazarea Punkte 356

Um Ihre Folgefrage an RedX zu beantworten, folgen Sie den Informationen auf dem obigen Link (siehe den vollständigen Reverse-Engineered-Code hier): http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/final.html ), führt es zur Dekodierung der Zeichenfolge Folgendes aus:

  1. Im Code gibt es 2 große Zeichenketten:

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

    y

    "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";
  2. Es verwendet die zweite Zeichenfolge, um das richtige Zeichen für die Anzeige zu finden (im Folgenden wird die zweite Zeichenfolge in 2 Zeilen formatiert)

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

    Beispiel: Das erste Zeichen in Zeichenfolge 1 ist @ . Ein Blick auf die zweite Zeichenfolge zeigt, dass "@" in der ersten Zeile mit "O" übereinstimmt. Wenn Sie die gleiche Logik anwenden, erhalten Sie @n'+,# = On the . Kurz gesagt, es versetzt die aktuelle Position um 31 ( printf("%c"), s[index]+31 )

  3. Der Hauptcode übergibt Zeichen aus Zeichenfolge 1, die dann mit dem obigen Algorithmus in eine englisch lesbare Zeichenfolge übersetzt wird. Wenn Sie dem Reverse-Engineering-Link gefolgt sind, gibt es einige Zeichenfolgen, die in allen Strophen konstant sind, z. B.: "On the " ... " von Weihnachten meine wahre Liebe zu mir geschickt". In der kodierten Zeichenfolge oben werden diese Zeichenfolgen durch das Zeichen "/" abgegrenzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X