Wirusy komputerowe

Page 13

w wirtualnej przestrzeni adresowej, nie potrzeba przeprowadzać relokacji w modułach, gdyż istnieje zapis RVA. Ważne jest, aby wartość RVA byłą zaokrąglona do liczby podzielnej przez 4. Opis pól w strukturze IMAGE_OPTIONAL_HEADER: Pole Magic nie jest istotne, ponieważ nigdy nie spotkaliśmy się, aby miało wartość inną niż 010Bh, czyli IMAGE_NT_OPTIONAL_HDR32_MAGIC. Następne dwa bajty określają wersje linkera, który utworzył plik. Znowu, pola te są nie istotne, ponieważ nie są prawidłowo wypełnione, niektóre linkery nawet nie wpisują tu żadnych wartości. Wartość wpisywana tu jest w postaci dziesiętnej. Kolejne trzy 32-bitowe pola określają wielkości, odpowiednio: • wielkość wynikowego kodu (SizeOfCode) – całkowita i zaokrąglona wielkość sekcji z kodem w pliku. Zwykle w pliku jest tylko jedna sekcja z kodem, czyli pole to zawiera wielkość tylko tej jedynej ( nazywanej .text) • wielkość danych zainicjowanych w programie (SizeOfInitializedData) • wielkość niezainicjowanych danych (SizeOfUninitializedData) sekcji .bss AddressOfEntryPoint to adres RVA punktu startu programu (Entry Point), który obowiązuje dla EXE’ców i DLL’i. W celu uzyskania wirtualnego adresu punktu startu programu należy do adresu miejsca załadowania programu dodać to RVA. BaseOfCode to adres RVA początku sekcji z kodem programu, która jest za nagłówkami oraz przed sekcjami z danymi. Sekcja ta często nosi nazwę .text. Linker Microsoftu ustawia tu 0x1000, zaś Borlanda TLINK32 0x10000. BaseOfData to adres RVA początku sekcji z danymi programu, która występuje jako ostatnia (poza nagłówkami oraz kodem).

Pole ImageBase to informacja dla systemowej procedury ładującej w jakie miejsce w pamięci wirtualnej należy załadować program. Standardowo dla DLL’i to 0x10000, dla aplikacji Win32 to 0x00400000. Chociaż zdarzają się wyjątki, bo na przykład excel.exe z Microsoft Office ma to pole ustawione na 0x30000000. Dzięki temu polu KERNEL32.DLL zawsze ładuje się w to samo miejsce w RAM przy starcie Windows. W systemie NT 3.1 pliki wykonywalne miały ustawioną wartość ImageBase na 0x10000, jednak wraz z rozwojem systemu, zmieniona została wirtualna przestrzeń adresowa (omówiona później), dlatego starsze oprogramowanie dłużej się uruchamia, ze względu na relokacje bazy. SectionAlignment – jak program jest zmapowany w pamięci, to każda jego sekcja zaczyna w określonym przez system wirtualnym adresie, którego wartość jest wielokrotnością tego pola. Linkery Microsoftu ustawiają tu minimalną dopuszczalną wartość (0x1000), zaś linkery Borlanda C++ 0x10000 (64KB). FileAlignment, znaczenie tego pola jest podobne do SectionAlignment, tyle że w tym przypadku odnosi się to do pozycji (offset) w pliku, a nie jak poprzednio przy mapowaniu pliku w pamięci. Standardowo pole to zajmuje wartość 0x200 bajtów, prawdopodobnie dlatego, że sektor dysku ma taką długość.

Grupa pól, których nie opisujemy (nazwa opisuje jednoznacznie ich przeznaczenie) : MajorOperatingSystemVersion MinorOperatingSystemVersion MajorImageVersion MinorImageVersion MajorSubsystemVersion MinorSubsystemVersion Win32VersionValue 13


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.