cambiali con:
Codice:cmp al,al jmp uno.401338
E' giusto quanto dici, è sicuramente uno dei modi per patcharlo.
Però da quanto dice lui vuole inserire dati corretti e superare i controlli secondo me (immagino poi scrivendo un "keygen").
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
cambiali con:
Codice:cmp al,al jmp uno.401338
Ti stai sbagliando, la chiave esiste ma non è detto che sia hardcodata.Sei sicuro esista davvero una key valida @A77ila e non sia "inutile"?
Il registro 8-bitLa stringa che inserisci nel primo campo in pratica è composta da 4 caratteri, perchè gli altri vengono sovrascritti dalla stringa che inserisci nel secondo input.
al
contiene la prima lettera della stringa, nel caso ti riferissi a questo.I controlli sono due,Se anche si passassero i primi due controlli la call successiva effettua un controllo differente
call
non sottintende alcun nuovo controllo bensì chiama il secondo blocco di codice.Quelli sono indirizzi di memoria, non offset. L'offset è la distanza posizionale tra un indirizzo di memoria e l'altro.Ci sono due offset: 0x402165 e 0x402169.
Tra quello che hai postato non c'è alcun riferimento a questo indirizzo di memoria, non sono sicuro di che controllo tu stia parlando.Mettiamo il caso che l'ultimo controllo sia quello a 0x4012BD
Il registro 8-bital
contiene la prima lettera della stringa, nel caso ti riferissi a questo.
00401308 | E8 44000000 | call <uno.sub_401351>
004012A9 | 8A81 65214000 | mov al,byte ptr ds:[ecx+402165] |prendo il quarto carattere del nome nel mio caso 7 in hex 37 e lo metto in al
004012AF | 34 16 | xor al,16 |xor con 16 37^16=21
004012B1 | 04 45 | add al,45 |aggiungo 45 21+45=66
004012B3 | 02C1 | add al,cl |aggiungo cl che al momento vale 3(sarebbe il contatore di prima) 66+3=69
004012B5 | 32C1 | xor al,cl |xor con cl(sempre 3) 69^3=6A
004012B7 | 8A99 69214000 | mov bl,byte ptr ds:[ecx+402169] |sposto in bl il quarto carattere della pass nel mio caso "j" che è proprio 6A
004012BD | 3AC3 | cmp al,bl
00401379 | 8A81 65214000 | mov al,byte ptr ds:[ecx+402165] |
0040137F | 34 16 | xor al,16 |
00401381 | 04 44 | add al,44 |
00401383 | 02C1 | add al,cl |
00401385 | 32C1 | xor al,cl |
00401387 | 8AA1 69214000 | mov ah,byte ptr ds:[ecx+402169] |
0040138D | 3AC4 | cmp al,ah
Nota che L != l. Sono due caratteri diversi."Luca" prendo un carattere alla volta(in esadecimale ovviamente l=6c, u=75... ecc )
00401221 | BB 69214000 | mov ebx,uno.402169 | ebx:"jyyj", 402169:"jyyj" sposto in ebx la pass che ho inserito
00401226 | 8BD0 | mov edx,eax |
00401228 | 33C9 | xor ecx,ecx |azzero ecx
0040122A | 8A81 65214000 | mov al,byte ptr ds:[ecx+402165] |sposto in al la prima lettera del nome nel mio caso "A" 41 in hex
00401230 | 04 12 | add al,12 |aggiungo 12 41+12=53
00401232 | 32C1 | xor al,cl |xor con cl che in questo momento vale 0 quindi non cambia nulla
00401234 | 04 15 | add al,15 |aggiungo 15 ad al 53+15=68
00401236 | 04 02 | add al,2 |aggiungo 2 ad al 68+2=6A
00401238 | BB 69214000 | mov ebx,uno.402169 | ebx:"jyyj", 402169:"jyyj" metto la pass in ebx
0040123D | 8A240B | mov ah,byte ptr ds:[ebx+ecx] |sposto in ah il primo carattere della pass nel mio caso "j" 6A in hex
00401240 | 3AC4 | cmp al,ah |vedo se sono uguali,nel mio caso si,infatti al=6A ah=6A
00401242 | 0F85 C9000000 | jne uno.401311 |se sono diversi mostro il messaggio di errore
00401248 | 41 | inc ecx |incrementa ecx che prima era 0
00401249 | 40 | inc eax |incrementa eax prima era 0
0040124A | 83F9 03 | cmp ecx,3 |ecx viene incrementanto fino a 3 quindi testa le prime 3 lettere
del nome,le mie sono state scelte dopo varie prove casuali,ho scelto caratteri che dopo queste operazioni mi facciano ottenere hex che possono essere convertiti in ascii se cosi non fosse io non saprei che scrivere nel riquadro pass,e da qui sorge il mio dubbio,perchè nonostante questi caratteri siano stati scelti apposta
non mi permettono comunque di completare l'intero programma,infatti nella generazione della 2 parte del seriale ottengo hex non convertibili
0040124D | 75 DB | jne uno.40122A |codice spazzattura
0040124F | 83F9 03 | cmp ecx,3 |
00401252 | 75 D6 | jne uno.40122A |
00401254 | 83F9 03 | cmp ecx,3 |
00401257 | 75 D1 | jne uno.40122A |
00401259 | 83F9 03 | cmp ecx,3 |
0040125C | 75 CC | jne uno.40122A |
0040125E | 83F9 03 | cmp ecx,3 |
00401261 | 75 C7 | jne uno.40122A |
00401263 | 83F9 03 | cmp ecx,3 |
00401266 | 75 C2 | jne uno.40122A |
00401268 | 83F9 03 | cmp ecx,3 |
0040126B | 75 BD | jne uno.40122A |
0040126D | 83F9 03 | cmp ecx,3 |
00401270 | 75 B8 | jne uno.40122A |
00401272 | 83F9 03 | cmp ecx,3 |
00401275 | 75 B3 | jne uno.40122A |
00401277 | 83F9 03 | cmp ecx,3 |
0040127A | 75 AE | jne uno.40122A |
0040127C | 83F9 03 | cmp ecx,3 |
0040127F | 75 A9 | jne uno.40122A |
00401281 | 83F9 03 | cmp ecx,3 |
00401284 | 75 A4 | jne uno.40122A |
00401286 | 83F9 03 | cmp ecx,3 |
00401289 | 75 9F | jne uno.40122A |
0040128B | 83F9 03 | cmp ecx,3 |
0040128E | 75 9A | jne uno.40122A |
00401290 | 83F9 03 | cmp ecx,3 |
00401293 | 75 95 | jne uno.40122A |
00401295 | 83F9 03 | cmp ecx,3 |
00401298 | 75 90 | jne uno.40122A |
0040129A | 83F9 03 | cmp ecx,3 |
0040129D | 75 8B | jne uno.40122A |
0040129F | 83F9 03 | cmp ecx,3 |
004012A2 | 75 86 | jne uno.40122A |
004012A4 | 83F9 03 | cmp ecx,3 |
004012A7 | 75 81 | jne uno.40122A |
004012A9 | 8A81 65214000 | mov al,byte ptr ds:[ecx+402165] |prendo il quarto carattere del nome nel mio caso 7 in hex 37 e lo metto in al
004012AF | 34 16 | xor al,16 |xor con 16 37^16=21
004012B1 | 04 45 | add al,45 |aggiungo 45 21+45=66
004012B3 | 02C1 | add al,cl |aggiungo cl che al momento vale 3(sarebbe il contatore di prima) 66+3=69
004012B5 | 32C1 | xor al,cl |xor con cl(sempre 3) 69^3=6A
004012B7 | 8A99 69214000 | mov bl,byte ptr ds:[ecx+402169] |sposto in bl il quarto carattere della pass nel mio caso "j" che è proprio 6A
004012BD | 3AC3 | cmp al,bl |vedo se sono uguali al e bl
004012BF | 75 50 | jne uno.401311 |se non sono uguali mostro il messaggio serial sbagliato
004012C1 | 41 | inc ecx |incremento ecx
Ora come dicevo prima la mia scelta non è stata casuale,però qua sorge un problema,anzi due,il programma prende solo i primi 4 caratteri del nome(anche per questo non ne ho inseriti di piu) i successivi controlli li fa sulla pass che deve essere di 7 caratteri anche se il contatore si incrementa fino ad 8(credo sia uno scherzone di chi ha fatto il programma,quindi in realtà anche scrivendo il keygen non penso che il programma possa essere lasciato intatto al 100%,ma lasciamo perdere il mio problema sorge molto prima adesso ve lo vado ad illustare).
Eravamo rimasti all'incremento di ecx,come ho detto prima dal nome vengono presi solo 4 caratteri,ora i prossimi confronti prendono i caratteri dalla campo password infatti adesso vediamo che sposta in al la "j" in hex 6A,xor con 16 6A^16=7C
poi aggiunge 45 7C+45=C1,aggiunge cl che vale 4 C1+4=C5,xor di nuovo con cl C5^4=C1,ora sposta in bl il quinto carattere delle pass,se ricordate io ne ho inseriti solo 4 qundi ovviamente non trova niente e ci sposta 0.
Facciamo però finta che io lo voglio calcolare,so che deve essere uguale a C1,ora C1 corrisponde ad Á,già inserendo questo valore(copiandolo e incollandolo),il programma già non va perchè questa Á me la conta come C3, ma lasciando stare questo il problema ho cambiato il valore dello stack manualmente e ho fatto finta fossero uguali,e procediamo al prossimo carattere;prendo la "y"(secondo char della pass) in hex vale 79.
Ripetiamo il ciclo xor con 16 79^16=6F,aggiungo 45 6F+45=B4,aggiungo cl che vale 5 B4+5=B9,xor con cl B9^5=BC.
Ed eccoci al mio fatidico problema,ora come sappiamo abbiamo un cmp al,bl se sono uguali il ciclo continua,bl deve essere un carattere della password,ma per far si che sia uguale ad "al" deve bl essere BC che in ascii non corrisponde a niente.
Ora questo problema si è presentato solo ora,ma stamattina avevo provato a mettere come mio username "sasi" e non riuscivo a superare nemmeno il primo ciclo,perchè quando andavo a calcolare la pass,mi uscivano solamente valori hex che non potevano essere tradotti in ascii,valori insomma che io non potevo inserire da tastiera.
004012C2 | 83F9 08 | cmp ecx,8 |codice spazzattura
004012C5 | 75 E2 | jne uno.4012A9 |
004012C7 | 83F9 08 | cmp ecx,8 |
004012CA | 75 DD | jne uno.4012A9 |
004012CC | 83F9 08 | cmp ecx,8 |
004012CF | 75 D8 | jne uno.4012A9 |
004012D1 | 83F9 08 | cmp ecx,8 |
004012D4 | 75 D3 | jne uno.4012A9 |
004012D6 | 83F9 08 | cmp ecx,8 |
004012D9 | 75 CE | jne uno.4012A9 |
004012DB | 83F9 08 | cmp ecx,8 |
004012DE | 75 C9 | jne uno.4012A9 |
004012E0 | 83F9 08 | cmp ecx,8 |
004012E3 | 75 C4 | jne uno.4012A9 |
004012E5 | 83F9 08 | cmp ecx,8 |
004012E8 | 75 BF | jne uno.4012A9 |
004012EA | 83F9 08 | cmp ecx,8 |
004012ED | 75 BA | jne uno.4012A9 |
004012EF | 83F9 08 | cmp ecx,8 |
004012F2 | 75 B5 | jne uno.4012A9 |
004012F4 | 83F9 08 | cmp ecx,8 |
004012F7 | 75 B0 | jne uno.4012A9 |
004012F9 | 83F9 08 | cmp ecx,8 |
004012FC | 75 AB | jne uno.4012A9 |
004012FE | 83F9 08 | cmp ecx,8 |
00401301 | 75 A6 | jne uno.4012A9 |
00401303 | 83F9 08 | cmp ecx,8 |
00401306 | 75 A1 | jne uno.4012A9 |
00401308 | E8 44000000 | call <uno.sub_401351> |
0040130D | 3C 01 | cmp al,1 |
0040130F | 74 27 | je uno.401338 |
00401311 | B8 65214000 | mov eax,uno.402165 | 402165:"AQN7jyyj"
00401316 | 83C0 2D | add eax,2D |
00401319 | 83F0 0F | xor eax,F |
0040131C | 8BD8 | mov ebx,eax | ebx:"jyyj"
0040131E | 33C0 | xor eax,eax |
00401320 | 6A 10 | push 10 | UINT uType = MB_OK | MB_ICONSTOP
00401322 | 68 8C204000 | push uno.40208C | LPCTSTR lpCaption = "Erroreeeeeeee!!!!"
00401327 | 68 00204000 | push uno.402000 | LPCTSTR lpText = "Serial errato, ritenta!!!"
0040132C | 6A 00 | push 0 | HWND hWnd = NULL
0040132E | E8 C3000000 | call <JMP.&MessageBoxA> | MessageBoxA
00401333 | E9 24FEFFFF | jmp <uno.sub_40115C> |
00401338 | 6A 20 | push 20 | UINT uType = MB_OK | MB_ICONQUESTION
0040133A | 68 E1204000 | push uno.4020E1 | LPCTSTR lpCaption = "Crackato!!!"
0040133F | 68 66204000 | push uno.402066 | LPCTSTR lpText = "Serial esatto....Bravo!!!"
00401344 | 6A 00 | push 0 | HWND hWnd = NULL
00401346 | E8 AB000000 | call <JMP.&MessageBoxA> | MessageBoxA
0040134B | E9 0CFEFFFF | jmp <uno.sub_40115C> |
00401350 | C3 | ret |
00401351 | BB 69214000 | mov ebx,uno.402169 | ebx:"jyyj", 402169:"jyyj"
00401356 | 8BD0 | mov edx,eax |
00401358 | 33C9 | xor ecx,ecx |
0040135A | 8A81 65214000 | mov al,byte ptr ds:[ecx+402165] |
00401360 | 04 12 | add al,12 |
00401362 | 32C1 | xor al,cl |
00401364 | 04 15 | add al,15 |
00401366 | 04 02 | add al,2 |
00401368 | 8AA1 69214000 | mov ah,byte ptr ds:[ecx+402169] |
0040136E | 3AC4 | cmp al,ah |
00401370 | 75 9F | jne uno.401311 |
00401372 | 41 | inc ecx |
00401373 | 40 | inc eax |
00401374 | 83F9 03 | cmp ecx,3 |
00401377 | 75 E1 | jne uno.40135A |
00401379 | 8A81 65214000 | mov al,byte ptr ds:[ecx+402165] |
0040137F | 34 16 | xor al,16 |
00401381 | 04 44 | add al,44 |
00401383 | 02C1 | add al,cl |
00401385 | 32C1 | xor al,cl |
00401387 | 8AA1 69214000 | mov ah,byte ptr ds:[ecx+402169] |
0040138D | 3AC4 | cmp al,ah |
0040138F | 75 0A | jne uno.40139B |
00401391 | 41 | inc ecx |
00401392 | 83F9 08 | cmp ecx,8 |
00401395 | 75 E2 | jne uno.401379 |
00401397 | B0 01 | mov al,1 |
00401399 | EB 04 | jmp uno.40139F |
0040139B | B0 00 | mov al,0 |
0040139D | EB 00 | jmp uno.40139F |
0040139F | 33DB | xor ebx,ebx | ebx:"jyyj"
004013A1 | C3 | ret |
cambiali con:Codice:00401240 | 3AC4 | cmp al,ah |vedo se sono uguali,nel mio caso si,infatti al=6A ah=6A 00401242 | 0F85 C9000000 | jne uno.401311 |se sono diversi mostro il messaggio di errore
cmp al,al
jmp uno.401338
Ti ringrazio per la risposta,ma come ha detto @DispatchCode volevo fare un keygen.cambiali con:
Codice:cmp al,al jmp uno.401338
E' giusto quanto dici, è sicuramente uno dei modi per patcharlo.
Però da quanto dice lui vuole inserire dati corretti e superare i controlli secondo me (immagino poi scrivendo un "keygen").
Infatti se aveste letto bene il codice avreste notato chiaro e tondo che si può passare esclusivamente il primo controllo, il programma sembra essere fatto per essere patchato. Nel primo controllo c'è unTi ringrazio per la risposta,ma come ha detto @DispatchCode volevo fare un keygen.
Ed inoltre in vari crackme ho avuto questo problema della conversione,quindi volevo risolvermi questo dubbio una volta per tutte.
add al,45
, nel secondo (che avviene similmente) c'è un add al,44
e non sono concomitanti per soddisfare ambo le condizioni.004012A9 |> /8A81 65214000 /MOV AL,BYTE PTR DS:[ECX+402165]
004012AF |. |34 16 |XOR AL,16
004012B1 |. |04 45 |ADD AL,45
004012B3 |. |02C1 |ADD AL,CL
004012B5 |. |32C1 |XOR AL,CL
004012B7 |. |8A99 69214000 |MOV BL,BYTE PTR DS:[ECX+402169]
004012BD |. |3AC3 |CMP AL,BL
004012BF |. |75 50 |JNE SHORT 00401311
Infatti se aveste letto bene il codice avreste notato chiaro e tondo che si può passare esclusivamente il primo controllo, il programma sembra essere fatto per essere patchato. Nel primo controllo c'è unadd al,45
, nel secondo (che avviene similmente) c'è unadd al,44
e non sono concomitanti per soddisfare ambo le condizioni.
SI si,avevo notato sta cosa,al quinto controllo viene prese il primo char della pass,viene manipolato e confrontato con la quinta lettera della pass,infatti se inserisco come tu hai detto" AAA0" e "jihm123",viene prese la "j" manipolato e poi confrontata con "1".Ora non voglio farvi perdere tempo con questo stupido crackme e i miei dubbi da nabbo,quindi se facessimo finta che il secondo controllo sia inesistente,quello dove @nullptr ha detto che viene aggiunto 44(quello piu in basso).a stringa che inserisci nel primo campo in pratica è composta da 4 caratteri, perchè gli altri vengono sovrascritti dalla stringa che inserisci nel secondo input.
Hai ragioneee! è impossibile soddisfare le due condizioni.Infatti se aveste letto bene il codice avreste notato chiaro e tondo che si può passare esclusivamente il primo controllo, il programma sembra essere fatto per essere patchato. Nel primo controllo c'è unadd al,45
, nel secondo (che avviene similmente) c'è unadd al,44
e non sono concomitanti per soddisfare ambo le condizioni.
Stai tranquillo, volevo semplicemente chiarirvi le idee in quanto leggermente date dalla disattenzione. Effettivamente lavorare con sta roba senza debugger is a pain in the ass.@nullptr non ho voglia di polemizzare francamente.
Chiamalo indirizzo di memoria, non ha senso indicarlo come offset che si aggiunge a 0x000000.Comunque mi stavo riferendo all'offset inteso come valore che viene utilizzato come base per il calcolo dello spiazzamento