Crack-Verständniss für Newbies: °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° Lektion 1 ^^^^^^^^^ 1) Vorwort 2) Und heute... 3) Los gehts 4) Schlusswort 1) Hi, ich habe in letzter Zeit eine Menge Mails von Newbies bekommen, die meine Tutoren gelesen haben, und es war fast ausschliesslich Lob darunter. Aber ein Frage erschien in vielen dieser Mails, und ich will in diesem "Tutor" einmal genau diese Frage aufgreifen. Als typisches Beispiel habe ich die E-Mail von Tequila007 genommen.Da steht folgender Text: "Hi, ich bräuchte mal ein allgemeines Crack-Tut, mit deinem Tutor habe ich zwar das Prog gecrackt, aber andere habe ich damit nicht geschafft." Oder ein anderes Beispiel: "...muss ich jne immer in jn umändern? Also was soll ich sagen, ich werde in dieser Tutorreihe versuchen euch die verschiedenen bekanntesten Crackingmethoden so allgemein wie nur möglich beizubringen. Ich werde lediglich die Methoden erklären WIE das Programm zu cracken ist, aber ich werde das ganze Zeug, z.B. wie ihr im Dasm einen Sprung zurückverfolgt, oder wie man den Hexworkshop benutzt etc.., nichtmehr erklären. Wenn ihr das noch nicht wisst saugt euch noch schnell meine Tutor zu Techfacts95, da ist alles lang und breit erklärt :-P 2) Dies ist der erste (und bisher einzige) Tutor aus dieser Reihe, deshalb nehmen wir uns heute die einfachste Form des crackens mit dem W32dasm vor. Es handelt sich dabei um das registrieren eines Programms durch überspringen der Fehlermeldung. Leider machen es einem die Programmierer heute nur noch selten so einfach, aber ich finde öfters einmal das eine oder andere (auch qualitativ sehr gute) Programm bei dem es funktioniert. 3) Ich unterscheide diese Art des "Fehlermeldungentfernens" in zwei verschiede Wege. 1] Den Sprung vor der Meldung so patchen das IMMER über die Meldung hinweg gesprungen wird 2] Den Sprung der die Meldung (+ den Vergleich) aufruft einfach wegnoppen Wenn euch das im Moment noch nix sagt, lest einfach weiter, ich werde es später etwas bildlicher erklären. Logischerweise beginnen wir mit dem dissasambeln der .exe Datei, und suchen nach der Meldung "Falscher Regkey" o.ä. je nach Programm :-) Wenn ihr sie in den Strings findet habt ihr Glück, wenn nicht sucht mal in einer der DLLs, die eventuell in dem Verzeichniss des Programms liegen. Findet ihr auch da den String nicht, wird die ganze Sache komplizierter, und zu solchen Fällen komme ich in einer der späteren Lektionen *g* TIP: Wenn es keine Meldung gibt "Key falsch" dann ja vielleicht ein Meldung "Key richtig" also nicht gleich aufgeben, wenn der String nicht gefunden wird, ihr müsst einfach überlegen was das Programm sagen könnte, wenn der Key richtig ist.. und danach dann suchen. Ich nehme als Beispiel mal das Programm "Traystart 2.0" aber das soll euch egal sein, ich habe nur keine Lust mir den ganzen Assemblertext auszudenken. Ich suche mal nach meiner Fehlermeldung: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0044D322(C) | :0044D391 BA07000000 mov edx, 00000007 :0044D396 E88589FBFF call 00405D20 <- im moment unwichtig :0044D39B 8B55F8 mov edx, dword ptr [ebp-08] :0044D39E 58 pop eax :0044D39F E86064FBFF call 00403804 <- im moment unwichtig für euch :0044D3A4 7530 jne 0044D3D6 <- !DAS ist für euch wichtig! * Possible StringData Ref from Code Obj ->"Code ist ungültig" <- Da ist die Meldung Wie ihr seht handelt es sich um Fall (1), wenn ihr das nicht gleich seht will ich es kurz erklären: Ihr habt einen "jne" ,also einen Jump mit Bedingung, DIREKT vor der Fehlermeldung. (An Stelle des jne könnte natürlch jeder andere Jump mit Bedingung stehen: z.B. je, ja, jnae...was auch immer..)Das heisst, das das Programm diese Meldung überspringt, sobald irgendetwas bestimmtes vorgefallen ist. Die Bedingung müsste in diesem Fall irgendwie so lauten: Wenn der Code richitg war, dann spring über diese Meldung hinweg (<- Also keine Fehlermeldung mehr!) Was wir jetzt machen müssen liegt auf der Hand, wir müssen dem Programm sagen, dass es einfach IMMER diese Meldung auslässt, egal ob dieser dämliche Code nun richtig oder falsch war. Also müssen wir den "jne" in einen "jmp" umwandeln! Ganz billig im Prinzip. Wie ihr das ändert solltet ihr wissen, das werde ich nicht nochmals erklären, sorry! Kommen wir jetzt zu Methode (2) Folgende Meldung wollen wir weghaben: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0044D3A4(C) <- In diesem Fall ist DAS sehr wichtig für uns! | * Possible StringData Ref from Code Obj ->"Der Code ist ungültig" <- Da ist die Meldung :0044D3D6 B8D0D44400 mov eax, 0044D4D0 :0044D3DB E8CCF9FDFF call 0042CDAC Auch hier wollen wir das "Der Code ist ungültig" irgendwie killen, aber OH SCHRECK, da steht gar kein "jne" oder "je" o.ä. davor...aahhh...ruhig Blut. Kein Problem. Ihr seht vor der Fehlermeldung die Zeile: Referenced by a...blabla.... Und drunter die Addresse 0044D3A4(C) Die Zeile bedeutet folgendes: Diese Meldung (die unterhalb steht) wurde aufgerufen von dem Jump an der Addresse 0044D3A4. Das (C) bedeutet das der jump eine Condition hat. Klingelts? Also was wir machen müssen ist, an diese Stelle des Programms zu gehen (0044D3A4) und den Jump der dort sein wird einfach zu löschen. Damit wir von DIESEM jump nichtmehr zu dieser Meldung gebracht werden. Es kann natürlich auch sein, dass dort zwei Addressen stehen, dann müsstet ihr entweder beide jumps killen, oder rausfinden welcher jump derjenige ist, der für euch wichtig ist (Das geht am besten mit dem Debugger vom W32dasm, aber dazu ein ander Mal mehr..) Also gehen wir mit "GotoCodeLocation" mal zu unserem jump: :0044D39E 58 pop eax :0044D39F E86064FBFF call 00403804 :0044D3A4 7530 jne 0044D3D6 <- dieser jump ist es, von dem oben die Rede ist * Possible StringData Ref from Code Obj ->"Vielen Dank, das Sie sich registriert haben" BINGO, das ist doch optimal. Wir sehen, dass der jump, der zur "Falsch"-Meldung springt direkt VOR der "Richtig"-Meldung steht. Wir kombinieren logisch: Wenn wir diesem jump löschen kann also weder die Fehlermeldung aufgerufen werden, noch kann die Registriertmeldung übersprungen werden! *FREU* Jetzt müsst ihr also in den Hexeditor und diesen jump weg noppen. Das ist nun wirklich nicht schwer, oder? Leider ist es oft der Fall, das das Programm zwar artig "Danke für die registrierung" sagt, aber nach einem neustart dann wieder unregistriert ist. Das liegt daran, dass bei manchen Programmen eine Unterroutine eingebaut ist, die bei jedem Start wieder überprüft ob das Programm nun Registriert ist, oder nicht! In einem solchen Fall ist es entweder notwendig eine Serial zu saugen, oder das Programm so weit zu cracken, das ein Registrierung nichtmehr notwendig ist *g* Also nach jeder erfolgreichen Registrierung erstmal das Programm neu starten, um zu sehen ob das Programm auch jetzt noch so doof ist wie vorher.. Bei Traystart 2.0 wird alles gespeichert, das ist halt ein optimalfall, aber zum lernen gibt es nix besseres. Das war nun schon die erste Lektion, ich bitte euch mir zu mailen, wenn ihr mehr wollt, oder wenn etwas schlecht oder zu kurz erklärt war. Bitte fragt mich nicht nach Game-Cracking-Tutoren, da ich so gut wie nie spiele besitze ich auch keine Spiele. Wenn ich mal eins in die Hände bekomme werde ich vielleicht noch einen Tutor schreiben.. wartets einfach ab. MfG cI[ERo [tSK] a fRACTUs`99 - pROdUcTIoN