home *** CD-ROM | disk | FTP | other *** search
- .model tiny
- .386
- Org 100h
- .data
-
- INTRONAME db 13,10,'Crypto v3.1 - Key Generator by Quantico [mEX/c4N]',13,10
- db 13,10,'Enter your name : ','$',13,10
-
- COMPANY db 13,10,'Enter your company : ','$',13,10
-
- DUMBO db 13,10,'You must enter something...',13,10,'$'
-
-
- STORENAME db 18h, 19h dup(0)
- STORECOMP db 18h, 19h dup(0)
-
- THEIRCODE db 13,10,'Your code is : '
- STORECODE db 10 dup(0),13,10,'$'
-
- DATATABLE1 db '#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtKpzSdtzoXqmb^Al@dv:s?x/'
- DATATABLE2 db '|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw'
-
- Convert_Digs db '0123456789ABCDEF'
-
- .code
- .startup
-
- MAIN PROC NEAR
-
- MOV AH, 09h
- MOV DX, OFFSET INTRONAME
- INT 21h ; show the lovely intro and
- ; ask for our name
- MOV AH, 0Ah
- MOV DX, OFFSET STORENAME
- INT 21h ; get what they typed
- CMP BYTE PTR [STORENAME+1], 0 ; did they enter nothing ?
- JE DUMB ; then tell them
-
- MOV AH, 09h
- MOV DX, OFFSET COMPANY ; ask for company
- INT 21h
-
- MOV AH, 0Ah
- MOV DX, OFFSET STORECOMP
- INT 21h ; get input
- CMP BYTE PTR [STORECOMP+1], 0 ; enter nothing ?
- JE DUMB ; tell them
-
- CALL MAKEKEY ; the main procedure
-
- MOV AH, 09h
- MOV DX, OFFSET THEIRCODE ; show them the code
- INT 21h
- JMP FINISH ; go to quit
-
- DUMB:
- MOV AH, 09h
- MOV DX, OFFSET DUMBO ; tell them to enter something
- INT 21h
-
- FINISH:
- MOV AH, 4Ch
- INT 21h ; quit program
-
- MAIN ENDP
-
- MAKEKEY PROC NEAR
-
- MOV ESI, 0C69AA96Ch ; esi = C69AA96C
- OR ESI, 000000378h ;
- PUSH ESI ; save result for use later
- LEA ESI, STORENAME+2 ; esi = name
- MOVSX EAX, BYTE PTR [ESI-1] ; eax = namelength
- CALL NEXTSTAGE ; make first calculations
- POP ESI ; restore esi
- ADD ESI, EAX ; then add the call result
- PUSH ESI ; save it again
- LEA ESI, STORECOMP+2 ; esi = company
- MOVSX EAX, BYTE PTR [ESI-1] ; eax = companylength
- CALL NEXTSTAGE ; make second calculations
- POP ESI ; restore esi
- ADD EAX, ESI ; add both parts
-
- XOR EBX, EBX ; clear ebx
- XOR EDX, EDX ; clear edx
- MOV EDI, OFFSET STORECODE ; place to put the string of the code
- MOV ECX, 10d ; number base 10
- CALL convert_num ; number2string so we can print it
- RET ; return
- MAKEKEY ENDP
-
- NEXTSTAGE PROC NEAR
- XOR EDI, EDI
- XOR ECX, ECX
- GETMORE:
- MOVSX EBX, BYTE PTR [EAX+ECX+DATATABLE1]
- MOVSX EBP, BYTE PTR [ECX+ESI]
- LEA EDX, DWORD PTR [ECX+01]
- IMUL EBX, EBP
- MOVSX ECX, BYTE PTR [ECX+DATATABLE2]
- IMUL EBX, ECX
- IMUL EBX, EDX
- ADD EDI, EBX
- MOV ECX, EDX
- CMP EDX, EAX ; end of input ?
- JL GETMORE ; if not, go for more
- MOV EAX, EDI ; eax = call result
- RET
- NEXTSTAGE 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
- 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
-