Wyœwietleń
315,949
17:32:13
09.12.2023 (Saturday)

PEInfo 0.9 BETA

Analiza plików wykonywalnych EXE, DLL, OCX. Budowa pliku EXE, EXE headers.

Program umożliwia szczegółowš analizę 32 bitowych plików wykonywalnych zgodnych ze specyfikacjš Portable Executable File Format.
Do plików takich można zaliczyć zdecydowanš większoœć plików z rozszerzeniem EXE (aplikacje), DLL (biblioteki), OCX (kontrolki ActiveX), BPL (biblioteki DLL zawierajšce dane specyficzne dla kompilatorów Borlanda), CPL (aplety Panelu Sterowania), niektóre pliki SYS, AX, ACM, DRV, TLB i inne.
PEInfo
Data wydania:
30.11.2003
Język:
angielski
Licencja:
Freeware
System:
NT/98/Me/2000/XP/2003/Vista/7/8/10
Pobrań:
130,949
Wstęp
Screenshots
PE32 File Format
DOS Header
DOS Stub
PE Signature
COFF Header (File Header)
PE Header (Optional Header)
Section Headers (Section Table)
Przykłady
DOS Header, DOS Stub, PE Header, Section Headers - zrzut szesnastkowy
Sekcja DATA - zrzut szesnastkowy
Linki

Wstęp


Program PEInfo umożliwia szczegółowš analizę 32 bitowych plików wykonywalnych zgodnych ze specyfikacjš Microsoft Portable Executable and Common Object File Format Specification, którš można pobrać ze strony http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx.
Specyfikacja ta często jest okreœlana jako format PE32 lub po prostu PE.

Do plików zgodnych z powyższš specyfikacjš można zaliczyć zdecydowanš większoœć plików z rozszerzeniem EXE (aplikacje), DLL (biblioteki), OCX (kontrolki ActiveX), BPL (biblioteki DLL zawierajšce pewne dane specyficzne dla kompilatorów Borlanda), CPL (aplety Panelu Sterowania), niektóre pliki SYS, AX, ACM, DRV, TLB i inne.

Program nie obsługuje aplikacji skompilowanych dla platformy .NET. Chociaż pliki takie również majš rozszerzenie EXE, ich struktura wewnętrzna jest zupełnie inna.

PEInfo jest przeznaczony przede wszystkich dla programistów chcšcych uzyskać szczegółowe informacje dotyczšce skompilowanego już programu oraz osób zainteresowanych formatem PE32.

Najważniejsze funkcje

  • Przeglšdanie i edycja wszystkich pól w nagłówkach: DOS Header, File Header (COFF Header) i Optional Header (PE Header). Wartoœci pól sš podawane jako liczby dziesiętne, szesnastkowe i binarne.
  • Wyœwietlanie wszystkich katalogów Data Directories, z możliwoœciš edycji względnego adresu wirtualnego (RVA - Relative Virtual Address) i rozmiaru (Size) każdego z nich.
  • Edycja parametrów wszystkich sekcji (charakterystyki, rozmiar i adres wirtualny, rozmiar danych, wskaŸnik do relokacji itd.).
  • Możliwoœć wykonania zrzutu szesnatkowego dowolnej sekcji.
  • Wyœwietlanie listy importowanych funkcji z zewnętrznych bibliotek oraz funkcji eksportowanych przez analizowany program/bibliotekę.
  • Wbudowana przeglšdarka zasobów podzielona na kategorie (bitmapy, okna dialogowe, tabele łańcuchów, zasoby definiowane przez użytkownika (RCData), kursory, ikony itd.). Każdy zasób można zapisać do pliku, przeglšdać jako zrzut szesnastkowy.
  • Możliwoœć integracji z Eksploratorem Windows. Dodawane jest polecenie Open with PEInfo do menu kontekstowego wybranych przez użytkownika plików.
  • Wyœwietlanie listy uruchomionych procesów oraz wykorzystywanych przez nie modułów.
  • Możliwoœć zapisania szczegółowego raportu do pliku HTML.
Dalej--->

