PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer kann mir folgendes C-Programm erklären:



Import-Script
30.12.2002, 17:04
#include &#60;stdio.h&#62; <BR>main&#40;t,_,a&#41;char &#42;a;{return!0&#60;t?t&#60;3?main&#40;-79,-13,a&#43;main&#40;-87,1-_, <BR>main&#40;-86,0,a&#43;1&#41;&#43;a&#41;&#41;:1,t&#60;_?main&#40;t&#43;1,_,a&#41;:3,main&#40;-94,-27&#43;t,a&#41;&amp;&amp;t==2?_&#60;13? <BR>main&#40;2,_&#43;1,&#34;%s %d %d&#92;n&#34;&#41;:9:16:t&#60;0?t&#60;-72?main&#40;_,t, <BR>&#34;@n&#39;&#43;,#&#39;/&#42;{}w&#43;/w#cdnr/&#43;,{}r/&#42;de}&#43;,/&#42;{&#42;&#43;,/w{%&#43;,/w#q#n&#43;,/#{l&#43;,/n{n&#43;,/&#43;#n&#43;,/#&#92; <BR>;#q#n&#43;,/&#43;k#;&#42;&#43;,/&#39;r :&#39;d&#42;&#39;3,}{w&#43;K w&#39;K:&#39;&#43;}e#&#39;;dq#&#39;l &#92; <BR>q#&#39;&#43;d&#39;K#!/&#43;k#;q#&#39;r}eKK#}w&#39;r}eKK{nl]&#39;/#;#q#n&#39;&#41;{&#41;#}w&#39;&#41;{&#41;{nl]&#39;/&#43;#n&#39;;d}rw&#39; i;# &#92; <BR>&#41;{nl]!/n{n#&#39;; r{#w&#39;r nc{nl]&#39;/#{l,&#43;&#39;K {rw&#39; iK{;[{nl]&#39;/w#q#n&#39;wk nw&#39; &#92; <BR>iwk{KK{nl]!/w{%&#39;l##w#&#39; i; :{nl]&#39;/&#42;{q#&#39;ld;r&#39;}{nlwb!/&#42;de}&#39;c &#92; <BR>;;{nl&#39;-{}rw]&#39;/&#43;,}##&#39;&#42;}#nc,&#39;,#nw]&#39;/&#43;kd&#39;&#43;e}&#43;;#&#39;rdq#w! nr&#39;/ &#39;&#41; }&#43;}{rl#&#39;{n&#39; &#39;&#41;# &#92; <BR>}&#39;&#43;}##&#40;!!/&#34;&#41; <BR>:t&#60;-50?_==&#42;a?putchar&#40;31[a]&#41;:main&#40;-65,_,a&#43;1&#41;:main&#40;&#40;&#42;a==&#39;/&#39;&#41;&#43;t,_,a&#43;1&#41; <BR> :0&#60;t?main&#40;2,2,&#34;%s&#34;&#41;:&#42;a==&#39;/&#39;||main&#40;0,main&#40;-61,&#42;a, <BR>&#34;!ek;dc <a href="mailto:i@bK">i@bK</a>&#39;&#40;q&#41;-[w]&#42;%n&#43;r3#l,{}:&#92;nuwloca-O;m .vpbks,fxntdCeghiry&#34;&#41;,a&#43;1&#41;;} <BR> <BR>// Dieses Programm funzt tatsächlich!!! <BR>// Aber wie kommt die Ausgabe zustande??? <BR>//Hilfe!!! <BR><!--attachment: obfs-5554.txt*mime_txt.gif*text/plain*0.8**obfs%2ec --><center><table border=1><tr><td><img src="http://progshop.com/elektronik/diskussion/icons/mime_txt.gif" align=left alt="text/plain"><br><a href="http://progshop.com/elektronik/diskussion/messages/987/obfs-5554.txt" target="_blank"><b>obfs.c</b></a> (0.8 k)</td></tr></table></center><!--/attachment-->

Import-Script
06.01.2003, 10:43
Äääh, <BR>compiliert wird&#39;s &#40;VC&#41;. Macht auch eine sinnvolle Ausgabe. Aber verstehen tu ich&#39;s nicht!

Import-Script
06.01.2003, 13:05
Versuch mal, nicht alles zu verstehen, Das macht das Leben leichter, ehrlich!

Import-Script
15.01.2003, 21:11
Ich habs zuerst auch nicht geglaubt, aber es lässt sich tatsächlich kompilieren. Habs zuerst im Borland C&#43;&#43; 4 gemacht, das hat eine Menge Errors und Warnings ausgegeben &#40;zB ist <BR> <BR>main&#40;t,_,a&#41;char &#42;a; <BR> <BR>eine veraltete Funktionsdefinition oder so... <BR>In einem anderen, Uralt-C-Compiler in Dos &#40;auch von Borland&#41; hat es aber tatsächlich funktioniert. <BR>Nur blöd, dass man das Programm mittels Strg-Alt-Entf beenden muss. Hab aber leider auch keine Ahnung, wie so ein Programm funktioniert.

