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
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
Thanks :8)