------------[Bishop 's Crackme2 (SMC)]------------> *********************************** Autor: Evilcry * E-Mail: evilcry@virgilio.it * Site: http://abcd6.interfree.it * Chan: #cryptorev * *********************************** Il crackme in questione è moolto semplice, ed il codice è abbastanza lineare. Il trick più interessante è un piccolo SMC (Self Modifing Code), che tenta di oscurarci lo stepping. Settate un BPX a geddlgitemtexta per steppare. Un dead listing è molto più chiaro di 1000 parole quindi sotto col codice!! : 0040122C CALL USER32!GetDlgItemTextA 00401231 TEST AL,AL ;Testa se abbiamo effettivamente messo un nome 00401233 JZ 004012A7 00401235 PUSH 00403065 ;In questo buffer c'è il nome inserito, 0040123A CALL 004014DF ;Call analizzata più in giù Il nome che ho messo io è evilcry. Andiamo ora a vedere la call 004014DF: 004014EE LODSB Carica in EAX il nostro nome, un byte alla volta 004014EF TEST AL,AL ;Il nome è finito??? 004014E9 |Qui ci sono una serie di nop, poi capirete perchè |Nop |Nop |Nop.... 004014F7 JZ 0040150F; Se SI passa al prossimo pezzo di algoritmo 004014F9 ADD EDX,EAX ;Somma il byte in AL, ad EDX 004014FB RCL EDX,04 ;Ruota a sinistra 004014FE XOR EDX,EAX 00401500 RCR EDX,04 ;Ruota a destra 00401503 XOR EDX,EAX 00401505 RCL EDX,08 ;Ruota nuovamente a sinistra 00401508 JMP 004015E ;Salta a 004015E Andiamo ora al prossimo pezzo di codice: 00401514 XOR EDX,12345678 ;XORa il serial parzialmente lavorato con un valore fisso 0040151A MOV EAX,EDX ; viene messo in eax 0040151C AND EAX,000000FF ;azzera 3 chars e lascia l' ultimo, che si trova in al AL EAX=000000XX Questo spezzone di codice, serve a "stabilizzare", il serial ottenuto, rendendolo una sequenza di numeri, compresi tra 0 e 9. Ho rinominato le locazioni in modo da rendere il tutto ancora più semplice: @Verifica1: 00401521 CMP AL,39 00401523 JA @Stabilizza1 00401525 CMP AL,2F 00401527 JA @Stabilizza2 00401529 ADD AL,0A 0040152B JMP @Verifica1 @Stabilizza1: 0040152D SUB AL,0A 0040152F JMP @Verifica1 @Stabilizza2: 00401531 STOSB 00401532 SHR EDX,04 00401535 TEST EDX,EDX 00401537 JNZ 0040161A 00401539 XOR AL,AL 0040153B STOSB 0040153C POPAD 0040153D RET Non credo ci sia bisogno di commentarlo Se osservate la locazione in cui c' era il nome, ora avrete il vostro serial corretto. Adesso passiamo alla parte più interessante di questo CM, l' SMC. Per noi che stiamo usando un debugger, questo smc potrebbe sembrarci qualcosa di superfluo, poichè non ci arreca nessun disturbo. Provate invece a mettervi nei panni di chi ha usato IDA o un altro dasm posso assicurarvi che gli verrà un pochetto più difficile farne un keygen direttamente da dead-listing. 0040154B LEA EDI,[004014E9] ;locazione di destinazione 00401551 LEA ESI,[0040301C] ;locazione sorgente 00401557 MOV ECX,00000049 ;numero di bytes 49h --> 73 0040155C XOR EDX,EDX 0040155E LODSB 0040155F MOV DL,[EDI] 00401561 STOSB 00401562 MOV [ESI-01],DL 00401565 LOOP 0040165E 00401567 RET Questa è la routine SMC vera e propria, infatti i bytes puntati dalla locazione sorgente andranno a sovrascrivere quelli puntati dalla locazione destinazione. In ecx abbiamo il numero di bytes da copiare cioè 49h (73 bytes in tutto). Per questo motivo, la sezione .code, dovrà avere il flag Writeable settato, se fosse stato altrimenti, avremmo ottenuto un crash del programma stesso. Byesss