Как определить точный размер файла изображения PE, используя его заголовок (и)? - PullRequest
7 голосов
/ 20 ноября 2011

Мне нужен размер в байтах, IMAGE_OPTIONAL_HEADER.SizeOfImage выглядит округленным до (неуверенной) границы и больше реального размера файла.

Ответы [ 3 ]

9 голосов
/ 20 ноября 2011

IMAGE_OPTIONAL_HEADER.SizeOfImage - размер загруженного исполняемого файла / dll в виртуальной памяти.Это не то же самое, что размер на диске.

Вы можете рассчитать его с помощью VirtualAddress + VirtualSize последнего раздела.

IMAGE_OPTIONAL_HEADER.SizeOfImage - это значение, округленное до значения IMAGE_OPTIONAL_HEADER.SectionAlignment (обычно такой же, как размер страницы).

2 голосов
/ 09 ноября 2013
if(LastSectionVirtualSize >= LastSectionSizeOfRawData)
{
    if( LastSectionVirtualSize % LastSectionSectionAlignment )
    {
        TempValue = LastSectionVirtualSize - (LastSectionVirtualSize % LastSectionSectionAlignment) + LastSectionSectionAlignment ;
    }
    else
    {
        TempValue = LastSectionVirtualSize ;    
    }
}
else
{
    if(LastSectionSizeOfRawData % LastSectionSectionAlignment)
    {
        TempValue = LastSectionSizeOfRawData - (LastSectionSizeOfRawData % LastSectionSectionAlignment) + LastSectionSectionAlignment ;
    }
    else
    {
        TempValue = LastSectionSizeOfRawData ;
    }
}

OH.SizeOfImage  = TempValue + dwLastSecRVA ;
1 голос
/ 22 октября 2015

На самом деле принятый ответ неверен. Чтобы получить размер исполняемого файла на диске, вы должны вычислить PointerToRawData + SizeOfRawData последнего раздела, а не виртуальные аналоги. Пример см. http://www.strchr.com/creating_self-extracting_executables

Также обратите внимание, что некоторые компиляторы любят добавлять отладочную информацию после последнего раздела. Чтобы это работало, обязательно удалите все таблицы символов или установите режим выпуска, в зависимости от того, какой компилятор вы используете.

...