News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Is there a struct for the PE header ?

Started by BlackVortex, October 08, 2008, 01:27:38 AM

Previous topic - Next topic

BlackVortex

As the topic says, I've got tired of manually playing around with simple offset calculations to find values in optional header and file header in winPEs. Is there some struct kinda like the following, but more complete and for asm ?
http://www.cygwin.com/ml/cygwin-developers/2001-01/msg00041.html

If it's something obvious or already in the masm32 includes then don't make be harsh on me     :toothy

jdoe


You can look at this Iczelion tutorial...
http://win32assembly.online.fr/pe-tut2.html

ntimage.h or winnt.h
And an example at the end of this post of how I use them in a checksum writing function.



IMAGE_NUMBEROF_DIRECTORY_ENTRIES       EQU 16

IMAGE_DATA_DIRECTORY STRUCT
   VirtualAddress                      DWORD ?
   isize                               DWORD ?
IMAGE_DATA_DIRECTORY ENDS

IMAGE_DOS_HEADER STRUCT
   e_magic                             WORD ?
   e_cblp                              WORD ?
   e_cp                                WORD ?
   e_crlc                              WORD ?
   e_cparhdr                           WORD ?
   e_minalloc                          WORD ?
   e_maxalloc                          WORD ?
   e_ss                                WORD ?
   e_sp                                WORD ?
   e_csum                              WORD ?
   e_ip                                WORD ?
   e_cs                                WORD ?
   e_lfarlc                            WORD ?
   e_ovno                              WORD ?
   e_res                               WORD 4 DUP (?)
   e_oemid                             WORD ?
   e_oeminfo                           WORD ?
   e_res2                              WORD 10 DUP (?)
   e_lfanew                            DWORD ?
IMAGE_DOS_HEADER ENDS

IMAGE_FILE_HEADER STRUCT
   Machine                             WORD ?
   NumberOfSections                    WORD ?
   TimeDateStamp                       DWORD ?
   PointerToSymbolTable                DWORD ?
   NumberOfSymbols                     DWORD ?
   SizeOfOptionalHeader                WORD ?
   Characteristics                     WORD ?
IMAGE_FILE_HEADER ENDS

IMAGE_OPTIONAL_HEADER STRUCT
   Magic                               WORD ?
   MajorLinkerVersion                  BYTE ?
   MinorLinkerVersion                  BYTE ?
   SizeOfCode                          DWORD ?
   SizeOfInitializedData               DWORD ?
   SizeOfUninitializedData             DWORD ?
   AddressOfEntryPoint                 DWORD ?
   BaseOfCode                          DWORD ?
   BaseOfData                          DWORD ?
   ImageBase                           DWORD ?
   SectionAlignment                    DWORD ?
   FileAlignment                       DWORD ?
   MajorOperatingSystemVersion         WORD ?
   MinorOperatingSystemVersion         WORD ?
   MajorImageVersion                   WORD ?
   MinorImageVersion                   WORD ?
   MajorSubsystemVersion               WORD ?
   MinorSubsystemVersion               WORD ?
   Win32VersionValue                   DWORD ?
   SizeOfImage                         DWORD ?
   SizeOfHeaders                       DWORD ?
   CheckSum                            DWORD ?
   Subsystem                           WORD ?
   DllCharacteristics                  WORD ?
   SizeOfStackReserve                  DWORD ?
   SizeOfStackCommit                   DWORD ?
   SizeOfHeapReserve                   DWORD ?
   SizeOfHeapCommit                    DWORD ?
   LoaderFlags                         DWORD ?
   NumberOfRvaAndSizes                 DWORD ?
   DataDirectory                       IMAGE_DATA_DIRECTORY IMAGE_NUMBEROF_DIRECTORY_ENTRIES DUP (<>)
IMAGE_OPTIONAL_HEADER ENDS

IMAGE_NT_HEADERS STRUCT
   Signature                           DWORD ?
   FileHeader                          IMAGE_FILE_HEADER <>
   OptionalHeader                      IMAGE_OPTIONAL_HEADER <>
IMAGE_NT_HEADERS ENDS







;
; Writes the PE CheckSum
;
; Returns the calculated checkSum if successful or zero otherwise
;
; p_lpszPePath = Path pointer to the PE
;
AzmtPeCheckSumA PROC USES ebx p_lpszPePath:DWORD

    LOCAL l_hFile:DWORD
    LOCAL l_hFileMap:DWORD
    LOCAL l_lpFileMap:DWORD
    LOCAL l_dwFileLen:DWORD
    LOCAL l_dwOldCheckSum:DWORD
    LOCAL l_dwNewCheckSum:DWORD

    xor ebx, ebx

    ;
    ; Get PE length (bytes) and file pointer (mapping)
    ;

    invoke CreateFileA, p_lpszPePath, (GENERIC_READ or GENERIC_WRITE), 0, NULL, OPEN_EXISTING, NULL, NULL
    cmp eax, INVALID_HANDLE_VALUE
    je Exit

    mov l_hFile, eax

    ;
    ; Minimum bytes length for a valid PE = 1024 bytes
    ;

    invoke GetFileSize, eax, NULL
    cmp eax, 1024
    jnge Free_hFile

    mov l_dwFileLen, eax

    invoke CreateFileMappingA, l_hFile, NULL, PAGE_READWRITE, NULL, NULL, NULL
    test eax, eax
    jz Free_hFile

    mov l_hFileMap, eax

    invoke MapViewOfFile, eax, FILE_MAP_WRITE, NULL, NULL, NULL
    test eax, eax
    jz Free_hFileMap

    mov l_lpFileMap, eax

    ;
    ; Check predefined values of PE file
    ;

    cmp [eax].IMAGE_DOS_HEADER.e_magic, IMAGE_DOS_SIGNATURE
    jne Free_lpFileMap

    add eax, [eax].IMAGE_DOS_HEADER.e_lfanew
    lea ecx, [eax+sizeof IMAGE_NT_HEADERS]
    sub ecx, l_lpFileMap
    cmp ecx, l_dwFileLen
    jnle Free_lpFileMap

    cmp [eax].IMAGE_NT_HEADERS.Signature, IMAGE_NT_SIGNATURE
    jne Free_lpFileMap

    cmp [eax].IMAGE_NT_HEADERS.OptionalHeader.Magic, IMAGE_NT_OPTIONAL_HDR_MAGIC
    jne Free_lpFileMap

    ;
    ; If successful, CheckSumMappedFile returns the IMAGE_NT_HEADERS pointer
    ;

    invoke CheckSumMappedFile, l_lpFileMap, l_dwFileLen, addr l_dwOldCheckSum, addr l_dwNewCheckSum
    test eax, eax
    jz Free_lpFileMap

    mov ebx, l_dwNewCheckSum

    mov [eax].IMAGE_NT_HEADERS.OptionalHeader.CheckSum, ebx

    ;
    ; Close objects and set the returned value
    ;

Free_lpFileMap:

    invoke UnmapViewOfFile, l_lpFileMap

Free_hFileMap:

    invoke CloseHandle, l_hFileMap

Free_hFile:

    invoke CloseHandle, l_hFile

Exit:

    mov eax, ebx

    ret

AzmtPeCheckSumA ENDP