У меня есть этот код:Трассировка адреса указателей в отладчике
void WriteToConsole(IMAGE_NT_HEADERS *ntHeader)
{
std::cout << "AddressOfEntryPoint = " <<
ntHeader->OptionalHeader.AddressOfEntryPoint << std::endl;
}
void main()
{
//something
IMAGE_NT_HEADERS *NtHeader = GetWinNTHeader(dosHeader->e_lfanew);
WriteToConsole(NtHeader);
}
Почему адреса NtHeader и ntHeader отличаются? Я отслеживаю адреса с помощью отладчика.
IMAGE_NT_HEADERS * GetWinNTHeader(long offset)
{
// IMAGE_NT_HEADERS size is 120
char buffer[120];
file.seekg(offset);
file.read(buffer, 120);
IMAGE_NT_HEADERS* pHeader = (IMAGE_NT_HEADERS*)(buffer);
if (IsBadReadPtr(pHeader, sizeof(IMAGE_NT_HEADERS)))
return NULL;
if (pHeader->Signature != IMAGE_NT_SIGNATURE)
return NULL;
return pHeader;
}
вы создаете указатель, инициализируя его, а затем печатаете его впервые в этой функции ... так, откуда вы знаете, что он изменился? – basav
main() должен возвращать int. Оптимизирующий компилятор, вероятно, забудет значение NTHeader, потому что он не нужен после вызова. Попытайтесь распечатать его до и после вызова, и он будет таким же. – gnasher729
Ваш код в порядке, но 'OptionalHeader.AddressOfEntryPoint' не такой же, как' NtHeader'. –