| Hacks & Crackmes Tests, Fragen oder Hilfestellungen. Crackmes und Hackits werden hier diskutiert. |
Diskussion: Frage zu JE SHORT EasyCrac.0040113D im Forum Hacks & Crackmes, in der Kategorie Software Home; Anzeige hi, schaut euch mal folgenden code aus einem crackme an Code: 00401124 |. 50 PUSH EAX 00401125 |. E8 ...
![]() |
| | #1 (permalink) |
| Registriert seit: 01.08.10 ![]() Likes: 0 | Anzeige hi, schaut euch mal folgenden code aus einem crackme an Code: 00401124 |. 50 PUSH EAX 00401125 |. E8 D6FEFFFF CALL EasyCrac.00401000 //serial wird geprüft 0040112A |. 85C0 TEST EAX,EAX 0040112C |. 59 POP ECX 0040112D |. 59 POP ECX 0040112E |. 56 PUSH ESI 0040112F |. 74 0C JE SHORT EasyCrac.0040113D //<------???? 00401131 |. 68 38234000 PUSH EasyCrac.00402338 ; ASCII "RIGHT" 00401136 |. 68 2C234000 PUSH EasyCrac.0040232C ; ASCII "You got it!" 0040113B |.^ EB DA JMP SHORT EasyCrac.00401117 0040113D |> A1 B4234000 MOV EAX,DWORD PTR DS:[4023B4] ; | 00401142 |. 68 24234000 PUSH EasyCrac.00402324 ; |Title = "WRONG" 00401147 |. 6A 0B PUSH 0B ; | 00401149 |. 59 POP ECX ; | meine frage ist, was wird da verglichen bei JE SHORT EasyCrac.0040113D also wann springt er? ESI ist in beiden fällen 0x00. also egal ob serial richtig/flasch ist wenn ich eax manuell auf 0 oder 1 setze springt er auch immer. wenn die serial oben in Code: 00401125 |. E8 D6FEFFFF CALL EasyCrac.00401000 aber wie prüft er das? Geändert von nurmalso (02.08.10 um 20:20 Uhr) |
| | |
| | #2 (permalink) |
| Registriert seit: 12.06.08 ![]() Likes: 0 | Ich glaube, dass das Tutorial - von lena151 - dir bei der Frage sehr hilfreich sein wird. In Tutorial #12 wird es gut erklärt ![]() Downloadlink: http://tuts4you.com/request.php?133 |
| | |
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) |
| Themenstarter Registriert seit: 01.08.10 ![]() Likes: 0 | danke dir, aber es gab keine anderen referenzen zu dem befehl. bin mal essen gegangen und hab nen bissl "offline" überlegt. JE überprüft ob das Zero flag gesetzt ist, also muesste das z flag in der call funktion gesetzt werden. es werden also keine serials miteinander verglichen, sondern nur ob die eingebene serial durch fest definierte mathematische funktionen 0 oder !=0 ergibt. nochmal an den pc gesetzt und es kontrolliert, es ist in der tat so, dass in dem call aufruf das zero flag auf 1 bzw 0 gesetzt in abhängigkeit von der gültigkeit der serial. war nen bissl tricky weil ein überlauf produziert wird, aber naja, bin noch anfänger problem gelößt. Geändert von nurmalso (02.08.10 um 23:02 Uhr) |
| | |
| | #4 (permalink) |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | http://www.informatik.htw-dresden.de...assembler.html (Abschnitt "bedingte Sprünge" - da sind auch die Flagzustände mit aufgelistet) Nun setzen aber nicht alle Operationen diese Flags - d.h zwischen solcher "Prüfungsoperation" und dem Sprung können ruhig diese eingeschoben werden PS: nicht der Callaufruf, sondern TEST EAX,EAX ist hier entscheidend. Denn dieses setzt oder löscht das ZF. TEST EAX,EAX ist fast das gleiche wie AND EAX,EAX (nur wird dabei der Inhalt des Registers nicht verändert).
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
| | |
| | #5 (permalink) |
| Themenstarter Registriert seit: 01.08.10 ![]() Likes: 0 | in dem call wird das zflag schon "richtig" gesetzt (man koennte TEST EAX,EAX deshalb auch weglassen finde ich), weis nicht ob das flag durch irgentwelche interrups geändert werden kann, da ja TEST EAX,EAX direkt nach dem call ist. aber schaden kann es nicht. Geändert von nurmalso (02.08.10 um 23:34 Uhr) |
| | |
| | #6 (permalink) | |
| Moderator ![]() Registriert seit: 20.07.05 ![]() ![]() ![]() ![]() ![]() ![]() Likes: 202 | Zitat:
EAX kann gerne den Wert 0 oder 01 haben. Das heißt aber noch lange nicht, dass ZF automatisch auch gesetzt ist zustande gekommen ist. Dann ist EAX auch 0/1/was auch immer, die Flags werden dabei aber nicht verändert. Und natürlich können zwischen dem "nullsetzen" des Wertes irgendwo in der geCALLten Funktion und dem eigentlichen JE noch andere Operationen kommen - z.B am Ende der aufgerufenen Funktion: Code: MOV EAX, 0 (== hierbei wird ZF NICHT gesetzt) ADD ESP, 20 (Stackbereinigung, hierbei wird ZF gelöscht, weil das Ergebniss dieser Operation ungleich 0 war). RET Edit: jep, hier kann es sein, dass es überflüssig ist - nur kann der Compiler dies nicht immer erkennen.
__________________ Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |