2012-04-27 21 views
7

obecnie Piszę mały program, który odczytuje elf nagłówek pliku i drukuje informacjeReading ELF nagłówek w C

Mam unsigned char wskaźnik zwany buf, która wskazuje lokalizację, w której plik elf znajduje się w pamięci (I używany mmap mapować go do pamięci), a następnie I typecast go do właściwego elf wskaźnik nagłówka

Elf32_Ehdr *ehdr = (Elf32_Ehdr *)buf; 

Po tym chcę uzyskać adres tabeli nagłówka programu, robię to jak ten

Elf32_Phdr *ptbl = (Elf32_Phdr *) (buf + ehdr->e_phoff) 

Jak zauważył wartość wskaźnika ptbl nie zmienia i gdy próbuję wydrukować wartość członka e_phoff jak ten

fprintf(stdout , "Offset of program headers : %d\n", ehdr->e_phoff); 

uzyskać zerowy same rzeczy się dzieje, gdy próbuję wydrukować numer programu nagłówki i liczba nagłówków sekcji - zawsze otrzymujemy zero Jeśli używam linux readelf, drukuje odpowiednie wartości Czy ktoś doświadczył tego samego problemu?

+3

Myślę, że znalazłem problem, używam maszyny 64-bitowej, więc właśnie zmieniłem Elf32_Phdr na Elf64_Phdr i zadziałało –

+0

Śmiało odpowiesz na własne pytanie. Jest to ważne, jeśli znajdziesz odpowiedź w pierwszej kolejności. Oczywiście używałeś niewłaściwego typu wskaźnika struktury, więc odwoływałeś się do pamięci w stosunku do zamierzonego. –

+0

Proponuję użyć libelf. –

Odpowiedz

5

Podczas analizowania obiektu ELF, to trzeba pamiętać, że:

  1. rozmiar, wyrównanie plik i układ wewnętrzny struktur w-pliku (takich jak ELF wykonywalnego nagłówka) zależy od ELF rozmiar słowa obiektu.
  2. Endianness obiektu ELF może różnić się od "naturalnej" endianness programu czytającego obiekt.
  3. Obiekty ELF zawierające dużą liczbę sekcji lub segmentów programu mogą wykorzystywać alternatywny schemat "rozszerzonej numeracji".

Zamiast obsługiwać te przypadki ręcznie, może być łatwiejszy w obsłudze implementację ELF (3) dostęp API do analizowania obiektu ELF (patrz: BSD libelf lub GNU libelf).

Samouczek `` libelf by Example '' zawiera czytelny wstęp do API ELF (3).

+0

Dzięki stary, dobrze grałem z tym przykładem, aby uzyskać bliższe odczucie tego, co jest ELF, w każdym razie dzięki użytecznych linków –