Zrzuty ekranu

Nagłówek DOS Nagłówek COFF (Nagłówek Pliku)
Nagłówek PE (Nagłówek Opcjonalny) Tabela importów
Zasoby

PE32 File Format


Struktura plików zgodnych ze specyfikacjš PE32 jest bardzo złożona i nie chcę tutaj opisywać szczegółów dotyczšcych tego formatu, a jedynie przekazać nieco informacji ułatwiajšcych korzystanie z programu PEInfo. Zainteresowanych odsyłam do specyfikacji znajdujšcej się na stronie podanej na samym poczštku opisu. W Internecie można też znaleŸć całe mnóstwo artykułów, kursów, kursików poœwięconych temu zagadnieniu, jednak powinny być one traktowane jako uzupełnienie wiedzy zdobytej po przeczytaniu specyfikacji Microsoftu.

Aby nieco ułatwić sobie opis, będę stosował nazwę plik EXE dla wszystkich plików zgodnych ze specyfikacjš PE32.

Budowa pliku EXE wyglšda następujšco:

Nagłówek DOS

MS-DOS 2.0 Stub
.....
Ta częœć jest w zasadzie niepotrzebna dla aplikacji 32 bitowych. Istnieje w celu "kompatybilnoœci z DOSem".
Sygnatura PE
Nagłówek COFF
Nagłówek PE
Tabela z nagłówkami sekcji
SEKCJE

importy,
eksporty,
zasoby,
relokacje,
...

DOS Header (Nagłówek DOS)

Składa się on z 16 pól typu Word, z tablicy 4-elementowej e_res (elementy typu Word), z tablicy 10-elementowej e_res2 (elementy typu Word) oraz jednego pola typu LongInt. W sumie 64 bajty.
Przypomnę tylko, że w maszynach 32-bitowych:
  • Byte = 8 bitów;
  • Word (słowo bitowe) = 16 bitów = 2 bajty;
  • LongInt = Integer = 32 bity = 4 bajty (liczba całkowita ze znakiem (signed integer));
  • DWord (podwójne słowo bitowe) = 32 bity = 4 bajty (liczba całkowita bez znaku (unsigned integer)).
  IMAGE_DOS_HEADER = record
    e_magic: Word; // <-- MZ string
    e_cblp: Word;
    e_cp: Word;
    e_crlc: Word;
    e_cparhdr: Word;
    e_minalloc: Word;
    e_maxalloc: Word;
    e_ss: Word;
    e_sp: Word;
    e_csum: Word;
    e_ip: Word;
    e_cs: Word;
    e_lfarlc: Word;
    e_ovno: Word;
    e_res: array[0..3] of Word;
    e_oemid: Word;
    e_oeminfo: Word;
    e_res2: array[0..9] of Word;
    e_lfanew: LongInt;
  end;
Dla aplikacji 32-bitowej istotne jest tutaj w zasadzie tylko ostatnie pole e_lfanew, w którym zapisany jest adres sygnatury PE.

MS-DOS 2.0 Stub

DOS Stub jest niewielkim programem DOS-owym, który zadziała tylko wtedy, gdy plik EXE zostanie uruchomiony w œrodowisku DOS. Działanie tego programu ogranicza się zazwyczaj do wyœwietlenia komunikatu This program must be run under Win32 lub podobnego.

PE Signature (Sygnatura PE)

Sygnatura ta jest łańcuchem tekstowym PE, po którym następujš dwa bajty zerowe. Szesnastkowo: $50 $45 $00 $00.
Adres tej sygnatury jest pamiętany w polu e_lfanew w nagłówku DOS.
Jeœli sygnatura jest inna od opisanej, najprawdopodobniej mamy do czynienia z plikiem niezgodnym ze specyfikacjš PE32. PEInfo wyœwietli wówczas komunikat Not a PE (Win32 Executable) file!.

COFF Header (Nagłówek COFF)

