|
|||||||||||||||||||||||||||||||||||||||||||||||||||
| STARTPROGRAMYWsparciePobieranieNowociLinkiO stroniemapa strony | |||||||||||||||||||||||||||||||||||||||||||||||||||
PEInfo 0.9 BETA
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.
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 cechy programu:
Program został napisany w rodowisku Borland Delphi 7 Personal. ScreenshotsPE32 File FormatStruktura 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:
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:
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 StubDOS 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;
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;
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;
PrzykładyDOS Header, DOS Stub, PE Header, Section Headers - zrzut szesnastkowyPoniżej przedstawiony jest zrzut szesnastkowy pierwszych 1024 bajtów typowego pliku EXE.
Pierwsze 64 bajty to DOS Header (wyróżniony kolorem szarym). 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. 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 szesnastkowyPoniż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.) 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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||