.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 Software by Design Products - Key Generator by Quantico [ў] ',13,10 db ' -----=====----- ',13,10 db ' ',13,10,'$' Whichproduct db 13,10 db ' ',13,10 db '(1) - Audition v2.8 ',13,10 db '(2) - BattleStar v2.5 ',13,10 db '(3) - Cardbase v2.6 ',13,10 db '(4) - Crypto v3.1 ',13,10 db '(5) - Disk clean up v3.1 ',13,10 db '(6) - DLL show v3.3 ',13,10 db '(7) - FXedit v2.8 ',13,10 db '(8) - Font Show v2.7 ',13,10 db '(9) - IconExtractor v3.0 ',13,10 db '(10) - Notebook v4.2 ',13,10 db '(11) - Password keeper v3.7 ',13,10 db '(12) - Programmers IDE v2.4 ',13,10 db '(13) - Reminders v3.3 ',13,10 db '(14) - RGB v3.0 ',13,10 db '(15) - Screen Loupe v3.9 ',13,10 db '(16) - Shredder v2.3 ',13,10 db '(17) - Submit It v2.3 ',13,10 db '(18) - Toolbar v4.5 ',13,10 db '(19) - Txedit 4.0 ',13,10 db '',13,10 db 'Enter a product (1-19) : ','$',13,10 db ' ',13,10 IntroMsgOne db 13,10,' Enter a name : ','$' IntroMsgTwo db 13,10,' Enter company name : ','$' ErrorMsg db 13,10,' Need 2-20 digits, try again...',13,10,'$' ShowCodeMsg db 13,10,'Registration number : ' CodeBuffer db 10 dup(0),13,10,'$' NameBuffer db 18h, 19h dup(0) CompBuffer db 18h, 19h dup(0) ProdBuffer db 18h, 19h dup(0) DataTableOne db '#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtKpzSdtzoXqmb^Al@dv:s?x/' DataTableTwo db '|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw' Convert_Digs db '0123456789ABCDEF' .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, 1402h lea edi, NameBuffer ; call getstr ; read user input jc @error ; mov ah, 09h ; lea edx, IntroMsgTwo ; int 21h ; show intro and ask for input mov bx, 1402h lea edi, CompBuffer ; call getstr ; read user input jc @error ; mov ah, 09h ; lea edx, Whichproduct ; int 21h ; show product message and ask for input lea edi, ProdBuffer ; call getprod ; read user input xor eax, eax ; clear eax lea dx, ProdBuffer+2 ; put what they typed into ax movsx eax, byte ptr [edx] cmp ax, 31h ; is ax = 1? je @digit2 ; go to check second digit (10-18) cmp ax, 32h ; is ax = 2 je @battlestar ; then go to battlestar cmp ax, 33h ; is ax = 3 je @cardbase ; cmp ax, 34h ; je @crypto ; cmp ax, 35h ; ax = 5 ? je @diskclean cmp ax, 36h ; ax = 6 ? je @dllshow cmp ax, 37h ; ax = 7 ? je @fileed cmp ax, 38h ; ax = 8 ? je @fontshow cmp ax, 39h ; ax = 9 ? je @iconex @digit2: ; checks the second digit of movsx eax, byte ptr [edx+01] ; user input test eax, eax ; is there no digit 2 ? je @audition ; then they entered 1 cmp eax, 30h ; is it a 0 ? (10) je @notebook cmp eax, 31h ; did they enter 11? je @passkeep cmp eax, 32h ; did they enter 12? je @program cmp eax, 33h ; 12 ? je @remind cmp eax, 34h ; 13 ? je @rgb cmp eax, 35h ; 14 ? je @sloupe cmp eax, 36h ; 15 ? je @shredder cmp eax, 37h ; 16 ? je @submit cmp eax, 38h ; 17 ? je @toolbar cmp eax, 39h ; 18 ? je @txedit @audition: mov esi, 0AD10DADEh jmp @continue @battlestar: mov esi, 0ABADDEEDh jmp @continue @cardbase: mov esi, 0CDB95840h jmp @continue @crypto: mov esi, 0C69AA96Ch jmp @continue @diskclean: mov esi, 0DC9559CDh jmp @continue @dllshow: mov esi, 0DB95DB95h jmp @continue @fileed: mov esi, 0FEDAADEFh jmp @continue @fontshow: mov esi, 0F950059Fh jmp @continue @iconex: mov esi, 0ED0990DEh jmp @continue @notebook: mov esi, 0BEDABABEh jmp @continue @passkeep: mov esi, 00ABCDEF0h jmp @continue @program: mov esi, 0CC0DEFEDh jmp @continue @remind: mov esi, 0DEEDDEEDh jmp @continue @rgb: mov esi, 0C0DEABDEh jmp @continue @sloupe: mov esi, 0ABED0F00h jmp @continue @shredder: mov esi, 095989598h jmp @continue @submit: mov esi, 098954035h jmp @continue @toolbar: mov esi, 080888088h jmp @continue @txedit: mov esi, 0EDC0DEEDh jmp @continue @continue: 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 or esi, 000000378h push esi lea esi, NameBuffer + 2 movsx eax, byte ptr [esi - 1] call keysub pop esi add esi, eax push esi lea esi, CompBuffer + 2 movsx eax, byte ptr [esi - 1] call keysub pop esi add eax, esi xor edx, edx mov ecx, 0000000Ah lea edi, CodeBuffer call convert_num ret keygen endp keysub proc near xor edi, edi xor ecx, ecx @more: movsx ebx, byte ptr [eax + ecx + DataTableOne] ; byte namelength+count+datetable movsx ebp, byte ptr [esi + ecx] ; byte of count+name lea edx, dword ptr [ecx + 1] ; counter increase imul ebx, ebp ; movsx ecx, byte ptr [ecx + DataTableTwo] imul ebx, ecx ; ebx*ecx imul ebx, edx ; ebx*edx add edi, ebx ; edi = edi+ebx mov ecx, edx ; set counter cmp edx, eax ; end of name ? jl @more ; go back for more mov eax, edi ; eax = code ret keysub 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 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 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