.model tiny .386 org 100h .data GroupLogo db 13,10 db ' ммммм ',13,10 db ' л м л ',13,10 db ' лпппппппп м ппппп п пппппппппппппппппппппл лппппппппппппппп п ппппл ',13,10 db ' л ГАллллллл ГВлллллллп ГАлллплппппппп п пппп ГАлллплпппппВллллВм л ',13,10 db ' л ГБллллллл ГВллллллл ГБллллллл ГВлллллллп ГБллллллл ГВллллллл л ',13,10 db ' л ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВллллллл л ',13,10 db ' п ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВллллллл лммм ',13,10 db ' п ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВлллллллм м л ',13,10 db ' л ГВллллллл ГВллллллл ГВллллллл ГВллллллл ГВллллллл л ',13,10 db ' л ГВлллллллмммммлмлВп ГВлллллллмммммлмлллл ГВлллллллпп п п л ',13,10 db ' лммммммммммммммммммммммммммм м мммммммммммммммммммммм п лппппппппп п пп ',13,10 db ' .::[ u n i t e d њ c r ‘ c k i n g њ f o r c e ]::. л п л Antibody ',13,10 db ' лммммммммммммммммммммммммммм м мммммммммммммммммммммм п лппппппппп п пп ',13,10 db ' -----=====----- ',13,10 db ' [ў] CSE HTML Validator v3.0x - Key Generator by Quantico [ў] ',13,10 db ' -----=====----- ',13,10 db ' ',13,10,'$' IntroMsgOne db 13,10,'Enter a name please : ','$' ErrorMsg db 13,10,'Need 8-20 digits, try again...',13,10,'$' ShowCodeMsg db 13,10,'Registration number : ' CodeBuffer db 30 dup(0),13,10,'$' NameBuffer db 18h, 100h dup(0) CopyName db 18h, 100h dup(0) Convert_Digs db '0123456789ABCDEF' namelength db 0 temp1 db 14 dup(0) temp2 db 14 dup(0) .code .startup main proc near mov ah, 09h ; lea edx, GroupLogo ; int 21h ; show group logo mov ah, 09h ; lea edx, IntroMsgOne ; int 21h ; show intro and ask for input mov bx, 1408h ; limits for string input lea edi, NameBuffer ; call getstr ; read user input jc @error ; xor eax, eax ; clear eax call keygen ; create serial number mov ah, 09h ; lea dx, ShowCodeMsg ; int 21h ; print serial number jmp @exit ; finished, quit @error: mov ah, 09h lea dx, ErrorMsg int 21h @exit: mov al, 00h ; mov ah, 4Ch ; int 21h ; terminate program main endp keygen proc near mov cl, byte ptr [namelength] cmp cl, 0Fh jge size_ok mov esi, offset NameBuffer+2 mov edi, offset CopyName rep movsb mov esi, offset NameBuffer+2 movzx ecx, byte ptr [namelength] mov edi, offset CopyName mov edx, ecx call cncstr mov byte ptr [namelength], cl size_ok: xor edx, edx mov cl, byte ptr [namelength] mov byte ptr [temp2], cl xor ecx, ecx xor edi, edi mov esi, offset CodeBuffer jmp @00431413 to_start: movsx ebx, byte ptr [NameBuffer+ecx+2] inc ecx movsx eax, byte ptr [NameBuffer+ecx+2] lea edx, dword ptr [eax+2*eax] add ebx, edx cmp byte ptr [NameBuffer+ecx+2], 00h je @004313CB inc ecx @004313CB: mov eax, ebx mov ebx, 1Dh cdq idiv ebx mov eax, edx add eax, 35h mov ebx, 0Ah cdq idiv ebx add dl, 30h mov byte ptr [esi+edi], dl inc edi mov al, byte ptr [temp1] cmp al, byte ptr [temp2] jge @00431413 movzx edx, byte ptr [temp1] movsx ebx, byte ptr [NameBuffer+2+edx] inc byte ptr [temp1] movzx eax, byte ptr [temp2] movsx edx, byte ptr [NameBuffer+2+eax] add ebx, edx xor edx, edx dec byte ptr [temp2] mov eax, ebx mov ebx, 0Ah cdq idiv ebx add dl, 30h mov byte ptr [esi+edi], dl inc edi @00431413: cmp byte ptr [NameBuffer+2+ecx], 00 jne to_start mov byte ptr [esi+edi], 00 jmp big_code_done not_short_enough: call make_shorter big_code_done: int 3 mov al, 00h call strlngth dec ecx cmp ecx, 08 ja not_short_enough ret keygen endp ; get string from user ; input : ; edi = pointer to buffer ; bl = min length ; bh = max length ; output : ; CF error, cx number of bytes read getstr proc near push dx ; save dx mov dx, di ; mov ah, 0Ah ; int 021h ; get user input movsx ecx, byte ptr [edi + 1] ; get number of digits mov byte ptr [edi + ecx + 2], 00h cmp cl, bh ; check maximum jg @@0 cmp cl, bl ; check minimum jl @@0 mov [namelength], cl ; store length xor ch, ch clc ; clear CF jmp @@1 @@0: stc ; set CF (carry flag) @@1: pop dx ; restore dx ret getstr endp ; returns ECX= length of String in DS:ESI - terminated by CHAR in AL ; registers changed: ECX ; Assumes ES=DS strlngth PROC pushf push edi push esi push edx mov edi,esi xor ecx,ecx dec ecx cld repnz scasb xor edx,edx sub edx,ecx dec edx mov ecx,edx pop edx pop esi pop edi popf Ret strlngth endp make_shorter PROC mov ebx, esi mov eax, ecx mov byte ptr [namelength], cl mov al, byte ptr [ebx+ecx-1] movzx edx, byte ptr [ebx] add edx, edx add eax, edx mov esi, 0Ah cdq idiv esi add dl, 30h push edx mov eax, ecx xor ecx, ecx mov cl, 05h cdq idiv ecx mov cl, byte ptr [namelength] pop eax mov byte ptr [ebx+edx], al mov byte ptr [ebx+ecx-1],00 mov esi, ebx Ret make_shorter endp ; concatenate 2 strings ; input : ; esi = string one, ecx = length string one ; edi = string two, edx = length string two ; output : ; esi = string one + string two, edx = new length cncstr proc near xor eax, eax ; xor ebp, ebp ; clear register push esi ; save esi add esi, ecx ; set esi at end of string one add ecx, edx ; adjust new length @cnc: mov al, byte ptr [edi + ebp] ; get digit of string two mov byte ptr [esi + ebp], al ; place digit after string one inc ebp ; dec edx ; jnz @cnc ; loop for length of string two pop esi ; restore esi mov byte ptr [esi - 1], cl ; update new length ret cncstr endp end main