2015-11-15 14 views
6

WObliczanie plik przesunięcie punktu wejścia w pliku PE

http://en.redinskala.com/finding-the-ep/

nie ma informacji o tym, jak znaleźć plik przesunięcie punktu wejścia w plik EXE.

Tutaj można przeczytać, że

EP (Plik) = AddressOfEntryPoint - BaseOfCode + .text [PointerToRawData] + FileAlignment

Jednak, kiedy zostały obliczenia ten sam (użyłem kilka różnych plików exe) Doszedłem do wniosku, że

Przesunięcie punktu wejścia w pliku EXE = AddressOfEntryPoint + .text [Pointe rToRawData] - .text [VirtualAddress]

przypadku AddressOfEntryPoint jest pobierana z IMAGE_OPTIONAL_HEADER i dwie inne wartości z IMAGE_SECTION_HEADER.

Czy informacje na tej stronie są fałszywe? Dodanie FileAlignment, tak jak oni wydaje się po prostu źle, to nie ma sensu. Czy to prawda? Wyrównanie pliku sugeruje, że powinienem użyć modulo lub czegoś, aby obliczyć wartość. Jeśli BaseOfCode i FileAlignment mają tę samą wartość (w większości są), nie przeszkadzałoby to dodawać ich do obliczeń, ale jak miałoby to sens?

+0

Musiałbym ponownie przeczytać specyfikację PE, ale dodanie wyrównania pliku wydaje się nie tak. Jeśli niewspółliniowe przesunięcie to 'x', wybrałbym' x - x% FileAlignment'. –

Odpowiedz

2

Prawidłowo, w ogóle nie musisz używać wartości FileAlignment.

Algorytm powinno być coś takiego jak następuje (bardzo podobny do Ciebie):

  • Get AddressOfEntryPoint z IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint (jest to VA)
  • Szukaj w którym sekcja nagłówka to VA rezyduje (zwykle pierwszy, ale powinieneś przeszukać wszystkie nagłówki sekcji).
  • Po wybraniu odpowiedniego nagłówka sekcji należy uzyskać jego pola VirtualAddress i PointerToRawData.
  • Odejmij VirtualAddress z AddressOfEntryPoint: masz teraz "Delta"
  • jak dokładnie tej samej delty dotyczy przesunięć, a następnie: "Delta" dodaj do PointerToRawData.

Po prostu nie potrzebujesz FileAlignment, ponieważ sekcja, w której leży punkt wejścia, jest już wyrównana do tej wartości.

Powiązane problemy