← ST-Computer 01 / 1990

VIRSPY: Der GEMDOS-Türwächter

Programmierpraxis

Wem ist so etwas noch nicht passiert: Man kopiert sich ein Programm auf die RAM- oder Harddisk, aber das Programm beschwert sich nach dem Starten darüber, dass noch irgendein File fehlt. Meistens liegt das an falschen Suchpfaden oder Namen, aber diese Probiererei hat jetzt ein Ende.

Mit VIRSPY hat man ein Werkzeug an der Hand, mit dem die Diskettenoperationen auf dem Drucker mitgeschrieben werden. Außerdem: Wen interessiert es nicht, ob der Lieblings-Compiler irgendwelche Zwischendateien anlegt, und wo sie erzeugt werden? Nebenbei ist VIRSPY ein Lehrstück zum Schreiben von residenten Programmen mit XBRA-Protkoll und sauberer Installation. VIRSPY fängt die GEMDOS-Aufrufe ab, die in solchen Fällen benutzt werden, nämlich Pexec, Fopen, Fcreate und Sfirst. Allerdings hatte Virspy ursprünglich eine ganz andere Aufgabe (wie schon der Name sagt), nämlich die Suche nach Link-Viren, die sich an Programme anhängen und von da aus munter weiterverbreiten. In der eigenen Routine, die zwischen Benutzer (Programm oder Desktop) und GEMDOS eingeschoben wird, werden diese Funktionen analysiert und der dazu passende Pfad- und Filename wird auf dem Drucker protokolliert. Wer keinen Drucker hat, kann die Konstante DEVICE z.B. auf den Wert 2 ändern, und sofort landen die Ausgaben auf dem Bildschirm (allerdings mit dem unschönen Effekt, daß meistens der ganze Bildschirmaufbau durcheinandergebracht wird...). Wem nach erfolgreicher Analyse das Druckergeratter zuviel wird, braucht nicht den langen Arm zum Reset-Knopf (bzw. den Dreifingergriff beim TOS 1.4) auszustrecken, sondern nur Virspy noch einmal zu starten, da dadurch ein Flag umgesetzt wird, mit dem die Druckerausgabe gesteuert wird.

Zum GEMDOS hin ist Virspy vollkommen transparent, d.h. alles, was vorne reingesteckt wird, kommt auch hinten wieder raus (wenn auch mit einer kleinen Verzögerung wegen der Druckerausgabe). Da ich ein großer Fan der XBRA-Methode bin, unterstützt Virspy natürlich auch bei der Installation das XBRA-Format und erkennt auch andere XBRA-Routinen, die nach Virspy gestartet wurden. Obwohl ich einen Mega-2 besitze, habe ich insbesondere bei der Installationsroutine auf möglichst geringen Speicherverbrauch geachtet: die Installationsroutine fliegt nämlich nach getaner Arbeit raus und hinterläßt nur einen BRA-Be-fehl am Anfang des Programms. Geschrieben wurde das Programm mit dem Assembler des Turbo-C, der relative Sprünge automatisch in ihre Short-Formen optimiert. Eine Anpassung an andere Assembler dürfte allerdings vollkommen unproblematisch sein. Wer sich zusätzlich ein wenig mit der Parameterübergabe ans GEMDOS auskennt, dem dürfte es nicht schwerfallen, das Programm auf weitere Funktionen auszuweiten und damit noch flexibler zu machen.

