Как найти смещение Dword, где хранится адрес точки входа исполняемого файла - PullRequest
1 голос
/ 20 ноября 2011

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

Но все еще не можете понять это.Требуется помощь

Ответы [ 2 ]

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

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

1 голос
/ 16 марта 2015

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

...