ostatnia sekcja w pliku PE

0

Witam, jak mogę rozpoznać ostatnią sekcję w pliku PE? Czytałem, że ostatnia sekcja będzie miała największą wartość PointerToRawData, lecz w pliku exe, na którym testuje mój program, dwie sekcje mają tę samą wartość PointerToRawData (która jest wartością największą). Skąd mam wiedzieć, która jest ostatnia?

tu są linki przedstawiające dwie pozycje w tablicy sekcji tego pliku PE
http://img209.imageshack.us/img209/9228/screenhunter01nov132105.jpg
http://img149.imageshack.us/img149/1848/screenhunter02nov132105.jpg

Piszę wirusa (projekt na przedmiot Oprogramowanie Systemowe) i chcę dokleić kod do ostatniej sekcji, ale wpierw muszę ją zlokalizować :). Program w C już przegląda mi ten plik i ładuje do struktury zawartość tablicy sekcji.

0

Pierwsza sprawa - fizycznie przedostatnia sekcja (relokacji) jest pusta, spójrz na IMAGE_SECTION_HEADER::SizeOfRawData, równie dobrze IMAGE_SECTION_HEADER::PointerToRawData może również być wyzerowane (nawet powinno być), dlatego obie sekcje wskazują w to samo miejsce. Dalej - sekcje muszą być ułożone kolejno, ostatnia sekcja to po prostu ostatni rekord w tablicy sekcji, ilość wpisów w niej zaś to IMAGE_FILE_HEADER::NumberOfSections. Kolejna rzecz - pamiętaj o korekcie IMAGE_OPTIONAL_HEADER::SizeOfImage i dodaniu w IMAGE_SECTION_HEADER::Characteristics flagi IMAGE_SCN_MEM_EXECUTE.

0

Tutaj twierdzą, że ostatnia pozycja w section table wcale nie musi być ostatnią sekcją
http://amdfanatyk.w.interia.pl/download/virii/virii.pdf
"Zwróć uwagę na to, że wpis dotyczący ostatniej sekcji pliku
PE nie musi być ostatnim wpisem w Section header."

Czyli dokleić kod (w tym przypadku) do tej sekcji niepustej?

0
Blackmoore napisał(a)

Tutaj twierdzą, że ostatnia pozycja w section table wcale nie musi być ostatnią sekcją
http://amdfanatyk.w.interia.pl/download/virii/virii.pdf
"Zwróć uwagę na to, że wpis dotyczący ostatniej sekcji pliku
PE nie musi być ostatnim wpisem w Section header."

Po części mają rację, ale nie istnieje normalne narzędzie generujące binarki z niewłaściwą kolejnością danych w pliku, ułożenie w pamięci i tak musi być sensowne. Także akurat to możesz sobie darować, jeżeli coś ma nienormalną konstrukcję to albo już coś je zainfekowało albo to jakieś cholerstwo, którego i tak lepiej nie ruszać (np. dziwny packer, który może się nieźle wkurzyć na modyfikację pliku i puścić formata w tle).

Sekcje muszą tworzyć względnie ciągły obszar w pamięci (po uwzględnieniu wyrównania, do tego raczej kolejno), fizycznie już nie do końca. Jeżeli chciałbyś tak dokładnie wszystko obsługiwać to się nieźle pobawisz - rozmiar fizyczny sekcji nie przekłada się na rozmiar wirtualny. Za fizycznie ostatnią sekcją mogą leżeć w pamięci kolejne sekcje czysto wirtualne, uniemożliwiając wygodne powiększenie. Takich binarek jeszcze nie widziałem, ale wcale bym się nie zdziwił gdyby istniały.

Ostatnia fizycznie jest ta z największą sumą PointerToRawData i RawSize. Co, jak sam przytoczyłeś, nie musi oznaczać, że masz miejsce coby się tam dopisać - rozmiar wirtualny i wirtualny adres kolejnej (wirtualnie) sekcji. Najwięcej pewności dałoby stworzenie własnej sekcji, tutaj masz gwarancję, że zawsze będzie mieć odpowiednie położenie.

0

Już prawie wszystko zrozumiałem (problem tylko mam z dołączaniem bibliotek, ale tym później będę się martwił). Teraz gdy już znam położenie ostatniej sekcji, wiem jak zmienić rozmiary sekcji i pliku, ustawić flagi sekcji, zmienić entry point... chciałbym wkleić swój kod. Nasuwa mi się pytanie, czy muszę instrukcje wpisać w formie szesnastkowej/binarnej? W jaki sposób mogę bezpośrednio wrzucić ciąg instrukcji do pamięci, czy mogę z innego pliku? Musi to być assembler czy może być C (tzn. czy C nie będzie za dużo bajtów zajmował)?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.