Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
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?
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.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
deus
deus
Rejestracja:prawie 21 lat
Ostatnio:ponad 12 lat
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.
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?
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
deus
deus
Rejestracja:prawie 21 lat
Ostatnio:ponad 12 lat
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.
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ł)?
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
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.