Import-Script
16.01.2003, 14:23
Also bei mir terminiert es normal in der DOS-Box von Win-NT. <BR> <BR>Ich habs mit Borland C&#43;&#43; 3.1 &uuml;bersetzt, es gab nur 14 Warnungen. <BR> <BR> <BR>Zur Funktion: <BR> <BR>Das main&#40;&#41; ruft sich rekursiv selber auf. <BR>Wenn man sich die Texte genauer ansieht, stellt man fest, daß sie nur aus verschieden großen Teilst&uuml;cken des letzten Textes bestehen. Und dieser ist nur etwas veschl&uuml;sselt. <BR> <BR>Wie genau die Entschl&uuml;sselung erfolgt, habe ich mir jetzt nicht näher angesehen. Das Programm ist ja wirklich schlecht lesbar. <BR> <BR> <BR>Peter <BR>

Import-Script
16.01.2003, 18:29
Hi, <BR>wie Peter schon gesagt hat ruft sich das Programm selber auf. Der einzige richtig lesbare befehl ist putchar. Dadurch wird ein Buchstabe auf dem Bildschirm geschrieben. <BR>Soweit die gesicherten Erkentnisse. Den rest kann ich mir nur zusammenreimen: <BR> <BR>Dem main wird jedes mal einige Parameter &uuml;bergeben. Dadurch wird jede Zeile, wort der Zeile und Strophe gezählt. Anhand der Zeilen- und Strophennummer werden die Zahlen ausgegeben. Wenn ich das richtig sehe, ähnelt das Programm einer rekursiven Routine zur Berechnung eines Pascalschen Dreiecks. Nur werden hier Wörter ausgegeben und nicht Zahlen Berechnet. <BR>&#42;a scheint eine Globale variable zu sein, auf die jede Instanz zugreifen kann. &#42;a enthält anscheinend das Zeichenwirrwar, in dem die Wörter codiert sind. Die Codierung schint einfach nur eine Subtraktion von 31 zu sein. Die &#34;sinnvollen&#34; Buchstaben des ASCII-Codes beginen mit 65 &#40;&#39;A&#39;&#41;. <BR>ich habe es noch nicht probiert, aber wenn man die Zeichen mit 31 addiert, sollten die einzelnen Wortfetzen sichtbar werden. <BR> <BR>Offensichtlich ruft sich das Programm 175 mal auf. Die Variable ist vom Typ char &#40;255 max&#41;. -50 entspricht dann einem unsigned char von 175. <BR>Berechnungen können auch in Parameter&uuml;bergaben durchgef&uuml;hrt werden. <BR>Klassisches Beispiel ist <BR><font color="0000ff">printf&#40;&#34;Hallo %i&#34;,&#43;&#43;n&#41;;</font> <BR>n wird inkrementiert und der Ausdruck nimmt n&#43;1 an. Wenn n 10 ist, dann ist die Ausgabe &#34;Hallo 11&#34; und n hat anschließend den Wert 11. <BR>Auf diese Weise sind die ganzen Berechnungen versteckt. <BR>Vergleiche funktionieren auch außerhalb von <b>if</b>-Anweisungen. <BR>main&#40;&#40;&#42;a==&#39;/&#39;&#41;&#43;t,_,a&#43;1&#41; <BR><font color="0000ff">&#42;a==&#39;/&#39;</font> <BR>nimmt true &#40;-1, also 255&#41; an, wenn der pointer &#42;a auf ein &#39;/&#39; zeigt. dem Main wir dann entweder eine 0 oder eine 255 &uuml;bergeben. <BR>Was die Fragezeichen bewirken weiß ich nicht. <BR> <BR>So, ganz genau weiß ich nicht, ob ich richtig vermute. Werde mir das ganze mal mit Borland&#39;s BCB debuggen. &#40;BCB akzeptiert das ganze mit nur einer Warnung, wenn man die richtigen Projektoptionen wählt&#41;. <BR> <BR>Die variable &#42;a scheint &uuml;brigens irgendwie statisch zu werden. D.H. sie kann auf das programm selber zeigen. In C werden alle Strings, die durch &#34;&#34; erzeugt werden an das Programm angehängt und ein Zeiger darauf erzeugt. Wenn Die Variable statisch ist, dann wird die Segmentadresse automatisch auf das Programm zeigen. Die Variable, die den Pointer bildet speichert einfach nur die Offsetadresse. <BR>Im DOS kann man diese &#34;festen&#34; Strings &uuml;bigens manipulieren. Unter Win95&#43; wird man bestraft. <BR> <BR>Gruß <BR>Elmar

Import-Script
19.01.2003, 21:56
Das ist nett

Import-Script
30.01.2003, 13:36
Sag ich ja!