Niekiedy okreœlany też jako File Header.
Nagłówek ten występuje bezpoœrednio po sygnaturze PE.
Ma on następujšcš strukturę:
  IMAGE_FILE_HEADER = record
    Machine: Word;
    NumberOfSections: Word;
    TimeDateStamp: DWORD;
    PointerToSymbolTable: DWORD;
    NumberOfSymbols: DWORD;
    SizeOfOptionalHeader: Word;
    Characteristics: Word;
  end;
Najważniejsze pola to:
  • NumberOfSections - liczba sekcji wewnštrz pliku EXE;
  • SizeOfOptionalHeader - rozmiar nagłówka PE;
  • Characteristics - tutaj zapisane sš różnego rodzaju informacje dotyczšce analizowanego pliku (m.in: czy plik jest wykonywalny, czy jest bibliotekš DLL, czy posiada tabelę relokacji).

PE Header (Nagłówek PE)

Zwany też Nagłówkiem Opcjonalnym (Optional Header).
Nazwa może być nieco mylšca, ponieważ dla plików EXE nagłówek ten jest obowišzkowy. Opcjonalny jest on w plikach OBJ (object files), które mogš, ale nie muszš zawierać tego nagłówka.
Jego struktura jest następujšca:
const
  IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
  ...
  
type

  IMAGE_DATA_DIRECTORY = record
    RVA: DWORD;
    Size: DWORD;
  end;
  
  IMAGE_OPTIONAL_HEADER = record
    { Standard fields. }
    Magic: Word;
    MajorLinkerVersion: Byte;
    MinorLinkerVersion: Byte;
    SizeOfCode: DWORD;
    SizeOfInitializedData: DWORD;
    SizeOfUninitializedData: DWORD;
    AddressOfEntryPoint: DWORD;
    BaseOfCode: DWORD;
    BaseOfData: DWORD;
    { NT additional fields. }
    ImageBase: DWORD;
    SectionAlignment: DWORD;
    FileAlignment: DWORD;
    MajorOperatingSystemVersion: Word;
    MinorOperatingSystemVersion: Word;
    MajorImageVersion: Word;
    MinorImageVersion: Word;
    MajorSubsystemVersion: Word;
    MinorSubsystemVersion: Word;
    Win32VersionValue: DWORD;
    SizeOfImage: DWORD;
    SizeOfHeaders: DWORD;
    CheckSum: DWORD;
    Subsystem: Word;
    DllCharacteristics: Word;
    SizeOfStackReserve: DWORD;
    SizeOfStackCommit: DWORD;
    SizeOfHeapReserve: DWORD;
    SizeOfHeapCommit: DWORD;
    LoaderFlags: DWORD;
    NumberOfRvaAndSizes: DWORD;
    DataDirectory: array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1]
      of IMAGE_DATA_DIRECTORY;
  end;
