.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 ' [ў] ActiveX Manager v1.3 - 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 : 6577-' oneletter db 0 CodeBuffer db 20 dup(0),13,10,'$' NameBuffer db 18h, 19h dup(0) Convert_Digs db '0123456789ABCDEF' namelength db 0 temp db 0 temp2 db 0 datatable1 db '87ae2401my69' .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 xor edx, edx movzx eax, byte ptr [namelength] mov ecx, 05 div ecx mov eax, offset datatable1 mov al, byte ptr [eax+edx] mov byte ptr [oneletter], al xor eax, eax xor edx, edx to_start: mov ecx, 03 movzx eax, byte ptr [temp] xor edx, edx div ecx test edx, edx jne @00401742 movzx eax, byte ptr [temp] mov al, byte ptr [NameBuffer+eax+2] cbw mov cl, 02 idiv cl add al, 20h cmp al, 5Ah jle @00401714 cmp al, 61h jge @00401714 add al, 06 @00401714: cmp al, 39h jle @0040171E cmp al, 41h jge @0040171E add al, 08 @0040171E: movzx edx, byte ptr [temp2] inc byte ptr [temp2] mov esi, offset CodeBuffer add esi, edx mov byte ptr [esi], al @00401742: mov ecx, 0Dh movzx eax, byte ptr [temp] xor edx, edx div ecx test edx, edx jne @0040177A mov esi, offset CodeBuffer mov al, 00h call strlngth dec ecx mov byte ptr [CodeBuffer+ecx], 'x' inc byte ptr [temp2] @0040177A: inc byte ptr [temp] push eax movzx eax, byte ptr [namelength] cmp al, byte ptr [temp] pop eax ja to_start mov esi, offset CodeBuffer mov al, 00h call strlngth dec ecx mov byte ptr [CodeBuffer+ecx], 'z' ; xor edx, edx ; mov ecx, 0000000Ah ; lea edi, CodeBuffer ; call convert_num 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 Convert_Num proc near pushf pushAD sub esp, 4 mov ebp,esp cld mov esi, edi push esi ;--- loop for each digit sub bh, bh mov dword ptr [ebp], eax ;save low word mov dword ptr [ebp+4], edx ;save high word sub esi, esi ;count digits Connum1: inc esi mov eax, dword ptr [ebp+4] ;high word of value sub edx, edx ;clear for divide sub ebx, ebx div ecx ;divide, DX gets remainder mov dword ptr [ebp+4],eax ;save quotient (new high word) mov eax, dword ptr [ebp] ;low word of value div ecx ;divide, DX gets remainder ; (the digit) mov dword ptr [ebp], eax ;save quotient (new low word) mov bl, dl mov al, byte ptr [Convert_Digs+ebx] ;get the digit stosb ;store cmp dword ptr [ebp], 0 ;check if low word zero jne Connum1 ;jump if not cmp dword ptr [ebp+4], 0 ;check if high word zero jne Connum1 ;jump if not sub al, al stosb ;store the terminator ;--- reverse digits pop ecx ;restore start of string xchg ecx, esi shr ecx, 1 ;number of reverses jz Connum3 ;jump if none xchg edi, esi sub esi, 2 ;point to last digit Connum2 : mov al, byte ptr [edi] ;load front character xchg al, byte ptr [esi] ;swap with end character stosb ;store new front character dec esi ;back up loopd Connum2 ;loop back for each digit ;--- finished Connum3 : add esp, 4 popad popf ret endp ;Convert_Num ; 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 end main