Что ж, похоже, @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.