00401153 $ 55 PUSH EBP
00401154 . 8BEC MOV EBP,ESP
00401156 . 68 B4304000 PUSH Ice9.004030B4 ; /String = "Zyrel"
0040115B . E8 42010000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA
00401160 . BA 6A314000 MOV EDX,Ice9.0040316A
00401165 . 8902 MOV DWORD PTR DS:[EDX],EAX ; infila nell indirizzo puntato da EDX la lunghezza del nick
00401167 . BF B4304000 MOV EDI,Ice9.004030B4 ; muove il nick in EDI
0040116C . BE 19314000 MOV ESI,Ice9.00403119 ; ASCII "370512621"
00401171 . 33C0 XOR EAX,EAX ; azzera EAX
00401173 . 33DB XOR EBX,EBX ; azzera EBX
00401175 . 33C9 XOR ECX,ECX ; azzera ECX
00401177 . 33D2 XOR EDX,EDX ; azzera EDX
00401179 . BA 6A314000 MOV EDX,Ice9.0040316A
0040117E . 8B12 MOV EDX,DWORD PTR DS:[EDX] ; muove la lunghezza del nick in EDX
00401180 > 83C3 01 ADD EBX,1 ; parte un ciclo for con il counter inizializzato ad 1
00401183 . 3BD3 CMP EDX,EBX ; compare la len con EBX (0)
00401185 . 74 15 JE SHORT Ice9.0040119C ; se è uguale salta
00401187 . 8A07 MOV AL,BYTE PTR DS:[EDI] ; Prende il primo carattere del nick e lo mette in AL
00401189 . 3C 5A CMP AL,5A ; controlla se il carattere è <= di 90
0040118B . 7E 05 JLE SHORT Ice9.00401192 ; se si salta al prossimo if
0040118D > 03C8 ADD ECX,EAX ; somma ECX con EAX (valore ASCII del char)
0040118F . 47 INC EDI ; incrementa EDI (variabile counter dell' iterazione)
00401190 .^ EB EE JMP SHORT Ice9.00401180 ; cicla di nuovo
00401192 > 3C 41 CMP AL,41 ; controlla che il char sia maggiore o uguale a 65
00401194 . 7D 02 JGE SHORT Ice9.00401198 ; se si (quindi se il carattere è MAIUSCOLO) salta
00401196 . EB 02 JMP SHORT Ice9.0040119A ; se no salta a 00401198
00401198 > 04 2C ADD AL,2C ; somma 44 al valore del char tenuto in EAX
0040119A >^ EB F1 JMP SHORT Ice9.0040118D ; somma EAX con ECX (004018D)
0040119C > 81C1 9A020000 ADD ECX,29A ; somma_char = somma_char + 666
004011A2 . 69C9 39300000 IMUL ECX,ECX,3039 ; somma_char = somma_char * 12345
004011A8 . 83E9 17 SUB ECX,17 ; somma_char = somma_char - 23
004011AB . 6BC9 09 IMUL ECX,ECX,9 ; somma_char = somma_char * 9
004011AE . 33DB XOR EBX,EBX ; azzera EBX
004011B0 . 8BC1 MOV EAX,ECX ; muove il seriale corretto (non completo) in EAX
004011B2 . B9 0A000000 MOV ECX,0A
004011B7 > 33D2 XOR EDX,EDX ; azzera EDX (che conteneva la len del nick)
004011B9 . F7F1 DIV ECX ; divide ECX
004011BB . 80C2 30 ADD DL,30 ; somma 30 a DL
004011BE . 881433 MOV BYTE PTR DS:[EBX+ESI],DL ; mette DL nell' indirizzo puntato
004011C1 . 83C3 01 ADD EBX,1 ; EBX + 1
004011C4 . 83F8 00 CMP EAX,0 ; compara il nostro seriale con 0
004011C7 . 74 02 JE SHORT Ice9.004011CB ; se lo è salta a 004011CB
004011C9 .^ EB EC JMP SHORT Ice9.004011B7 ; se no torna allo XOR ad 004011B7
004011CB > BF C8304000 MOV EDI,Ice9.004030C8 ; ASCII "126215073el"
004011D0 > 8A4433 FF MOV AL,BYTE PTR DS:[EBX+ESI-1] ; mette il char contenuto nell' indirizzo puntato in AL
004011D4 . 8807 MOV BYTE PTR DS:[EDI],AL ; AL và nel indirizzo puntato da EDI
004011D6 . 47 INC EDI ; aumenta EDI
004011D7 . 4B DEC EBX ; decrementa EBX
004011D8 . 83FB 00 CMP EBX,0 ; compara EBX con 0
004011DB .^ 75 F3 JNZ SHORT Ice9.004011D0 ; se non è = a = cicla di nuovo da 004011D0
004011DD . C607 00 MOV BYTE PTR DS:[EDI],0
004011E0 . 8D3D B4304000 LEA EDI,DWORD PTR DS:[4030B4]
004011E6 . 68 B7304000 PUSH Ice9.004030B7 ; prende le ultime due lettere del nick
004011EB . 68 C8304000 PUSH Ice9.004030C8 ; pusha la prima parte del serial
004011F0 . E8 BB000000 CALL Ice9.004012B0 ; concatena le due stringhe (prima parte numerica e ultimi 2 char)
004011F5 68 C8304000 PUSH Ice9.004030C8 ; ecco qui il nostro seriale!! :D