PEInfo 0.9 BETA
Analiza plików wykonywalnych EXE, DLL, OCX. Budowa pliku EXE, EXE headers.
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.

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 okrelana 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). Wartoci pól sš podawane jako liczby dziesiętne, szesnastkowe i binarne.
- Wywietlanie wszystkich katalogów Data Directories, z możliwociš 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, wskanik do relokacji itd.).
- Możliwoć wykonania zrzutu szesnatkowego dowolnej sekcji.
- Wywietlanie 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.
- Wywietlanie listy uruchomionych procesów oraz wykorzystywanych przez nie modułów.
- Możliwoć zapisania szczegółowego raportu do pliku HTML.
Zrzuty ekranu
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 powię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 "kompatybilnoci 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;
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 wywietlenia 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.
Jeli sygnatura jest inna od opisanej, najprawdopodobniej mamy do czynienia z plikiem niezgodnym ze specyfikacjš PE32. PEInfo wywietli wówczas komunikat Not a PE (Win32 Executable) file!.
COFF Header (Nagłówek COFF)
Niekiedy okrelany też jako File Header.Nagłówek ten występuje bezporednio 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;
- 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;
- SizeOfCode - rozmiar sekcji z kodem wykonywalnym lub suma rozmiarów wszystkich takich sekcji, jeli 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, jeli jest ich więcej.
- SizeOfUninitializedData - rozmiar sekcji z niezainicjowanymi danymi lub suma rozmiarów wszystkich takich sekcji, jeli jest ich więcej.
- AddressOfEntryPoint - adres punktu wejciowego/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ć wielokrotnociš 64 KB.
Większoć adresów używanych przy opisie PE32, to adresy okrelajšce położenie względem adresu bazowego. Takie względne adresy okrela się jako RVA - relative virtual address, natomiast adresy okrelajšce położenie względem poczštku przestrzeni adresowej aplikacji okrela się jako VA - virtual address. - SectionAlignment - wyrównanie sekcji (w bajtach), gdy plik jest wczytany do pamięci. Musi być wielokrotnociš FileAlignment.
- FileAlignment - wyrównanie sekcji (w bajtach) w pliku. Wartoć powinna być potęgš 2 i musi się miecić w zakresie 512 B - 64 KB. Domylnie 512 B.
- SizeOfImage - rozmiar obrazu pliku po wczytaniu do pamięci, wliczajšc w to wszystkie nagłówki. Musi być wielokrotnociš SectionAlignment.
- SizeOfHeaders - łšczny rozmiar programu MS-DOS Stub, nagłówka PE i nagłówków sekcji zaokršglony do wielokrotnoci 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 okrelenia 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.
Sporó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 rzadkociš;
- 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ę bezporednio 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;
- 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ć wielokrotnociš wartoci pamiętanej w polu FileAlignment w nagłówku PE. Jeli 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 wielokrotnoci 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ć wielokrotnociš 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! Jeli 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.
Bezporednio po nagłówku DOS znajduje się DOS Stub, którego zadaniem (w przypadku uruchomienia pliku EXE w rodowisku DOS) jest wywietlenie ł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.
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ć wielokrotnociš FileAlignment, sekcja została uzupełniona zerami do rozmiaru 512 B.
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
- Microsoft Portable Executable and Common Object File Format Specification
Specyfikacja Microsoftu. Podstawowe ródło informacji na temat formatu PE32. - 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. - PEBrowse Professional
Bezpłatny program podobny do PEInfo, ale jeszcze bardziej rozbudowany. Posiada też wbudowany deasembler. - PE Explorer
Bardzo dobry EXE Analyzer. Niestety komercyjny. - ExeScope
Program co najmniej o klasę gorszy od PEBrowse, czy PE Explorera. Kiedy darmowy, obecnie shareware. Odnonik podaję tylko dlatego, że cieszył się kiedy (być może nawet do dzi) dużš popularnociš. - ResHacker
Bardzo dobry i darmowy edytor zasobów. Cieszy się dużš popularnociš do dzi.
Nie można w nim co prawda dokonać analizy nagłówków, za to z zasobami można zrobić (prawie) wszystko. - http://msdn.microsoft.com/msdnmag/issues/02/02/PE/ - artykuł w MSDN Magazine opisujšcy format PE32.