Dieser Code druckt die Karte von Indien. Wie funktioniert es?
#include <stdio.h>
main()
{
int a,b,c;
int count = 1;
for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
Hq!WFs XDt!" [b+++21]; )
for(; a-- > 64 ; )
putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
return 0;
}
c
obfuscation
Narayanpatra
quelle
quelle
Antworten:
Die lange Zeichenfolge ist einfach eine in ASCII konvertierte Binärsequenz. Die erste
for
Anweisungb
beginnt bei 10, und[b+++21]
nachdem die Zeichenfolge 31 ergibt. Wenn Sie die Zeichenfolge als Array behandeln, ist Offset 31 der Beginn der "echten" Daten in der Zeichenfolge (die zweite Zeile im von Ihnen bereitgestellten Codebeispiel). Der Rest des Codes durchläuft einfach die Bitsequenz, konvertiert die Einsen und Nullen in! Und Leerzeichen und druckt jeweils ein Zeichen.Weniger verschleierte Version:
Der
seltsamkluge Teil ist in denputchar
Aussagen. Nimm den erstenputchar
. ASCII'Z'
ist eine Dezimalzahl von 90, also 90/9 = 10, was ein Zeilenumbruchzeichen ist. In der zweiten ist die Dezimalstelle 33 ASCII für'!'
. Wenn Sie das niederwertige Bit von 33 umschalten, erhalten Sie 32, was für ein Leerzeichen ASCII ist. Dies führt!
dazu, dass gedruckt wird, wenn diesb
ungerade ist, und dass ein Leerzeichen gedruckt wird, wennb
es gerade ist. Der Rest des Codes ist einfach da, um den "Zeiger"a
durch die Zeichenfolge zu führen.quelle
Grundsätzlich handelt es sich bei der Zeichenfolge um eine Lauflängencodierung des Bildes: Wechselnde Zeichen in der Zeichenfolge geben an, wie oft ein Leerzeichen und wie oft nacheinander ein Ausrufezeichen gezeichnet werden soll. Hier ist eine Analyse der verschiedenen Elemente dieses Programms:
Die codierte Zeichenfolge
Die ersten 31 Zeichen dieser Zeichenfolge werden ignoriert. Der Rest enthält Anweisungen zum Zeichnen des Bildes. Die einzelnen Zeichen bestimmen, wie viele Leerzeichen oder Ausrufezeichen nacheinander gezeichnet werden sollen.
Außen für Schleife
Diese Schleife geht über die Zeichen in der Zeichenfolge. Jede Iteration erhöht den Wert von
b
um eins und weist das nächste Zeichen in der Zeichenfolge zua
.Innen für Schleife
Diese Schleife zeichnet einzelne Zeichen und eine neue Zeile, wenn sie das Zeilenende erreicht. Die Anzahl der gezeichneten Zeichen beträgt
a - 64
. Der Wert vonc
geht von 10 auf 90 und wird auf 10 zurückgesetzt, wenn das Zeilenende erreicht ist.Das
putchar
Dies kann wie folgt umgeschrieben werden:
Es zeichnet das entsprechende Zeichen, je nachdem, ob
b
gerade oder ungerade ist, oder bei Bedarf eine neue Zeile.quelle
b
beginnt um 10 und der Index ist(b++)+21
, der um 31 beginnt.