; Author can be email at: stone@one.se ;> .model SMALL .stack 100h .386 .DATA input DB 39,0 uname DB 39 dup (0h) d47503c dd 0e3h ; This is used as initial value for IMUL valid DB 10,13,'A valid key is: ' realkey db 12 dup (30h) ; Serial number is 12 digits long enstr db 10,13,'$' ; Write termination flaffer db 39 dup (0) ; Used for the high/low bit cleaned string introtxt DB ' QuickCab 6.2 *Keymaker* ',10,13 DB 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ| STONE |ÄÄÄÄÄÄÄÄÄÄÄÄÄÄ',10,13 DB ' ÜÜÜ ÜÜÜ ÜÜÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜÜÜ ',10,13 DB ' ÛÛÛ ÛÛÛ ÛÛÛ ÛÛÛÜÜÜ ',10,13 DB ' ÛÛÛÜ ÛÛÛ ÛÛÛÜ ÛÛÛ ',10,13 DB ' ßßßßßßßßß ßßßßßßßßß ßßß ',10,13 DB 'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ',10,13 DB 'u N I T E D c R ’ C K I N G f O R C E ',10,13 DB '[wIN95/NT]ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[oCT 1997]',10,13 DB 'Enter your username: ','$' DB '2nd&mi' ; Personal tag - not used .CODE MOV AX, @DATA ; Make DS&ES point to the DATA MOV DS, AX MOV ES, AX LEA EDX, [introtxt] ; Write intro text MOV AH, 9h INT 21h MOV AX, 0A00h LEA EDX, [input] INT 21h ; Get buffered input movzx ebx, [input+1] ; Fetch length cmp ebx,0 ; if zero - exit jz exit call upcase ; Uppercase input string call cleanit ; Clean it for high/lowbit chars xor esi,esi ; Zero Counter NextByte: movzx eax, byte ptr [input+1] ; Get length CALL genkey ; Deciede on a letter to use for num-gen movzx ebx,[flaffer+edx] nextitera: ; Generate a digit of the serial MOV EAX,0Ah CALL GENKEY DEC BL JNZ nextitera add byte ptr [realkey+esi],dl ; Make it a digit inc esi ; next byte cmp esi,12d jnz nextbyte mov ah,09h ; Write the key lea edx,[valid] int 21h exit: MOV AX,4C00h ; Exit, error code = 0 INT 21h genkey proc ; Work horse of the keymaker IMUL EDX,[d47503C],08088405h INC EDX MOV [d47503C],EDX MUL EDX MOV EAX,EDX RET genkey endp upcase PROC lea edx, [uname] mov esi,edx nextletter: ; EBX = No. of letters MOV AL,[EDX] ; EDX = INTEXT CMP AL,61h JB notlowcase CMP AL,7Ah JA notlowcase SUB AL,20h ; Lowcase - make it upcase MOV [ESI],AL notlowcase: INC EDX INC ESI DEC EBX TEST EBX,EBX JNZ nextletter Ret Upcase endp cleanit PROC lea edi, [flaffer] ; Store output here lea esi, [uname] ; Get input from here movzx ecx,[input+1] ; Fetch the length nextb: movzx eax,byte ptr [esi] ; Fetch a letter cmp eax,48 ; Is it low bit? jb skip cmp eax,90 ; is it high bit? jg skip movsb ; no - copy it as it is dec ecx ; move on to next letter jnz nextb ret skip: inc esi ; skip it dec byte ptr [input+1] ; decrease length of string dec ecx ; next letter jnz nextb ret cleanit ENDP END