Najważniejsze pola:
  • SizeOfCode - rozmiar sekcji z kodem wykonywalnym lub suma rozmiarów wszystkich takich sekcji, jeœli jest ich więcej. Sekcje z kodem wykonywalnym najczęœciej majš nazwy: .text (kompilatory Microsoftu, gcc) lub CODE (kompilatory Borlanda).
  • SizeOfInitializedData - rozmiar sekcji z zainicjowanymi danymi lub suma rozmiarów wszystkich takich sekcji, jeœli jest ich więcej.
  • SizeOfUninitializedData - rozmiar sekcji z niezainicjowanymi danymi lub suma rozmiarów wszystkich takich sekcji, jeœli jest ich więcej.
  • AddressOfEntryPoint - adres punktu wejœciowego/startowego względem adresu bazowego, gdy program jest wczytany do pamięci. Dla plików EXE jest to adres, w którym rozpoczyna się wykonywanie programu. Dla sterowników urzšdzeń (device drivers) jest to adres funkcji inicjujšcej. Dla plików DLL adres ten jest opcjonalny i może wynosić 0.
  • BaseOfCode - adres sekcji z kodem wykonywalnym względem adresu bazowego, gdy plik jest wczytany do pamięci.
  • ImageBase - adres bazowy. Adres w przestrzeni adresowej programu/biblioteki, w którym znajduje się pierwszy bajt pliku po wczytaniu do pamięci. Musi być wielokrotnoœciš 64 KB.
    Większoœć adresów używanych przy opisie PE32, to adresy okreœlajšce położenie względem adresu bazowego. Takie względne adresy okreœla się jako RVA - relative virtual address, natomiast adresy okreœlajšce położenie względem poczštku przestrzeni adresowej aplikacji okreœla się jako VA - virtual address.
  • SectionAlignment - wyrównanie sekcji (w bajtach), gdy plik jest wczytany do pamięci. Musi być wielokrotnoœciš FileAlignment.
  • FileAlignment - wyrównanie sekcji (w bajtach) w pliku. Wartoœć powinna być potęgš 2 i musi się mieœcić w zakresie 512 B - 64 KB. Domyœlnie 512 B.
  • SizeOfImage - rozmiar obrazu pliku po wczytaniu do pamięci, wliczajšc w to wszystkie nagłówki. Musi być wielokrotnoœciš SectionAlignment.
  • SizeOfHeaders - łšczny rozmiar programu MS-DOS Stub, nagłówka PE i nagłówków sekcji zaokršglony do wielokrotnoœci FileAlignment.
  • CheckSum - suma kontrolna. Algorytm obliczajšcy tę sumę znajduje się w pliku systemowym IMAGHELP.DLL. Prawidłowa suma kontrolna jest wymagana dla wszystkich sterowników i niektórych plików DLL (m.in. bibliotek ładowanych przy starcie systemu). W plikach EXE skompilowanych za pomocš kompilatorów Microsoftu lub Borlanda w CheckSum zazwyczaj znajduje sie 0.
  • NumberOfRvaAndSizes - liczba elementów tablicy DataDirectory znajdujšcej się na końcu nagłówka PE, a przynajmniej taka informacja znajduje się w specyfikacji PE32. W pliku winnt.h, dla okreœlenia liczby elementów wspomnianej tablicy, wykorzystuje się stałš IMAGE_NUMBEROF_DIRECTORY_ENTRIES, która wynosi 16.
  • DataDirectory - 16-sto elementowa tablica, w której znajdujš się informacje na temat położenia i rozmiaru standardowych sekcji. Każdy element tej tablicy jest rekordem typu IMAGE_DATA_DIRECTORY.
    Spoœród wszystkich Data Directories chyba najważniejsze sš pierwsze trzy:
    • Export Table - lista funkcji eksportowanych przez badany program/bibliotekę (funkcje dostępne dla innych aplikacji). Lista ta z reguły występuje w plikach DLL, w plikach EXE jest rzadkoœciš;
    • Import Table - lista funkcji importowanych przez badany program/bibliotekę z plików zewnętrznych;
    • Resource Table - lista zasobów znajdujšcych się w badanym pliku. Zasobami mogš być bitmapy, ikony, kursory, czcionki, menu, okna dialogowe, tabele łańcuchów (string tables), informacje o wersji (version info) i inne.

Section Headers (Section Table)

Tabela z nagłówkami sekcji znajduje się bezpoœrednio po nagłówku PE. Liczba elementów tej tabeli jest podana w polu NumberOfSections w nagłówku COFF. Każdy element tej tabeli jest rekordem typu IMAGE_SECTION_HEADER, który wyglšda następujšco:
const
  IMAGE_SIZEOF_SHORT_NAME = 8;
  ...
  
type

  TISHMisc = record
    case Integer of
      0: (PhysicalAddress: DWORD);
      1: (VirtualSize: DWORD);
  end;
  
  IMAGE_SECTION_HEADER = record
    Name: array[0..IMAGE_SIZEOF_SHORT_NAME - 1] of Char;
    Misc: TISHMisc;
    VirtualAddress: DWORD;
    SizeOfRawData: DWORD;
    PointerToRawData: DWORD;
    PointerToRelocations: DWORD;
    PointerToLinenumbers: DWORD;
    NumberOfRelocations: Word;
    NumberOfLinenumbers: Word;
    Characteristics: DWORD;
  end;
