Adressen-Probleme... - Druckversion +- Home of Gamehacking - Archiv (http://archiv-homeofgamehacking.de) +-- Forum: Gamehacking (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=3) +--- Forum: Gamehacking (http://archiv-homeofgamehacking.de/forumdisplay.php?fid=6) +--- Thema: Adressen-Probleme... (/showthread.php?tid=913) |
||||||||
RE: Adressen-Probleme... - FPS-Player - 17.07.2012 Moin. So, nach langer Zeit wollte ich mich mal wieder an CE versuchen und hab mit "Just Cause 2" einen geeigneten Kandidaten ausgesucht - mit dem Ergebnis, welches ich schon oben beschrieben habe - das Spiel stürzt ab, sobal ich "what writes/accesses to this adress" anklicke. Da ich nun die Schnauze von CE voll habe, habe ich mich dem Programm "ArtMoney" zugewandt. Im Prinzip ist es (wenn man schon CE "kennt") selbsterklärend. Ich habe meine Adresse(n) im Alleingang gefunden (*stolz ist!*) und will nun nach dem Pointer suchen. Das Gute: das Spiel stürzt nicht ab! Das weniger Gute: ich habe mich versucht, an diese Anleitung hier zu halten, komme aber leider mit der Erklärung dort nicht richtig zurecht. Ich bin soweit gekommen, das ich "pointer to beginning of memory block" anklicke... Ok. Im Programm steht, ich soll nun so lange Filtern, bis ich meine gesuchte Adresse habe. Wenn ich nun aber im Spiel den Wert ändere und ich dann auf "Filtern" gehe, weiß ich schon nicht mehr, was ich nun eintragen muß, denn dort steht "Benutzerdefiniert" und "Pointer-Wert", usw. - und diese Werte kenne/weiß ich ja nicht. In der Anleitung steht, man soll vor dem erneuten Filtern das Spiel beenden, neu starten und wieder zu seinem Ausgangspunkt (also zu der gefundenen Adresse) zurückkehren, was aber ja nicht geht, da sie sich ja bei Neustart verändert...Pointer halt... :s So, und nun hoffe ich, das sich einer von euch auch mit ArtMoney auskennt und mir helfen kann. Es ist komischerweise keine deutsche ausführliche (Schritt-für-Schritt)-Anleitung zu finden. Habt ihr da Erfahrungen und könnt mir helfen? RE: Adressen-Probleme... - iNvIcTUs oRCuS - 17.07.2012 (17.07.2012, 22:36)FPS-Player schrieb: ...mit dem Ergebnis, welches ich schon oben beschrieben habe - das Spiel stürzt ab, sobal ich "what writes/accesses to this adress" anklicke.... Nutzt Du nen Keks oder versucht Du das Ganze an Hand des Originals? EDIT// Just Cause wollte ich schon immer mal probieren... Vielleicht schau ich mir das mal an... RE: Adressen-Probleme... - FPS-Player - 18.07.2012 (17.07.2012, 23:59)sILeNt heLLsCrEAm schrieb: Nutzt Du nen Keks oder versucht Du das Ganze an Hand des Originals?Ja, mit Keks...stimmt, daran hab ich gar nicht gedacht. Das wird wahrscheinlich sein. Allerdings gehts so ein bis zwei Mal gut, aber dann schmierts ab. Nur bei ArtMoney stürzt es komischerweise nicht ab... Zitat:EDIT//Ok, Trainer gibt es für JC2 wie Sand am Meer, aber keinen (funktionierenden) für dieses "Minigame", bei dem man diese Codes eingeben muß, um etwas zu hacken. Leider bin ich tatsächlich (und das heißt bei mir schon was ) zu langsam! Wobei die Anzahl der Ziffern, die man eingeben muß, ist schon recht lang und die Zeitspanne dafür sehr kurz Klar, schau es dir mal an (falls du tatsächlich einen machen solltest, dann würden mich Health, Ammo/NoReload, Money und der (ich weiß nicht, wie der richtig heißt) Mission Timer interessieren [es gibt zwei: einmal für den Code und einmal für die Agentur-Missionen - beide wäre schön]). Dennoch würde ich mich selbst gerne nochmal daran probieren. Wenn also jemand was zu ArtMoney erzählen kann...? RE: Adressen-Probleme... - iNvIcTUs oRCuS - 19.07.2012 Also so wie's aussieht hat das Spiel was dagegen wenn man den Debugger aufschaltet und Breakpoints setzt. Dabei spielts keine Rolle ob es sich um Memory Breakpoints oder Hardware Breakpoints handelt. Und dieser Cheat Schutz ist auch im Keks von Skidrow noch enthalten... Ferner glaub ich das Du da so auf die schnelle keinen brauchbaren Pointer findest. Aber - eine Code Injection ist hier definitiv auch eine einfache Lösung. Original Code: [code=ASM]JustCause2.exe+4103F0 - F3 0F11 46 40 - movss [esi+40],xmm0[/code] Sprung zur Codecave: [code=ASM]JustCause2.exe+4103F0 - E9 F88F1400 - jmp JustCause2.exe+5593ED[/code] Codecave: [code=ASM]JustCause2.exe+5593ED - F3 0F10 46 44 - movss xmm0,[esi+44] JustCause2.exe+5593F2 - F3 0F11 46 40 - movss [esi+40],xmm0 JustCause2.exe+5593F7 - E9 F96FEBFF - jmp JustCause2.exe+4103F5 JustCause2.exe+5593FC - 90 - nop[/code] Und das war schon der Ganze Zauber... Im FPU Register XMM0 steht der aktuelle Zeitwert. Dieser wird in die entsprechende Adresse [ESI+0x40h] geschrieben. Und an Adresse [ESI+0x44h] steht der maximale/volle Zeitwert... Diesen vollen Zeitwert lasse ich quasi ins XMM0 Register schreiben, dann wird der Originalcode ausgeführt der durch den Jump zur Codecave überschrieben wird. Und letztenendes wird wieder raus aus der Codecave gesprungen zum weiteren Programmablauf. grEEtZ sILeNt heLLsCrEAm RE: Adressen-Probleme... - iNvIcTUs oRCuS - 20.07.2012 So Cheats sind soweit im Kasten. Fehlt mir nur noch der Missions Timer Cheat. Bin aber noch nicht so weit das ich diesen zur Verfügung habe... Habe momentan nur die erste Festung eingenommen... RE: Adressen-Probleme... - FPS-Player - 22.07.2012 Danke Silent für deine Mühe Sorry, das ihr euch mit so einem Noob rumschlagen müsst, aber ich möchte das gerne wissen/draufkriegen - das kann doch nicht so schwer sein...? Ich danke euch, das ihr mir bis jetzt so geduldig geholfen habt und ich hoffe, das ihr mir jetzt auch noch zur Seite stehen könnt/wollt. Denn ich möchte gerne auf das obige explizit eingehen. Leider bin ich noch nicht so weit, das oben stehende zu kapieren, wie ich gerade feststelle :( Und ich glaube, dort liegt mein Hauptproblem. Deswegen "schreie" ich ja immer nach einer Step-by-Step-Anleitung Also, ich weiß, wie ich Adressen/Werte finde und ich weiß auch (theoretisch - wenn ich es denn mal hinbekomme und das Spiel nicht abstürzt), wie ich Pointer finde. Aber da hört es dann auf. Mir fehlt einfach das Wissen/Verständnis um von meiner ermittelten Adresse/Pointer zur Code Injection/Codecave zu kommen. Daher zerflücke ich jetzt einfach mal deine Codes um für mich persönlich die ganze Sache zu verstehen... Also dies hier: Code:
ist mir soweit klar, das bekomme ich ja, wenn ich den gefunden Wert/die Adresse (nicht den Pointer!) doppelt anklicke, bzw. mir das als Hexadezimalwert(e) anzeigen lasse. Das habe ich auch schon mal trainingshalber gemacht. Soweit eigentlich klar. Code:
Wo steht das, wie komme ich da ran und vor allem: was genau bedeutet das? Code:
? Code:
Also der Sprung auf die Adresse, die bspw. die Munition bei Benutzung abzieht. RE: Adressen-Probleme... - iNvIcTUs oRCuS - 22.07.2012 Irgendwie scheint mir das Du dich zu sehr auf Pointer fixiert hast?!? Von diesem Gedanken solltest Du dich ganz schnell trennen, denn nicht immer ist ein Spiel nur mit Pointern zu bescheißen... In erster Linie solltest Du Dir auch das Codecave Tutorial von Acubra zu Gemüte führen... Das findest Du HIER Bei diesem Code gibts nichts auseinanderzupflücken... [code=ASM]JustCause2.exe+4103F0 - F3 0F11 46 40 - movss [esi+40],xmm0[/code] Der erste Teil beschreibt die Position wo diese Anweisung zu finden ist. Und da sehen wir das diese Anweisung in der "JustCause2.exe" an Adresse "JustCause2.exe+4103F0" zu finden ist. Und da die Basisadresse der EXE Datei im Speicher immer diesselbe ist, nämlich 0x400000h, so könnte ich auch statt "JustCause2.exe+4103F0" auch einfach nur "008103F0" schreiben. Weil, wenn ich zur Basisadresse von 0x400000h den Wert 0x4203F0h addiere ich eben den HEX Wert 008103F0 erhalte. Die darauffolgenden Bytes sind die sogenannten Opcodes. Laienhaft ausgedrückt, das was der Computer versteht. Und da sich solche Bytefolgen schlecht merken lassen hat Gott den Dissassembler erfunden der diese Bytefolgen in verständliche Befehle umwandelt und wir bzw. ein Programmierer oder auch Cracker weiß was hier für Anweisungen über den Bildschirm flimmern. Nur mal so am Rande und rein zur Info... Eine relativ Bekannte ASM Library ist die BEA Engine. Diese gibts z.B. hier. Die XMM Register wurden damals von Intel eingeführt. Allen bekannt dürfte ja wohl das Kürzel SSE sein. Welches damals erstmals beim Pentium III eingeführt wurde. Insgesamt standen nun 8 128-Bit Register zur Verfügung, also die Register von XMM0 bis hin zum Register XMM7. Später wurden diese nochmals erweitert. Mit der Anweisung "movss [esi+40], xmm0" wird also eine Gleitkommazahl aus dem XMM0 Register in den Speicher an Adresse [ESI+40] kopiert. Wenn jetzt z.B. ESI den Wert 0x400400h enthält dann wird also der Wert des Registers in den Speicher an Adresse 0x400400h + 0x40h = 0x400440h kopiert. Der zusammengerechnete Wert von [ESI+40] ist in diesem Falle die Adresse die den Wert des Timers enthält. Also quasi wieviel Zeit wir noch haben bevor das Minigame als gescheitert gilt. Wenn also diese Adresse z.B. die "16BF06A2" ist, dann kann man auch zurückrechnen welcher Wert in ESI stehen muss. Wir ziehen also von dieser Timeradresse den Wert 0x40h ab. Also muss im ESI Register der Hexadezimale Wert "16BF0662" stehen. Nun ist aber auch erstmal viel interessanter die Frage was wir eigentlich mit einer Codecave erreichen wollen? Oder anders gesagt, was bringt uns eine Codecave für Vorteile, zu welchem Zweck dient sie und bzw. oder warum sind wir darauf angewiesen??? In erster Linie muss amn sich vor Augen halten das dass was wir mit einer Codecave versuchen zu bezwecken vom Spiel so nicht vorgesehen ist. Und mit einer Codecave wollen wir ja auf gut Deutsch bescheißen und das erfordert meist eine Reihe von Befehlen die wir so im herkömmlichen Programmcode an besagten Stellen nicht unterbringen weil ganz einfach der Platz dazu nicht ausreicht. Die Anweisung die unsere Timer Adresse beschreibt ist genau 5 Bytes groß bzw. lang. Und unser reiner Cheatcode ist im Endeffekt 10 Bytes lang... [code=ASM]F3 0F 10 46 44 - movss xmm0,[esi+44] F3 0F 11 46 40 - movss [esi+40],xmm0[/code] Also muss eben eine Codecave her. Und da wir durch den Sprung zu dieser Codecave den Originalcode "movss [esi+40],xmm0" überschreiben da können wir uns diesen auch gleich zu unseren Zwecken ausnutzen. Und da wir vom normalen Programmablauf zu unserer Codecave springen müssen wir natürlich von dieser Codecave auch wieder in den normalen Programmablauf wieder zurückspringen. Die Codecave musst Du dir folgendermaßen vor Augen halten. Wenn das Spiel in seinem Ablauf, also die Spielfigur z.B. grade ne Bombe entschärft, an Adresse 008103F0 kommt dann führen wir nicht den normalen Code aus (also das die Zeit abläuft), sondern wir springen zur Codecave. Und das wird durch den Sprungbefehl "jmp JustCause2.exe+5593ED" erreicht. Das heißt wiederrum das dass Spiel dann unsere Codecave durchläuft. Und wie ich da bereits sagte wird in [ESI+40], was unsere Timer Adresse ist, immer wieder der Wert des XMM0 Registers kopiert. Die Zeit nimmt also ab. Aber direkt neben der Adresse des tatsächlichen Zeitwertes befindet sich auch die Adresse mit dem maximalen Zeitwert bzw. dem Zeitwert bei vollem Balken. Also... [ESI+40] = Tatsächlicher Zeitwert Timer Adresse + 4 Bytes = Maximaler Zeitwert Man könnte das auch so schreiben [ESI+40+4] aber [ESI+44] ist ja dasselbe Und mit dem Befehl "movss xmm0,[esi+44]" kopieren wir immer den maximal möglichen Zeitwert in das XMM0 Register. Und dort alleine nützt der uns nix also müssen wir das Spiel dazu bringen das es immer nur diesen Wert an der Adresse für den tatsächlichen Zeitwert hat. Das realisieren wir dann mit dem Befehl, welches auch der Originalcode ist, "movss [esi+40],xmm0". Vereinfacht ausgedrückt sieht das im Spiel dann so aus wenn die Spielfigur eine Bombe entschärft der Balken, der der zur Verfügung stehenden Zeit entspricht, nicht mehr abnimmt. Das wichtigste aber ist noch der Rücksprung, aus der Codecave zum weiteren Spielablauf. Das heißt wir müssen eine Zeile weiter im Code springen wo wir den Sprung zu unserer Codecave gemacht haben. Der Sprung zur Codecave war an Adresse "JustCause2.exe+4103F0", oder anders geschrieben an Adresse "008103F0". Da der Sprung, genauso wie der Originalcode, 5 Bytes lang/groß ist addieren wir zu dieser Adresse 5 Bytes hinzu. Also müssen wir zu Adresse "JustCause2.exe+4103F5", oder anders geschrieben zu Adresse "008103F5" zurückspringen. Noch etwas zum Abschluss... Eine Codecave ist kein vordefinierter Bereich innerhalb des Speichers. Eine Codecave befindet sich immer innerhalb des Spiels zur Verfügung stehenden Speichers. Dies kann feststehender Speicher innerhalb des Moduls sein, also der EXE. Oder man stellt dem Spiel Speicher zur Verfügung so das es diesen nutzen kann. Und genau das macht Cheat Engine mit dem Befehl oder der Option "Allocate Memory". Weiterhin darf sich aber die Codecave nicht innerhalb eines Bereiches befinden der vom Spiel explizit gebraucht wird. Bestes Beispiel z.B. da wo sich der Originalcode befindet. Würde man da wild eine Codeinjection schreiben stürzt das Spiel unweigerlich ab weil es Daten bekommt die es nicht erwartet. Die Register kriegen falsche Werte, der Stack wird durcheinander gewürfelt. Letzenendes stimmt der komplette Programmablauf nicht mehr. Aber eines muss man auch dazu sagen... Die oben gezeigte Codecave ist noch die einfachste Form. Sowas gibts noch viel komplexer und umfangreicher... RE: Adressen-Probleme... - FPS-Player - 22.07.2012 Heiliger Odin! :exclamation: Danke für die ausführliche Antwort. Ok, das meiste habe ich vom schematischen Ablauf her verstanden. (22.07.2012, 20:21)sILeNt heLLsCrEAm schrieb: Irgendwie scheint mir das Du dich zu sehr auf Pointer fixiert hast?!?Hähä, ich kenne mich nicht mal gut genug damit aus, um irgendwas draus zu machen Zitat:In erster Linie solltest Du Dir auch das Codecave Tutorial von Acubra zu Gemüte führen... Das findest Du HIER Ja, danke, das hatte ich mir schon mal angesehen und auch begriffen, wie die Funktion einer Codecave ist/wie sie funktioniert. Zitat:Bei diesem Code gibts nichts auseinanderzupflücken...Aha! Das habe ich verstanden. Gilt denn die Basisadresse 0x400000h nur für Just cause 2 oder generell für jedes Spiel? Zitat:Mit der Anweisung "movss [esi+40], xmm0" wird also eine Gleitkommazahl aus dem XMM0 Register in den Speicher an Adresse [ESI+40] kopiert. Wenn jetzt z.B. ESI den Wert 0x400400h enthält dann wird also der Wert des Registers in den Speicher an Adresse 0x400400h + 0x40h = 0x400440h kopiert. Ok, das habe ich "technisch" auch verstanden. Ob ich es auch selbst umsetzen kann (bei anderen Spielen) ist eine andere Geschichte...aber das muß ich halt lernen. Zitat:Die Anweisung die unsere Timer Adresse beschreibt ist genau 5 Bytes groß bzw. lang. Und unser reiner Cheatcode ist im Endeffekt 10 Bytes lang...Halt! Überschreiben können wir den Code ja nicht, da sonst das Spiel abschmiert. Du meinst sicherlich, das wir sozusagen einen Bypass zu diesem Code legen - unsere Codecave...oder? Zitat:Und wie ich da bereits sagte wird in [ESI+40], was unsere Timer Adresse ist, immer wieder der Wert des XMM0 Registers kopiert. Die Zeit nimmt also ab. Aber direkt neben der Adresse des tatsächlichen Zeitwertes befindet sich auch die Adresse mit dem maximalen Zeitwert bzw. dem Zeitwert bei vollem Balken.Ah, also wäre - nur zur Verdeutlichung - der Timer, bzw. die Adresse [ESI+30] --> sprich ablaufende Zeit, müsste ich, wenn ich den max. Zeitwert einstellen wollte immer (also in jedem Fall/Spiel) 4 Bytes dazurechnen, so das ich dann auf [ESI+30+4] käme, also [ESI+34], richtig? Zitat:Und mit dem Befehl "movss xmm0,[esi+44]" kopieren wir immer den maximal möglichen Zeitwert in das XMM0 Register. Und dort alleine nützt der uns nix also müssen wir das Spiel dazu bringen das es immer nur diesen Wert an der Adresse für den tatsächlichen Zeitwert hat. Das realisieren wir dann mit dem Befehl, welches auch der Originalcode ist, "movss [esi+40],xmm0". Verstehe. Das Spiel geht zwar ganz normal auf den Wert des Timers "movss [esi+40],xmm0", welcher aber im Prinzip eine Codezeile weiter durch unseren max. Zeitwert wieder zurückgesetzt wird. Also fängt er quasi immer wieder neu an zu zählen... Zitat:Der Sprung zur Codecave war an Adresse "JustCause2.exe+4103F0", oder anders geschrieben an Adresse "008103F0". Da der Sprung, genauso wie der Originalcode, 5 Bytes lang/groß ist addieren wir zu dieser Adresse 5 Bytes hinzu. Also müssen wir zu Adresse "JustCause2.exe+4103F5", oder anders geschrieben zu Adresse "008103F5" zurückspringen. Ok, auch verstanden! Aber woher weiß ich, das der Originalcode 5 Bytes groß war/ist? Zitat:Noch etwas zum Abschluss... Eine Codecave ist kein vordefinierter Bereich innerhalb des Speichers. Eine Codecave befindet sich immer innerhalb des Spiels zur Verfügung stehenden Speichers. Dies kann feststehender Speicher innerhalb des Moduls sein, also der EXE. Oder man stellt dem Spiel Speicher zur Verfügung so das es diesen nutzen kann. Und genau das macht Cheat Engine mit dem Befehl oder der Option "Allocate Memory". Weiterhin darf sich aber die Codecave nicht innerhalb eines Bereiches befinden der vom Spiel explizit gebraucht wird.Klar, ich lagere also quasi meinen Code in einen ungenutzen, freien Speicherbereich aus und muß dem Originacode halt nur sagen, wo er unsere eingebaute Umleitung findet. "Springe ab Zeile 5 zu Zeile 20, führe Zeile 20 (welche normalerweise nicht genutzt wird) aus und fahre dann mit Zeile 6 fort" - vereinfacht ausgedrückt. Zitat:Aber eines muss man auch dazu sagen... Die oben gezeigte Codecave ist noch die einfachste Form. Sowas gibts noch viel komplexer und umfangreicher...Äh, danke, reicht fürs erste Gut, ich weiß nicht, ob ich es schaffe, das umzusetzen, aber ich werds auf jeden fall versuchen. Hmm, trotz CE oder AM muß man ja tatsächlich ein bisschen Programmieren können (oder zumindest etwas davon verstehen)... Junge Junge... RE: Adressen-Probleme... - Acubra - 23.07.2012 Hey, schön das du nicht aufgibst und versuchst immer weiter zu lernen. Weiter so! (22.07.2012, 21:33)FPS-Player schrieb:Das gilt theoretisch für jede .exe. Also jedes Spiel, in dem die Cheats in einer .exe lokalisiert sind, haben die Basisadresse von 0x400000h. Wenn das Spiel jedoch über eine Dynamic Link Library z.B den ganzen Timerkram steuert, dann musst du erst die BaseAdresse der dll ausfindig machen. Wie das Wort dynamic (dynamisch) schon sagt, werden diese Libraries immer an andere Orte geladen.Zitat:Bei diesem Code gibts nichts auseinanderzupflücken...Aha! Das habe ich verstanden. Gilt denn die Basisadresse 0x400000h nur für Just cause 2 oder generell für jedes Spiel? (22.07.2012, 21:33)FPS-Player schrieb:Nein, wir müssen den Originalcode überschreiben. Anders kommen wir ja nicht zur CodeCave. aus movss [esi+40], xmm0 wird Jmp AdresseCodecave. Deswegen müssen wir auch im Endeffekt den Originalcode wieder in die CodeCave schreiben, da sonst das Spiel nicht weiss was es machen soll.Zitat:Die Anweisung die unsere Timer Adresse beschreibt ist genau 5 Bytes groß bzw. lang. Und unser reiner Cheatcode ist im Endeffekt 10 Bytes lang...Halt! Überschreiben können wir den Code ja nicht, da sonst das Spiel abschmiert. Du meinst sicherlich, das wir sozusagen einen Bypass zu diesem Code legen - unsere Codecave...oder? (22.07.2012, 21:33)FPS-Player schrieb:Nein, so einfach ist das leider nicht. Der sILeNt heLLsCrEAm hat sich die Struktur von der in ESI befindlichen Adresse angeguckt. Also folgendes Szenario:Zitat:Und wie ich da bereits sagte wird in [ESI+40], was unsere Timer Adresse ist, immer wieder der Wert des XMM0 Registers kopiert. Die Zeit nimmt also ab. Aber direkt neben der Adresse des tatsächlichen Zeitwertes befindet sich auch die Adresse mit dem maximalen Zeitwert bzw. dem Zeitwert bei vollem Balken.Ah, also wäre - nur zur Verdeutlichung - der Timer, bzw. die Adresse [ESI+30] --> sprich ablaufende Zeit, müsste ich, wenn ich den max. Zeitwert einstellen wollte immer (also in jedem Fall/Spiel) 4 Bytes dazurechnen, so das ich dann auf [ESI+30+4] käme, also [ESI+34], richtig? ESI beinhaltet die Struktur zum Spieler (also wo Daten über den Spieler "gespeichert" werden) in ESI+4 befindet sich z.B der Name in ESI+8 die Lebenspunkte in ESI+12 die Erfahrungspunkte u.s.w in Pseudocode sehe das folgendermaßen aus: Code:
Jedoch ist das vom Programmierer abhängig. Er hätte die Struktur auch folgendermaßen aufbauen können: Code:
Dann wäre bei ESI+4 die HP zu finden. (22.07.2012, 21:33)FPS-Player schrieb:Dazu guckst du dir einfach die Opcodes des Befehls (F3[1] 0F[2] 11[3] 46[4] 40[5]) an.Zitat:Der Sprung zur Codecave war an Adresse "JustCause2.exe+4103F0", oder anders geschrieben an Adresse "008103F0". Da der Sprung, genauso wie der Originalcode, 5 Bytes lang/groß ist addieren wir zu dieser Adresse 5 Bytes hinzu. Also müssen wir zu Adresse "JustCause2.exe+4103F5", oder anders geschrieben zu Adresse "008103F5" zurückspringen. (22.07.2012, 21:33)FPS-Player schrieb: Hmm, trotz CE oder AM muß man ja tatsächlich ein bisschen Programmieren können (oder zumindest etwas davon verstehen)... Junge Junge...Es ist auf jeden Fall nicht kontraproduktiv |