;┌────────────────────────────────────────────────────────────────────────────┐
;│█▓▒░ ░│
;│▓▒░ XorFile.ASM ░▒│
;│▒░ Copyright (C) 1997 ·─═■│Æ∩■═─· ░▒▓│
;│░ ░▒▓█│
;└────────────────────────────────────────────────────────────────────────────┘
include asm.inc
.model small
.stack 100h
.data
nBytes EQU 08000h
;┌────────────────────────────────────────────────────────────────────────────┐
;│ 6mb file w/ 1000h -> 22 s. , w/ 0f000h -> 14 s. (2mb cache flush =2-3 s.) │
;│ '' '' '' '' -> 48 s. , '''''''' -> 18 s. (no cache!) │
;│ compare with CLIPPER or C ! `8^) │
;│ the performance is most on Buffer Xor-ing, done at speed of light. │
;│ Amazing ─┐ │
;│ Superb ─┼─>ASM! │
;│ Marvellous─┘ │
;└────────────────────────────────────────────────────────────────────────────┘
;┌────────────────────────────────────────────────────────────────────────────┐
;│* Various data * │
;└────────────────────────────────────────────────────────────────────────────┘
logo db CR,LF
db "░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░",CR,LF
db "▒ ▒ ▒▒ ▒ ▒▒ ▒▒▒ ▒ ▒ ▒▒ ▒▒▒ ▒ ▒▒ ▒ ▒▒ ▒ ▒▒ ▒ ▒▒ ▒▒ ▒ ▒",CR,LF
db "▓▓▓▓ ▓ ▓▓ ▓ ▓▓▓▓ ▓▓▓ ▓ ▓▓ ▓ ▓▓ ▓ ▓▓ ▓▓ ▓▓▓ ▓▓ ▓ ▓▓▓ ▓▓ ▓ ▓▓▓▓▓ ▓ ▓▓▓ ▓▓ ▓ ▓ ▓ ▓",CR,LF
db "████ █ ██ █ ████ █ █ █ ██ █ ██ █ ███ █ ███ █ ██ ███ ██ █ █████ █ ███ ██ █ █ █ █",CR,LF
db " ░ ░░░░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░░░ ░ ░░ ░░░ ░ ░ ░ ░ ░░░ ░░░░ ░ ░ ░ ",CR,LF
db " ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓ ",CR,LF
db " █ █ █ ███ ██ ██ ████ █ █ ████ ███ █ █ █ ████ ███ █ ███ █ █ █ █ ",CR,LF
db "≡≡≡≡▒≡▒≡≡▒≡▒▒▒≡≡▒▒≡▒▒≡▒▒▒▒≡▒≡≡▒≡▒▒▒▒≡≡▒▒▒≡▒≡≡▒≡▒≡≡≡▒▒▒▒≡▒▒▒≡≡≡▒≡▒▒▒≡▒≡≡▒≡▒≡≡≡▒≡",CR,LF
db "====▒=▒▒▒▒=▒====▒=▒=▒=▒==▒=▒==▒=▒===▒=▒===▒==▒=▒===▒==▒=▒=====▒=▒===▒▒▒▒=▒===▒=",CR,LF
db "----▒-▒--▒-▒▒---▒-▒-▒-▒--▒-▒--▒-▒---▒-▒▒--▒-▒--▒▒▒-▒--▒-▒-----▒-▒▒--▒--▒-▒-▒-▒-",CR,LF
db "-▒▒▒▒-▒--▒-▒▒▒--▒---▒-▒▒▒▒-▒▒▒--▒▒▒▒--▒▒▒-▒▒▒▒-▒▒▒-▒--▒-▒--▒▒▒▒-▒▒▒--▒▒--▒▒-▒▒-",CR,LF
db "···············································································",CR,LF,LF
db " -<>- Proudly Presents -<>- ",CR,LF
db "─────═════[ XOR-File 0.4 FAST File Decrypter by ·─═φ│Æ∩φ═─· (C)1997 ]═════─────",CR,LF,LF
db EOM
nopar db " Syntax : XORFILE [InputFile] [XorValue]", CR,LF,LF
db " InputFile is the file you want to decrypt", CR,LF
db " Xorvalue is an hexadecimal number [00-FF]", CR,LF
db " The output will be assumed as DECRYPT.xxx", CR,LF
db EOM
xorvalue db 000h
outfle db "DECRYPT."
outext1 db "0"
outext2 db "0"
outext3 db "0"
outend db 00h,EOM
namfle db 128 dup(0)
handle dw 1 dup(0)
handle2 dw 1 dup(0)
str2Write db nBytes dup(0)
updok db " Successfully Decrypted!! ( " ,EOM
updend db ")",CR,LF,EOM
updko db "Input File not found!",CR,LF,EOM
updcre db "Create Error",CR,LF,EOM
toomany db "Too many DECRYPTed files found Here... Delete some!",CR,LF,EOM
readerr db "Read Error",CR,LF,EOM
;┌────────────────────────────────────────────────────────────────────────────┐
;│* Code Start * │
;└────────────────────────────────────────────────────────────────────────────┘
.code
.startup
@INIEXE
@SAY LOGO
;┌────────────────────────────────────────────────────────────────────────────┐
;│* Commandline parser * │
;└────────────────────────────────────────────────────────────────────────────┘
cmp byte ptr es:0080h, 00
jne @@get_file
@@errnopar:
@SAY nopar
jmp exitok
@@get_file:
mov di, 0082h ; (ES:DI) -> (DS:SI)
lea si, NAMFLE ; I know, LODSB is better
;xor cx,cx ; but i taken example from FONTLOAD.ASM
@@loc_loop:
mov al, byte ptr es:[di] ; EHI, TEO! BYTE PTR ES:DI DOESN'T ASSEMBLE!
cmp al, 0dh
je @@errnopar ; could not be here...
cmp al, 20h
je @@xorval_1 ; filename ended
mov byte ptr DS:[SI], al
inc di
inc si
;inc cx
;cmp cx, 80 ;; erm... I guess is a check for commandline length..
;jge @@errnopar ;; no, let's kick it...
jmp @@loc_loop
@@xorval_1:
inc di
mov al, byte ptr ES:[DI]
cmp al,30h ; 0
jb @@errnopar
cmp al,39h ; 9
ja ok9
sub al,30h ; chr->val "1"->01h
jmp @@shift
ok9:
and al,1011111b ; upper case
cmp al,41h ; A
jb @@errnopar
cmp al,46h ; F
ja @@errnopar
sub al,37h ; chr->val "A"->0ah
@@shift:
mov cl,4
shl al,cl ; 01->10,0f->f0
mov [xorvalue], al
inc di
@@xorval_2: ; ok,ok, it's redundant code...
mov al, byte ptr ES:[DI] ; but i needed to make it in a hurry!
cmp al,30h ; 0
jb @@errnopar
cmp al,39h ; 9
ja ok9_1
sub al,30h ; chr->val "1"->01h
jmp @@shift_1
ok9_1:
and al,1011111b ; upper case
cmp al,41h ; A
jb @@errnopar
cmp al,46h ; F
ja @@errnopar
sub al,37h ; chr->val "A"->0ah
@@shift_1:
add [xorvalue],al
;┌────────────────────────────────────────────────────────────────────────────┐
;│* Process File * │
;└────────────────────────────────────────────────────────────────────────────┘
@@carica:
LEA DX,NAMFLE
@DOS 3Dh,00100000b ; read-only + deny write
jnc ookk
jmp EXITKO
ookk:
MOV [HANDLE],AX
MOV CX,0H ;FSEEK 0
MOV DX,0H
MOV BX,[HANDLE]
@DOS 42H,0H
chkoutfle:
xor cx,cx
LEA DX,OUTFLE
@DOS 4EH,0H ; findfirst
jc Create
inc [outext3]
cmp [outext3] ,3ah ; ":"
jne chkoutfle
mov [outext3] ,30h ; "0"
inc [outext2]
cmp [outext2] ,3ah ; ":"
jne chkoutfle
mov [outext2] ,30h ; "0"
inc [outext1]
cmp [outext1] ,3ah ; ":"
jne chkoutfle
@SAY TOOMANY
JMP EXITOK
Create:
MOV CX,00100000B ;CREATE W/ARCHIVE ATTRIBUTE
LEA DX,OUTFLE
@DOS 3CH,0H
JC CREATERR
MOV [HANDLE2],AX
LOOPHERE:
MOV CX,nBytes ;READ nBytes CHAR
LEA DX,STR2WRITE ;PUT IT IN STR2WRITE
MOV BX,[HANDLE]
@DOS 3FH,0H
JC READERROR
OR AX,AX ; 0 BYTES READ: EOF
JZ FINISH
PUSH AX
MOV SI,0H
DECRYPT:
MOV AL, [STR2WRITE][SI]
XOR AL, [xorvalue]
;inc [xorvalue] ; variable xorvalue , maybe next...
MOV [STR2WRITE][SI] ,AL
INC SI
CMP SI,nBytes
JNE DECRYPT
LEA DX,STR2WRITE
POP AX ; WRITE EXACTLY [AX] BYTES READ
MOV CX,AX
MOV BX,[HANDLE2]
@DOS 40H
JMP LOOPHERE
FINISH:
@SAY UPDOK
@say outfle
@say updend
MOV BX,[HANDLE] ; close input file
@DOS 3EH
MOV BX,[HANDLE2] ; close output file
@DOS 3EH
JMP EXITOK
CREATERR:
@SAY UPDCRE
JMP EXITOK
READERROR:
@SAY READERR
JMP EXITOK
EXITKO:
@SAY UPDKO
EXITOK:
@DOS EXIT
END