.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 ' [ў] All Ilium Software - Key Generator by Quantico [ў] ',13,10 db ' -----=====----- ',13,10 db ' ',13,10,'$' IntroMsgOne db 13,10,'Enter a name please : ','$' Whichproduct db 13,10 db '',13,10 db '(1) - eWallet v1.2.1T ',13,10 db '(2) - Keep Track v2.0.1T ',13,10 db '(3) - ListPro v1.1.0T ',13,10 db '(4) - Recordian v1.0.2T ',13,10 db '',13,10 db 'Enter a product (1-4) : ','$',13,10 db ' ',13,10 ErrorMsg db 13,10,'Need 5-25 digits, try again...',13,10,'$' ShowCodeMsg db 13,10,'Registration number : ' CodeBuffer db 20 dup(0),13,10,'$' NameBuffer db 18h, 19h dup(0) ProdBuffer db 18h, 2 dup(0) Convert_Digs db '0123456789ABCDEF' namelength db 0 ewallet db 'eWallet95',0 keeptrack db 'KeepTrack95',0 listpro db 'ListPro95',0 recordian db 'Recordian95',0 mess db 13 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, 1905h ; limits for string input lea edi, NameBuffer ; call getstr ; read user input jc @error ; mov ah, 09h ; lea edx, Whichproduct ; int 21h ; show product message and ask for input xor edi, edi xor esi, esi lea edi, ProdBuffer ; call getprod ; read user input 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 ; for debugging lea dx, ProdBuffer+2 ; number of product movsx eax, byte ptr [edx] ; in eax cmp ax, 31h ; less than 1 ? jl no_code ; (just some error checking:) cmp ax, 34h ; greater than 4 ? jg no_code mov edi, offset mess ; area to store string for whatever ; product the user selected cmp ax, 31h jnz @keeptrack mov esi, offset ewallet mov ecx, 9 rep movsb ; copy string for whatever product jmp selected @keeptrack: cmp ax, 32h jnz @listpro mov esi, offset keeptrack mov ecx, 0Bh rep movsb jmp selected @listpro: cmp ax, 33h jnz @recordian mov esi, offset listpro mov ecx, 9h rep movsb jmp selected @recordian: mov esi, offset recordian mov ecx, 0Bh rep movsb selected: mov ebx, offset NameBuffer+2 ; ebx = start of name mov esi, offset mess ; esi = product specific string mov al, byte ptr [esi] ; al = byte of string mov dl, byte ptr [ebx] ; dl = byte of name xor ecx, ecx ; ecx = 0 back_up: cmp al, 20h ; does al = ' ' jz get_next_letter ; if so, skip calculation and get next ; letter movsx eax, al ; eax = al mov ebx, ecx mov ebp, eax and ebx, 1 and ebp, 0Fh shl ebx, 8 sub ebp, ebx and eax, 70h shl ebp, 7 add ebp, eax mov ebx, offset NameBuffer+2 shr ecx, 1 shl ebp, 4 and ecx, 7FFFFh add ebp, ecx not ebp and ebp, 0FFFFFh mov ecx, ebp mov ebp, 20h get_next_letter: mov al, byte ptr [esi+1] inc esi test al, al jnz back_up back_up_2: cmp dl, 20h jz next_letter_2 movsx eax, dl mov edx, ecx mov esi, eax and edx, 7FFFFh and esi, 0Fh shr ecx, 13h lea edx, [esi*4+edx] and ecx, 1 sar eax, 4 lea ecx, [edx*2+ecx] and eax, 7 add ecx, eax not ecx and ecx, 0FFFFFh next_letter_2: mov dl, byte ptr [ebx+1] inc ebx test dl, dl jnz back_up_2 test ecx, ecx jz no_code mov edi, offset CodeBuffer back_up_3: cmp ebp, 1 jle finish mov eax, ecx xor edx, edx mov esi, 0Ah div esi mov eax, 0CCCCCCCDh add dl, 30h mov byte ptr [edi], dl mul ecx shr edx, 3 inc edi mov ecx, edx dec ebp finish: test ecx, ecx jnz back_up_3 mov byte ptr [edi],00 no_code: ret ; end of procedure, return to caller 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 21h ; 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 getprod 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 xor ch, ch clc ; clear CF pop dx ; restore dx ret getprod endp end main