Как найти смещение Dword, где хранится адрес точки входа исполняемого файла

Существуют дизассемблеры, такие как CFF Explorer, которые отображают AddressOfEntryPoint любого исполняемого файла вместе со смещением, в котором он хранится. Я знаю, как найти это ( IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint ), но я хочу программно найти смещение в PE-файле, где хранится AddressOfEntryPoint.

Я много читал о PE-файлах здесь

Но до сих пор не могу понять. Нужна помощь


person Rushil Paul    schedule 20.11.2011    source источник


Ответы (2)


Смещение AddressOfEntryPoint будет суммой размеров предшествующих ему разделов: sizeof(IMAGE_DOS_HEADER)+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)+sizeof(WORD)+sizeof(BYTE)+sizeof(BYTE)+sizeof(DWORD)+sizeof(DWORD)+sizeof(DWORD)

person JosephH    schedule 20.11.2011

Что ж, похоже, что @JosephH написал правильный ответ, однако этот ответ не является правильным правильным и совсем не приятным.

Чтобы получить EP, вам нужно прочитать файл как бинарный файл (не весь файл нужен).

Итак, предположим, что у вас есть unsigned char* data;, который указывает на двоичную информацию.

IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER *)data;                       //cast it to DOS header (some calls it MZ header)
IMAGE_NT_HEADERS* peHeader = (IMAGE_NT_HEADERS *)&data[dosHeader->e_lfanew];  //find NT header (PE header)
DWORD ep = 0;
if (peHeader->Magic == 0x10b)  //32-bit executable
    ep = ((IMAGE_NT_HEADERS32 *)peHeader)->OptionalHeader.AddressOfEntryPoint;  //Get EP
else  //64-bit executable
    ep = ((IMAGE_NT_HEADERS64 *)peHeader)->OptionalHeader.AddressOfEntryPoint;  //Get EP

Я думаю, что мой ответ лучше, потому что он более понятен, также вы не можете доверять смещениям, потому что структуры время от времени меняются. Как видите, даже IMAGE_NT_HEADERS, который я использовал, определяется по-разному на машинах x86 и x64.

person ST3    schedule 16.03.2015