mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-25 04:45:27 +00:00
203 lines
4.2 KiB
NASM
203 lines
4.2 KiB
NASM
|
TITLE DRIP 5-26-87 [4-21-88]
|
|||
|
|
|||
|
;Goes TSR, activate/toggle with Scroll Lock key.
|
|||
|
;Characters randomly drip down/off the screen
|
|||
|
|
|||
|
LF EQU 0AH
|
|||
|
CR EQU 0DH
|
|||
|
;
|
|||
|
|
|||
|
Cseg SEGMENT
|
|||
|
ASSUME DS:Cseg, SS:Cseg ,CS:Cseg ,ES:Cseg
|
|||
|
ORG 100H
|
|||
|
|
|||
|
|
|||
|
Drip proc near
|
|||
|
JMP Start
|
|||
|
|
|||
|
int8Vec dd 0 ;save old Int 8 vector
|
|||
|
saveDI dw 0
|
|||
|
saveSI dw 0
|
|||
|
|
|||
|
video dw 0B000H ;default mono screen memory
|
|||
|
|
|||
|
wcntr_13A dw 40H ;counter
|
|||
|
byte_13C DB 0FFH
|
|||
|
bflag_13D DB 0
|
|||
|
bcntr_13E DB 0
|
|||
|
bflag_13F DB 0
|
|||
|
bcntr_140 DB 0
|
|||
|
word_2BE dw 0
|
|||
|
Drip endp
|
|||
|
|
|||
|
|
|||
|
NewInt8 proc far
|
|||
|
ASSUME DS:Nothing
|
|||
|
|
|||
|
PUSHF ;save user's flags
|
|||
|
PUSH AX ;and his Int 8 request
|
|||
|
MOV AH,2 ;get shift status
|
|||
|
INT 16H
|
|||
|
AND AL,10H ;mask for Scroll Lock key
|
|||
|
JZ Continue_Int8 ; continue to Int 8
|
|||
|
CMP CS:bcntr_13E,0 ;counter zeroed?
|
|||
|
JZ L01A0 ; yep, time to act
|
|||
|
DEC CS:bcntr_13E ;decr counter
|
|||
|
JMP SHORT Continue_Int8
|
|||
|
|
|||
|
L01A0: CMP CS:bflag_13D,0 ;flag set?
|
|||
|
JNZ Continue_Int8 ; yep, just continue to Int 8
|
|||
|
JMP SHORT L01B2 ;time to act
|
|||
|
|
|||
|
Continue_Int8:
|
|||
|
POP AX ;restore user's Int 8 svc
|
|||
|
POPF ;restore user's flags
|
|||
|
JMP CS:int8Vec ;jump to old Int 8
|
|||
|
|
|||
|
L01B2: PUSHF ;save flags
|
|||
|
CALL CS:int8Vec ;call old Int 8
|
|||
|
PUSH ES ;save all his regs
|
|||
|
PUSH DS
|
|||
|
PUSH DX
|
|||
|
PUSH CX
|
|||
|
PUSH DI
|
|||
|
PUSH SI
|
|||
|
mov ax,CS
|
|||
|
mov DS,ax
|
|||
|
ASSUME DS:Cseg
|
|||
|
|
|||
|
MOV AX,video
|
|||
|
MOV ES,AX
|
|||
|
ASSUME ES:Nothing
|
|||
|
|
|||
|
cmp bflag_13F,0 ;flag clear?
|
|||
|
JZ L01D9 ; yep
|
|||
|
MOV DI,saveDI ;get our screen pointers
|
|||
|
MOV SI,saveSI
|
|||
|
STI ;enable ints
|
|||
|
JMP SHORT MoveChar ;go to work
|
|||
|
|
|||
|
L01D9: MOV bflag_13D,0FFH ;set flag
|
|||
|
STI ;enable interrupts
|
|||
|
MOV bcntr_140,64H ;refresh counter
|
|||
|
Lup1E4: CMP bcntr_140,0 ;zeroed out?
|
|||
|
JNZ L01EE ; nope
|
|||
|
JMP Pop_Iret ; return
|
|||
|
|
|||
|
L01EE: DEC bcntr_140 ;count down
|
|||
|
CALL L02AC
|
|||
|
AND AX,0FFEH
|
|||
|
MOV SI,AX
|
|||
|
MOV AL,ES:[SI]
|
|||
|
CMP AL,20H ;just a space?
|
|||
|
JZ Lup1E4 ; yep, try again
|
|||
|
or al,al ;just a zero?
|
|||
|
JZ Lup1E4 ; yep, try again
|
|||
|
CMP SI,0FA0H ;screen bottom?
|
|||
|
JNB Lup1E4 ; not yet, try again
|
|||
|
MOV DI,SI ;point to new char location
|
|||
|
ADD DI,0A0H ;move this far each time (1 line)
|
|||
|
CMP DI,0FA0H ;screen bottom?
|
|||
|
JNB L025B ;not yet, continue
|
|||
|
MOV AL,ES:[DI] ;get char at new location
|
|||
|
CMP AL,20H ;just a space?
|
|||
|
JZ Save_Iret ;yep, save screen ptrs, Iret
|
|||
|
or al,al ;just a zero?
|
|||
|
JNZ Lup1E4 ; yep, continue
|
|||
|
Save_Iret:
|
|||
|
MOV saveDI,DI ;save screen pointers
|
|||
|
MOV saveSI,SI
|
|||
|
MOV bflag_13F,0FFH ;reset flag
|
|||
|
JMP SHORT Pop_Iret ;return
|
|||
|
|
|||
|
MoveChar:
|
|||
|
MOV bflag_13F,0 ;turn flag off
|
|||
|
MOV AL,ES:[SI] ;snarf screen char
|
|||
|
MOV ES:[DI],AL ;move it here
|
|||
|
MOV BYTE PTR ES:[SI],20H ;blank out old char
|
|||
|
MOV SI,DI
|
|||
|
ADD DI,0A0H
|
|||
|
CMP DI,0FA0H ;screen bottom?
|
|||
|
JNB L025B ; not yet
|
|||
|
MOV AL,ES:[DI] ;get char
|
|||
|
CMP AL,20H ;just a space?
|
|||
|
JZ Save_Iret ; yep, save ptrs, Iret
|
|||
|
or al,al ; a 0?
|
|||
|
JZ Save_Iret ; yep, save ptrs, Iret
|
|||
|
JMP SHORT L025F
|
|||
|
|
|||
|
L025B: MOV BYTE PTR ES:[SI],20H ;stuff space on screen
|
|||
|
L025F: DEC wcntr_13A ;decrement counter
|
|||
|
JNZ L026F
|
|||
|
SHR byte_13C,1
|
|||
|
MOV wcntr_13A,40H ;refresh counter
|
|||
|
L026F: CALL L02AC
|
|||
|
AND AL,byte_13C
|
|||
|
MOV bcntr_13E,AL
|
|||
|
Pop_Iret:
|
|||
|
POP SI
|
|||
|
POP DI
|
|||
|
POP CX
|
|||
|
POP DX
|
|||
|
POP DS
|
|||
|
POP ES
|
|||
|
POP AX
|
|||
|
POPF
|
|||
|
MOV CS:bflag_13D,0 ;clear flag
|
|||
|
IRET
|
|||
|
NewInt8 endp
|
|||
|
|
|||
|
L02AC proc near
|
|||
|
MOV AX,word_2BE
|
|||
|
PUSH AX
|
|||
|
AND AH,0B4H
|
|||
|
POP AX
|
|||
|
JPE L02B7
|
|||
|
STC
|
|||
|
L02B7: RCL AX,1
|
|||
|
MOV word_2BE,AX
|
|||
|
RET
|
|||
|
L02AC endp
|
|||
|
|
|||
|
|
|||
|
Start proc near
|
|||
|
MOV ax,3508H ;get Int8 vector
|
|||
|
INT 21H
|
|||
|
mov word ptr int8Vec,bx ;save ofs
|
|||
|
mov word ptr int8Vec+2,ES ;save seg
|
|||
|
|
|||
|
MOV AH,2CH ;get DOS system time
|
|||
|
INT 21H
|
|||
|
MOV word_2BE,DX ;save seconds, deciseconds
|
|||
|
MOV bcntr_13E,0FFH ;refresh counter
|
|||
|
MOV AH,0FH ;get current video mode
|
|||
|
INT 10H
|
|||
|
CMP AL,6 ;?
|
|||
|
JZ Use_Mono ; yep
|
|||
|
CMP AL,7 ;mono?
|
|||
|
JZ Use_Mono ;yep
|
|||
|
MOV video,0B800H ;use color screen
|
|||
|
|
|||
|
Use_Mono:
|
|||
|
MOV DX,OFFSET NewInt8 ;DS:dx = our service
|
|||
|
mov ax,2508H ;set new Int 8 vector
|
|||
|
INT 21H
|
|||
|
|
|||
|
MOV DX,offset Start ;program end
|
|||
|
MOV CL,4
|
|||
|
SHR DX,CL ;compute size in paras
|
|||
|
INC DX ;safeside
|
|||
|
MOV AH,31H ;advanced TSR
|
|||
|
INT 21H
|
|||
|
|
|||
|
DB 'DRIP Version 2.01',0 ;,CR,LF
|
|||
|
DB 'G. Masters 5/25/87',0 ;,CR,LF
|
|||
|
db 'Toad Hall 880421',0
|
|||
|
; DB 1AH
|
|||
|
; DB 90H
|
|||
|
Start endp
|
|||
|
|
|||
|
|
|||
|
Cseg ENDS
|
|||
|
END Drip
|
|||
|
|