Najważniejsze pola to:
  • Name - 8-bajtowy łańcuch tekstowy zakończony znakiem 0 (null-terminated string).
  • VirtualSize - całkowity rozmiar sekcji po wczytaniu do pamięci.
  • VirtualAddress - położenie względem adresu bazowego (RVA) pierwszego bajtu sekcji, gdy plik jest wczytany do pamięci.
  • SizeOfRawData - rozmiar sekcji wewnštrz pliku EXE. Musi być wielokrotnoœciš wartoœci pamiętanej w polu FileAlignment w nagłówku PE. Jeœli wartoœć SizeOfRawData jest mniejsza od VirtualSize, pozostała częœć sekcji jest wypełniana zerami, tak aby rozmiar całej sekcji wyniósł VirtualSize.
    Ponieważ wartoœć pamiętana w tym polu jest zaokršglana do wielokrotnoœci FileAlignment, podczas gdy VirtualSize nie, istnieje możliwoœć, że SizeOfRawData będzie większe od VirtualSize.
  • PointerToRawData - adres plikowy, gdzie rozpoczyna ię dana sekcja. W plikach EXE musi być wielokrotnoœciš FileAlignment.
  • Characteristics - róznego rodzaju informacje dotyczšce sekcji mówišce m.in. o tym, czy sekcja zawiera kod wykonywalny, zainicjowane dane, niezainicjowane dane, relokacje itd.

Przykłady

DOS Header, DOS Stub, PE Header, Section Headers - zrzut szesnastkowy

Poniżej przedstawiony jest zrzut szesnastkowy pierwszych 1024 bajtów typowego pliku EXE.

Pierwsze 64 bajty to DOS Header (wyróżniony kolorem szarym).
Pierwsze pole tego nagłówka to e_magic, w którym zapisany jest tzw. magic number, czyli $4D $5A (łańcuch MZ).
Ostatnie pole to 4 bajtowy e_lfanew, w którym znajduje się offset sygnatury PE (tutaj 00 01 00 00).
Uwaga!
Jeœli używasz procesora firmy Intel lub AMD, liczbę takš należy odczytywać od tyłu (zobacz opis Little Endian). A więc 00 01 00 00 należy rozumieć jako liczbę $00 00 01 00.

Bezpoœrednio po nagłówku DOS znajduje się DOS Stub, którego zadaniem (w przypadku uruchomienia pliku EXE w œrodowisku DOS) jest wyœwietlenie łańcucha This program must be run under Win32. Łańcuch ten jest zakończony znakami CR LF ($0D $0A).

Na pozycji $01 00 znajduje się poprawna sygnatura PE32 - bajty $50 $45 $00 $00, czyli łańcuch PE, po którym następujš dwa bajty zerowe.

Kolejnych 20 bajtów to COFF Header wyróżniony żółtym kolorem. Widać tutaj m.in., że plik ma 8 sekcji.

Nastepnie znajduje się PE Header wyróżniony kolorem fioletowym.

Dalej znajduje się 8 40-bajtowych nagłówków sekcji wyróżnionych kolorem zielonym.


