.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 ' [ў] File Usage Monitor 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 5-20 digits, try again...',13,10,'$' ShowCodeMsg db 13,10,'Registration number : ' CodeBuffer db 10h dup(0),13,10,'$' Code2Buffer db 5h dup(0),00h Code3Buffer db 5h dup(0),00h NameBuffer db 18h, 50h dup(0) CopyName db 18h, 50h dup(0) Convert_Digs db '0123456789ABCDEF' namelength db 00,00,00 filename db 'FILE_MON.EXE',00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 filename2 db 'FILE_MON.EXE' .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, 1405h ; limits for string input lea edi, NameBuffer ; mov esi, offset namelength 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 int 3 ; debugging mov esi, offset NameBuffer+2 mov edi, offset CopyName movzx ecx, byte ptr [namelength] rep movsb mov esi, offset CopyName movzx ecx, byte ptr [namelength] call upcase mov esi, offset filename mov ecx, 0Ch mov edi, offset CopyName movzx edx, byte ptr [namelength] call cncstr mov cl, byte ptr [esi-1] xor ebx, ebx xor eax, eax call nextpart xor edx, edx mov eax, ebx mov ecx, 00000010h lea edi, Code2Buffer call convert_num mov esi, offset copyname movzx ecx, byte ptr [namelength] mov edi, offset filename2 xor edx, edx mov dl, 0Ch call cncstr mov cl, byte ptr [esi-1] xor ebx, ebx xor eax, eax call nextpart xor edx, edx mov eax, ebx mov ecx, 00000010h lea edi, Code3Buffer call convert_num mov esi, offset Code2Buffer mov al, 00 call strlngth dec ecx mov esi, offset Code2Buffer mov edi, offset CodeBuffer rep movsb mov byte ptr [edi], 2Dh inc edi mov esi, offset Code3Buffer mov al, 00 call strlngth dec ecx mov esi, offset Code3Buffer rep movsb ret keygen endp nextpart proc near loopit: mov al, byte ptr [esi+ecx-1] add ebx, eax dec cl jnz loopit cmp ebx, 64h jge morethan64 add ebx, 64h morethan64: mov eax, ebx mov ecx, 0Ah xor edx, edx idiv ecx cmp edx, 1 jne move1 add ebx, 7 jmp moveon move1: cmp edx, 2 jne move2 sub ebx, 0Bh jmp moveon move2: cmp edx, 3 jne move3 add ebx, 13h jmp moveon move3: cmp edx, 4 jne move4 sub ebx, 1Ch jmp moveon move4: cmp edx, 5 jne move5 add ebx, 18h jmp moveon move5: cmp edx, 6 jne move6 sub ebx, 3 jmp moveon move6: cmp edx, 7 jne move7 add ebx, 2Ch jmp moveon move7: cmp edx, 8 jne move8 sub ebx, 43h jmp moveon move8: cmp edx, 9 jne move9 add ebx, 15h jmp moveon move9: add ebx, 23h moveon: add bl, byte ptr [esi] add bl, byte ptr [esi+1] mov cl, byte ptr [esi-1] add bl, byte ptr [esi+ecx-1] add bl, byte ptr [esi+ecx-2] sub bl, byte ptr [esi+2] sub bl, byte ptr [esi+3] mov eax, ebx and eax, 80000007h jns down dec eax or eax, -08 inc eax down: cmp eax, 1 jne not1 add ebx, 2 jmp moveon2 not1: cmp eax, 2 jne not2 add ebx, 5 jmp moveon2 not2: cmp eax, 3 jne not3 sub ebx, 0Fh jmp moveon2 not3: cmp eax, 4 jne not4 inc ebx jmp moveon2 not4: cmp eax, 5 jne not5 sub ebx, 0Dh jmp moveon2 not5: cmp eax, 6 jne not6 add ebx, 0Dh jmp moveon2 not6: cmp eax, 7 jne not7 add ebx, 7 jmp moveon2 not7: sub ebx, 3 moveon2: ret nextpart 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 byte ptr [esi], 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 ; 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 ; 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 upcase PROC pushf pushad nextletter: ; EBX = No. of letters MOV AL,[ESI] ; EDX = INTEXT CMP AL,61h JB notlowcase CMP AL,7Ah JA notlowcase SUB AL,20h ; Lowcase - make it upcase MOV [ESI],AL notlowcase: INC ESI DEC ECX TEST ECX,ECX JNZ nextletter popad popf Ret Upcase 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 end main