VIRSPY: Der GEMDOS-Türwächter

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
Links

Copyright-Bestimmungen: siehe Über diese Seite