Pierwsze 1024 bajty typowego pliku EXE
00000000:  4D 5A 50 00 02 00 00 00 04 00 0F 00 FF FF 00 00      MZP.........˙˙..
00000010:  B8 00 00 00 00 00 00 00 40 00 1A 00 00 00 00 00      ¸.......@.......
00000020:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
00000030:  00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00      ................
00000040:  BA 10 00 0E 1F B4 09 CD 21 B8 01 4C CD 21 90 90      ş...´.Í!¸.LÍ!
00000050:  54 68 69 73 20 70 72 6F 67 72 61 6D 20 6D 75 73      This program mus
00000060:  74 20 62 65 20 72 75 6E 20 75 6E 64 65 72 20 57      t be run under W
00000070:  69 6E 33 32 0D 0A 24 37 00 00 00 00 00 00 00 00      in32..$7........
00000080:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
00000090:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000000A0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000000B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000000C0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000000D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000000E0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000000F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
00000100:  50 45 00 00 4C 01 08 00 19 5E 42 2A 00 00 00 00      PE..L....^B*....
00000110:  00 00 00 00 E0 00 8E 81 0B 01 02 19 00 24 00 00      ....ŕ.Ž......$..
00000120:  00 0E 00 00 00 00 00 00 8C 33 00 00 00 10 00 00      ........Œ3......
00000130:  00 40 00 00 00 00 40 00 00 10 00 00 00 02 00 00      .@....@.........
00000140:  04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00      ................
00000150:  00 B0 00 00 00 04 00 00 00 00 00 00 02 00 00 00      .°..............
00000160:  00 00 10 00 00 40 00 00 00 00 10 00 00 10 00 00      .....@..........
00000170:  00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00      ................
00000180:  00 60 00 00 2C 03 00 00 00 A0 00 00 00 02 00 00      .`..,.... ......
00000190:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000001A0:  00 90 00 00 D8 02 00 00 00 00 00 00 00 00 00 00      ....Ř...........
000001B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000001C0:  00 80 00 00 18 00 00 00 00 00 00 00 00 00 00 00      .€..............
000001D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000001E0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000001F0:  00 00 00 00 00 00 00 00 43 4F 44 45 00 00 00 00      ........CODE....
00000200:  A4 23 00 00 00 10 00 00 00 24 00 00 00 04 00 00      ¤#.......$......
00000210:  00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60      ............ ..`
00000220:  44 41 54 41 00 00 00 00 A0 00 00 00 00 40 00 00      DATA.... ....@..
00000230:  00 02 00 00 00 28 00 00 00 00 00 00 00 00 00 00      .....(..........
00000240:  00 00 00 00 40 00 00 C0 42 53 53 00 00 00 00 00      ....@..ŔBSS.....
00000250:  5D 06 00 00 00 50 00 00 00 00 00 00 00 2A 00 00      ]....P.......*..
00000260:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0      ...............Ŕ
00000270:  2E 69 64 61 74 61 00 00 2C 03 00 00 00 60 00 00      .idata..,....`..
00000280:  00 04 00 00 00 2A 00 00 00 00 00 00 00 00 00 00      .....*..........
00000290:  00 00 00 00 40 00 00 C0 2E 74 6C 73 00 00 00 00      ....@..Ŕ.tls....
000002A0:  08 00 00 00 00 70 00 00 00 00 00 00 00 2E 00 00      .....p..........
000002B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0      ...............Ŕ
000002C0:  2E 72 64 61 74 61 00 00 18 00 00 00 00 80 00 00      .rdata.......€..
000002D0:  00 02 00 00 00 2E 00 00 00 00 00 00 00 00 00 00      ................
000002E0:  00 00 00 00 40 00 00 50 2E 72 65 6C 6F 63 00 00      ....@..P.reloc..
000002F0:  D8 02 00 00 00 90 00 00 00 04 00 00 00 30 00 00      Ř...........0..
00000300:  00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 50      ............@..P
00000310:  2E 72 73 72 63 00 00 00 00 02 00 00 00 A0 00 00      .rsrc........ ..
00000320:  00 02 00 00 00 34 00 00 00 00 00 00 00 00 00 00      .....4..........
00000330:  00 00 00 00 40 00 00 50 00 00 00 00 00 00 00 00      ....@..P........
00000340:  00 00 00 00 00 B0 00 00 00 00 00 00 00 36 00 00      .....°.......6..
00000350:  00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 50      ............@..P
00000360:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
00000370:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
00000380:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
00000390:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000003A0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000003B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000003C0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000003D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000003E0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................
000003F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00      ................

Sekcja DATA - zrzut szesnastkowy

Poniżej znajduje się wykonany przez PEInfo zrzut 16-stkowy sekcji DATA programu skompilowanego za pomocš Delphi 7 Personal. Jego kod Ÿródłowy wyglšda następujšco:
program test;
begin
end.

W wyniku kompilacji otrzymujemy plik o nazwie test.exe.

Poniższy listing przedstawia tylko sekcję DATA, która rozpoczyna się w pliku od offsetu $2800 (PointerToRawData), a kończy na offsecie $2A00 (PointerToRawData + SizeOfRawData).

VirtualSize wynosi 160 ($A0) i jest mniejszy od SizeOfRawData, który wynosi 512 ($200).

(Wartoœć pola FileAlignment, w nagłówku PE wynosi 512 B.)
Ponieważ rozmiar sekcji wewnštrz pliku musi być wielokrotnoœciš FileAlignment, sekcja została uzupełniona zerami do rozmiaru 512 B.


Sekcja DATA
File: F:\test.exe
Start: $00002800
  End: $00002A00
 Size: $00000200
////////////////////////////////////////////////////////////////////////////////
SECTION: DATA
           VirtualSize: $A0
        VirtualAddress: $4000
         SizeOfRawData: $200
      PointerToRawData: $2800
  PointerToRelocations: $0
  PointerToLinenumbers: $0
   NumberOfRelocations: 0
   NumberOfLinenumbers: 0
       Characteristics: $C0000040
////////////////////////////////////////////////////////////////////////////////
Offset       hex                                                ASCII
--------------------------------------------------------------------------------
00002800:    00 00 00 00 00 00 00 00 02 8D 40 00 32 13 8B C0    .........@.2.‹Ŕ
00002810:    00 8D 40 00 00 8D 40 00 00 8D 40 00 00 00 00 00    .@..@..@.....
00002820:    00 00 00 00 64 1E 40 00 F4 1F 40 00 74 23 40 00    ....d.@.ô.@.t#@.
00002830:    00 CB CC C8 C9 D7 CF C8 CD CE DB D8 DA D9 CA DC    .ËĚČÉ×ĎČÍÎŰŘÚŮĘÜ
00002840:    DD DE DF E0 E1 E3 00 E4 E5 8D 40 00 45 72 72 6F    ÝŢßŕáă.äĺ@.Erro
00002850:    72 00 8B C0 52 75 6E 74 69 6D 65 20 65 72 72 6F    r.‹ŔRuntime erro
00002860:    72 20 20 20 20 20 61 74 20 30 30 30 30 30 30 30    r     at 0000000
00002870:    30 00 8B C0 30 31 32 33 34 35 36 37 38 39 41 42    0.‹Ŕ0123456789AB
00002880:    43 44 45 46 FF FF FF FF 00 00 00 00 00 00 00 00    CDEF˙˙˙˙........
00002890:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000028A0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000028B0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000028C0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000028D0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000028E0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000028F0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002900:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002910:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002920:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002930:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002940:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002950:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002960:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002970:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002980:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00002990:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000029A0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000029B0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000029C0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000029D0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000029E0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
000029F0:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

Linki

  1. Microsoft Portable Executable and Common Object File Format Specification
    Specyfikacja Microsoftu. Podstawowe Ÿródło informacji na temat formatu PE32.
  2. ExeImages
    Moduł Delphi, w którym znajdujš się definicje stałych i typów danych potrzebnych do analizy plików EXE oraz kilka funkcji pomocniczych. Moduł ten został wykorzystany przy pisaniu PEInfo.
  3. PEBrowse Professional
    Bezpłatny program podobny do PEInfo, ale jeszcze bardziej rozbudowany. Posiada też wbudowany deasembler.
  4. PE Explorer
    Bardzo dobry EXE Analyzer. Niestety komercyjny.
  5. ExeScope
    Program co najmniej o klasę gorszy od PEBrowse, czy PE Explorera. Kiedyœ darmowy, obecnie shareware. Odnoœnik podaję tylko dlatego, że cieszył się kiedyœ (być może nawet do dziœ) dużš popularnoœciš.
  6. ResHacker
    Bardzo dobry i darmowy edytor zasobów. Cieszy się dużš popularnoœciš do dziœ.
    Nie można w nim co prawda dokonać analizy nagłówków, za to z zasobami można zrobić (prawie) wszystko.
  7. http://msdn.microsoft.com/msdnmag/issues/02/02/PE/ - artykuł w MSDN Magazine opisujšcy format PE32.

Słowa kluczowe