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
: 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.
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