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 exe
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.SizeOfHeaders
field gives the length of all the headers (note: including the 16-bit stub).
SizeOfRawData
field gives the length of each section on disk.Example with notepad (Windows 10):
SizeOfHeaders
: 0x400SizeOfRawData
of 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.