Assuming you have a stream of data or a block of bytes you want to carve, how can you determine the size of the executables?
There are numerous headers inside the PE executable format, but what header sections do I use to determine (if possible) the total length of the executable?
Here is a picture of the file format.

If the PE file is well formed, the calculation can be simplified as (pseudo-code):
size = IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeaders
foreach section_header in section_headers:
size += section_header.SizeOfRawData
Where:
SizeOfHeaders is a member of IMAGE_OPTIONAL_HEADER structure.IMAGE_OPTIONAL_HEADER structure is part of IMAGE_NT_HEADERS)SizeOfHeaders field gives the length of all the headers (note: including the 16-bit stub).
IMAGE_SECTION_HEADER structureSizeOfRawData field gives the length of each section on disk.Example with notepad (Windows 10):
SizeOfHeaders : 0x400
SizeOfRawDataof each sections :
(note: SizeOfRawData is called Raw Size in the below picture):

Sum everything:
>>> size_of_headers = 0x400
>>> sec_sizes = [0x15400, 0x800, 0x1a00, 0x19c00, 0x1600]
>>> size_of_headers + sum(sec_sizes)
207872
>>>
Total size: 207872 bytes.
Verification:

Note: the above calculation doesn't take into account if the PE is badly formed or if there is an overlay.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With