Как правильно получить AddressOfEntryPoint?

170
17 октября 2021, 18:10

Получаю адрес модуля и адрес функции main почему они не соответсвуют AddressOfEntryPoint?

int main() {
    HMODULE hModule = GetModuleHandle(NULL);
    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
    PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((LPBYTE)hModule + pDosHeader->e_lfanew);
    printf("hModule: 0x%llx\n", hModule);    
    //0x7ff6a9790000 
    printf("main: 0x%llx\n", main); 
    //0x7ff6a9792ea0
    printf("AddressOfEntryPoint: %lx\n", pNtHeaders->OptionalHeader.AddressOfEntryPoint);
    //0x41a8
    return 0;
}

адрес hModule равен 0x7ff6a9790000, адрес main равен 0x7ff6a9792ea0

0x7ff6a9792ea0 - 0x7ff6a9790000 = 0x2ea0

а AddressOfEntryPoint равен 0x41a8 почему он не равен 0x2ea0?

Так же если делать по формуле EP(File) = AddressOfEntryPoint – BaseOfCode + .text[PointerToRawData] + FileAlignment

int text = 0;
printf("EP File: %x\n", pNtHeaders->OptionalHeader.AddressOfEntryPoint - (pNtHeaders->OptionalHeader.BaseOfCode + pSectHeader[text].PointerToRawData + pNtHeaders->OptionalHeader.FileAlignment)
//AddressOfEntryPoint:41b8
//BaseOfCode:1000
//PointerToRawData:400
//FileAlignment:200

0x41b8 - (0x1000 + 0x400 + 0x200) = 0x2bb8 что тоже не равно 0x2ea0

В чём ошибка? Как правильно посчитать?

READ ALSO
min max двусвязного списка

min max двусвязного списка

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

141
создание бинарного дерева

создание бинарного дерева

Пишу функции ввода/ вывода бинарного дерева различными методами Но после ввода элементов(пока не 0) ничего не происходит, помогите разобраться,...

90
class c++ многофайловый проект

class c++ многофайловый проект

не могу скомпилировать многофайловый проект

105
setInterval ускоряется [дубликат]

setInterval ускоряется [дубликат]

Когда нажимаю на кнопку несколько раз, выполняет за 1 секунду по несколько разВ чем проблема?

96