; VIR_SPY V 1.4a ; 30. Januar 1989 ; by TSE ; Gerrit Gehnen ; (c) MAXON Computer GmbH ; ; Viren-Spion : Protokolliert alle Versuche, die Gemdosfunktionen ; FOPEN, FCREATE, PEXEC,SFIRST zu benutzen auf dem Drucker mit. ; Dadurch kann man leicht Zugriffe auf fremde Dateien ( Infektionen ) ; feststellen ; ; Ausgabe: FOPEN: Read: R Filename ; Write: W Filename ; Update: U Filename ; FCREATE: C Filename ; PEXEC: E Filename (nur bei Load’n Go und Load) ; SFIRST: S Filename ; ; Kann durch nochmaligen Aufruf ein- und ausgeschaltet werden. ; ; Versionshistory (wen's interessiert): ; 1.0 (März 88) : erste Lauffähige Version ; 1.1 (April 88): Programm verkürzt und Deaktivierer mittels Zusatzprogramm ; 1.2 '' : SFIRST mit aufgenommen ; 1.3 (3.7.88) : Zusatzprogramm entfällt ; 1.4 (17.12.88): XBRA-Protokoll ; 1.4a (30.1.89): XBRA-Installation verbessert und berichtigt FOPEN equ $3d FCREAT equ $3c EXEC equ $4b SFIRST equ $4e P_TERMRES equ $31 DEVICE equ 0 ; Devicenummer:O=Drucker,2=Schirm CR equ 13 LF equ 10 text start: bra install aktiv_flag: dc.w 0 ; Programmeigenes Flag für ; Aktivierungsfunktion, kann ; via XBRA extern manipuliert w. dc.b 'XBRA' ; XBRA-Formalismus dc.b '4SPY' oldvect: ds.l 1 patch: movea.l sp,a0 ; Untersuche, ob Aufruf aus dem btst #5,(a0) ; Supermodus stattfand beq from_user addq.l #6,a0 ; ja: Addiere Offset bra is_it_me from_user: move.l usp,a0 is_it_me: cmpi.w #0,aktiv_flag ; Darf ich ? bne exit cmpi.w #FOPEN,(a0) ; Aber ja doch ! beq los_op ; Bin ich gemeint ? cmpi.w #FCREAT,(a0) beq los_cr cmpi.w #EXEC,(a0) beq los_ex cmpi.w #SFIRST,(a0) beq los_sf bra exit los_ex: cmpi.w #0,2(a0) ; Exec wurde aufgerufen: beq con_ex ; Ermittle, ob Load'n Go cmpi.w #3,2(a0) ; oder Load gemeint ist bne exit ; wenn nicht, wars wohl nix con_ex: move.b #'E',d0 ; setze Moduszeichen movea.l 4(a0),a0 ; und Filenamen bra druckstat los_cr: move.b #'C',d0 ; Create wurde aufgerufen: bra loscont ; setze Modus auf 'C' und gib ; Filenamen weiter los_sf: move.b #'S',d0 ; Sfirst wurde aufgerufen: ; setze Modus auf 'S' und gib loscont: movea.l 2(a0),a0 ; Filenamen weiter bra druckstat los_op: move.l d1,-(sp) ; Open wurde aufgerufen: move.w 6(a0),d0 ; Ermittle Modus movea.l 2(a0),a0 ; Ermittle Adresse des Namens move.b #'W’,d1 ; Setze Modus entspr. dem cmpi.w #1,d0 ; Aufruf beq druckdl move.b #’R',d1 cmpi.w #0,d0 beq druckd1 move.b #'U',d1 druckd1: move.b d1,d0 ; Gib das Moduszeichen in d1 aus move.l (sp)+,d1 druckstat: bsr druckchar ; Alles etwas umständlich move.b #' ',d0 ; aber dafür flexibel... bsr druckchar ; Space raus bsr druckstring exit: move.l oldvect,-(sp) ; ..und schon fertig rts ; Rücksprung in die Orginal- ; GEMDOS Routine druckchar: movem.l d0-d2/a0-a2,-(sp) ; Register retten move.w d0,-(sp) move.w #DEVICE,-(sp) ; und raus damit move.w #3,-(sp) trap #13 addq.l #6,sp movem.l (sp)+,d0-d2/a0-a2 rts druckstring: move.b (a0)+,d0 ; Gib String, der mit \0 beendet wird cmpi.b #0,d0 ; und an Adresse (a0) steht aus beq loopend bsr druckchar bra druckstring loopend: move.b #CR,d0 ; Jetzt nur noch in neue Zeile bsr druckchar ; gehen., move.b #LF,d0 bsr druckchar rts install: pea.l supinst ; Supermodus zum Vektorzugriff move.w #38,- (sp) trap #14 addq.l #6,sp move.w aktiv_flag,d0 ; falls ich schon installiert bin, cmpi.w #0,d0 beq nicht_inst clr.w -(sp) trap #1 ; dann wars das schon. supinst: lea.l 33*4,a1 ; Inhalt des Gemdosvektors movea.l (a1),a0 ; holen und auf XBRA prüfen movea.l a0,a2 find_next: cmpi.l #'4SPY’,-8(a2) ; Bin ich schon da ? beq installed ; Leider ja cmpi.l #'XBRA',-12(a2) ; anderes XBRA-Programm da? bne war_nix move.l -(a2),a2 ; in der Kette bra find_next ; Prüfe nächstes Programm war_nix: move.l (a1),(oldvect) ; Kein Vir_spy gefunden ! move.l #patch,(a1) rts installed: eori.w #$ffff,-14(a2) ; Aktivflag umsetzen eori.w #$ffff,aktiv_flag ; Eigenes Flag setzen rts nicht_inst: pea meldung ; Noch nicht installiert ! move #9,-(a7) trap #1 addq.l #6,a7 clr.w -(sp) move.l #install-start+256,-(sp) ; und resident bleiben ! move.w #P_TERMRES,-(sp) ; Gag:Installationsprogramm trap #1 ; wird gelöscht ! data meldung: dc.b 'VIR-SPY 1.4a installiert',CR,LF dc.b '(c) MAXON Computer 1989',0
Gerrit Gehnen