Wednesday, September 23, 2009

සිංහලෙන් win32 Portable Executable format - part 3

පසුගිය සටහනෙන් අප සාකච්චා කළේ IMAGE_NT_SIGNATURE හා IMAGE_FILE_HEADER ගැනයි. එය IMAGE_NT_HEADERS හි ප්‍රධාන කොටස් 3 න් 2 කි.
මීලගට ඇත්තේ තවත් ප්‍රධාන කොටසක් වන IMAGE_OPTIONAL_HEADER යන්නයි.මෙය තවත් කොටස් 31 කට වෙන් කල හැක. පහත දක්වා ඇත්තේ එයට අදාල source එක වේ.


typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16

//
// Optional header format.
//

typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//

WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;

//
// NT additional fields.
//

DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;




මෙම පින්තූරයෙන් දක්වා ඇත්තේ calc.exe හි IMAGE_OPTIONAL_HEADER පිහිටා ඇති ආකාරය වේ.


1. Magic
මෙමගින් අදාල PE එක PE32 හෝ PE32+ ද යන වග බලා ගත හැක.
0x010B - PE32 Executable
0x020B - PE32+ Executable

2. MajorLinkerVersion හා
3. MinorLinkerVersion මගින් PE එක නිර්මානය කිරීමට යොදා ගත් linker එකෙහි version එක බලා ගත හැක.
උදා: MajorLinkerVersion - 0x07 හා MinorLinkerVersion - 0x00 නම්
linker version - 7.00

4. SizeOfCode
Code(text) section හි විශාලත්වය bytes වලින් දක්වා ඇත.

5. SizeOfInitializedData
Initialized data(data) section හි විශාලත්වය bytes වලින් දක්වා ඇත.

6. SizeOfUninitializedData
Uninitialized Data(bss) section හි විශාලත්වය bytes වලින් දක්වා ඇත.

7. AddressOfEntryPoint
මෙමගින් PE එක execute වීම ආරම්භක ස්ථානය දක්වා ඇත. මෙය exe එකක නම් main() එකත් dll එකක නම් LibMain() එකත් Driver file එකක නම් DriverEntry() යන ස්ථාන වේ. මෙය ImageBase එකට සාපේක්ෂ ස්ථානය වේ. මෙම කොටසින් පසුව Virtual address හා Relative Virtual Address පිළිබදව විස්තර කරනු ඇත.

8. BaseOfCode
මෙය ImageBase එකට සාපේක්ෂ code section හි ආරම්භක ස්ථානය වේ.

9. BaseOfData
මෙය ImageBase එකට සාපේක්ෂ data section හි ආරම්භක ස්ථානය වේ.

10. ImageBase
මෙමගින් PE එක memory එකට load විය යුතු ස්ථානය දක්වයි. එම ස්ථානය free space ‍නොමැති නම් ඉදිරියට free space ඇති ස්ථානයකට load වේ. මෙය 64k මගින් ගුණකර ගත යුතුය.

11. SectionAlignment
මෙමගින් Sections, memory එකට load වීමේදී පිහිටිය යුතු ආකාරය දක්වයි. load වන address එක මෙහි ගුණාකාරයක් විය යුතුය.
උදා: SectionAlignment - 0x00001000 නම්
පළමු section එකෙහි විශාලත්වය 75440 bytes හා එය load වූයේ 0x00101000 යන ස්ථානය‍ට යැයි සිතන්න.
එවිට දෙවන section එක load වනුයේ 0x00114000 යන ස්ථානයට වේ.

12. FileAlignment
මෙය ඉහත SectionAlignment මෙන්ම file එකෙහි තිබෙන ආකාරයයි. මෙය SectionAlignment එකට වඩා කුඩා හෝ සමා‍න වේ.

13. MajorOSVersion හා
14. MinorOSVersion මගින් linker version ලබා ගත් ආකාරයටම OS Version එක ලබා ගත හැකි වේ.

15. MajorImageVersion හා
16. MinorImageVersion මගින් Image Version එක ලබා ගත හැකි වේ.

17. MajorSubsystemVersion හා
18. MinorSubsystemVersion මගින් Subsystem Version(Win32 version හෝ the POSIX version) එක ලබා ගත හැකි වේ.

19. Win32VersionValue
මෙය 0x00000000 අගයෙහි පවතී.

20. SizeOfImage
මෙහි දක්වා ඇත්තේ PE එක memory එකට load වූ පසු ගන්නා මුළු ඉඩ ප්‍රමාණයයි.

21. SizeOfHeaders
මෙමගින් දක්වා ඇත්තේ MS-DOS Stub, PE header හා section headers සදහා ගන්නා ලද මුළු ඉඩ ප්‍රමාණයයි.

22. CheckSum
මෙහි ඇත්තේ NT version එක වේ. එය අවශ්‍ය වනුයේ NT Drivers සදහා පමණි. වෙනත් format සදහා මෙය පරීක්ෂා නොකරයි.

23. Subsystem
මෙම‍ PE එක run කිරීමට අවශ්‍ය subsystem එක දක්වා ඇත.
පහත අගයන් තිබිය හැක.

0x0000 (IMAGE_SUBSYSTEM_UNKNOWN) - An unknown subsystem
0x0001 (IMAGE_SUBSYSTEM_NATIVE) - Device drivers and native Windows processes
0x0002 (IMAGE_SUBSYSTEM_WINDOWS_GUI) - The Windows graphical user interface (GUI) subsystem
0x0003 (IMAGE_SUBSYSTEM_WINDOWS_CUI) - The Windows character subsystem
0x0005 (IMAGE_SUBSYSTEM_OS2_CUI) - The OS/2 character subsystem
0x0007 (IMAGE_SUBSYSTEM_POSIX_CUI) - The Posix character subsystem
0x0008 (IMAGE_SUBSYSTEM_NATIVE_WINDOWS) - Native Win9x driver
0x0009 (IMAGE_SUBSYSTEM_WINDOWS_CE_GUI) - Windows CE
0x000A - An Extensible Firmware Interface (EFI) application
0x000B - An EFI driver with boot services
0x000C - An EFI driver with run-time services
0x000D - An EFI ROM image
0x000E - XBOX

24. DLLCharacteristics
මෙය dll සදහා පමණක් වලංගු වේ. මෙමගින් dll එකෙහි Characteristics පෙන්වා දෙයි.
මෙයද bits වලට වෙන් කර ගත යුතුය. bit වලට 1 යන අගය තිබේ නම් පහත ගුණාංග තිබේ.


bit 0 - Terminal Server aware.
bit 1 - Not used.
bit 2 - A WDM driver.
bit 3 - Reserved, must be zero.
bit 4 - Do not bind the image.
bit 5 - Does not use structured exception (SE) handling. No SE handler may be called in this image.
bit 6 - Isolation aware, but do not isolate the image.
bit 7 - Image is NX compatible.
bit 8 - Code Integrity checks are enforced
bit 9 - DLL can be relocated at load time.
bit 10 - Not used.
bit 11 - Not used.
bit 12 - Reserved, must be zero.
bit 13 - Reserved, must be zero.
bit 14 - Reserved, must be zero.
bit 15 - Reserved, must be zero.

25. SizeOfStackReserve
PE එක සදහා අවශ්‍ය වන අමතර stack එකෙහි විශාලත්වය දක්වා ඇත.

26. SizeOfStackCommit
PE එක සදහා අවශ්‍ය වන stack එකෙහි විශාලත්වය දක්වා ඇත.

27. SizeOfHeapReserve
PE එක සදහා අවශ්‍ය වන අමතර heap එකෙහි විශාලත්වය දක්වා ඇත.

28. SizeOfHeapCommit
PE එක සදහා අවශ්‍ය වන heap එකෙහි විශාලත්වය දක්වා ඇත.

29. LoaderFlags
0x00000000 අගයෙහි පවතී.

30. NumberOfRvaAndSizes
Data directory වල address ගනනෙහි හා size ගනනෙහි එකතුව දක්වා ඇත.

31. IMAGE_DATA_DIRECTORY
මෙය තවත් කොටස් 32 කට වෙන් කරනු ලබයි. මෙය array එකක් ලෙස ගනී. එය පහත ආකාරයට දක්වයි.

IMAGE_DIRECTORY_ENTRY_EXPORT.VirtualAddress - Export Directory
IMAGE_DIRECTORY_ENTRY_EXPORT.Size
IMAGE_DIRECTORY_ENTRY_IMPORT.VirtualAddress - Import Directory
IMAGE_DIRECTORY_ENTRY_IMPORT.Size
IMAGE_DIRECTORY_ENTRY_RESOURCE.VirtualAddress - Resource Directory
IMAGE_DIRECTORY_ENTRY_RESOURCE.Size
IMAGE_DIRECTORY_ENTRY_EXCEPTION.VirtualAddress - Exception Directory
IMAGE_DIRECTORY_ENTRY_EXCEPTION.Size
IMAGE_DIRECTORY_ENTRY_SECURITY.VirtualAddress - Security Directory
IMAGE_DIRECTORY_ENTRY_SECURITY.Size
IMAGE_DIRECTORY_ENTRY_BASERELOC.VirtualAddress - Base Relocation Table
IMAGE_DIRECTORY_ENTRY_BASERELOC.Size
IMAGE_DIRECTORY_ENTRY_DEBUG.VirtualAddress - Debug Directory
IMAGE_DIRECTORY_ENTRY_DEBUG.Size
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE.VirtualAddress - Architecture Specific Data
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE.Size
IMAGE_DIRECTORY_ENTRY_GLOBALPTR.VirtualAddress - RVA of GP
IMAGE_DIRECTORY_ENTRY_GLOBALPTR.Size
IMAGE_DIRECTORY_ENTRY_TLS.VirtualAddress - TLS Directory
IMAGE_DIRECTORY_ENTRY_TLS.Size
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG.VirtualAddress - Load Configuration Directory
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG.Size
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT.VirtualAddress - Bound Import Directory in headers
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT.Size
IMAGE_DIRECTORY_ENTRY_IAT.VirtualAddress - Import Address Table
IMAGE_DIRECTORY_ENTRY_IAT.Size
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT.VirtualAddress - Delay Load Import Descriptors
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT.Size
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR.VirtualAddress - COM Runtime descriptor
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR.Size
IMAGE_DIRECTORY_ENTRY_RESERVED.VirtualAddress - RESERVED
IMAGE_DIRECTORY_ENTRY_RESERVED.Size

ඉහත එක් එක් කොටස් තුල එම Directories සදහා relative virtual address හා size දක්වා ඇත. පිහිටා නොමැති Directories සදහා 0x00000000 යන අගය ඇත.

පහත දැක්වෙන වගුවෙන් දක්වා ඇත්තේ IMAGE_NT_HEADERS පිහිටීම හා calc.exe හි ඇති දත්ත වේ.



දැන් නම් අදට ඇති කියල හිතෙනවා. ඒක නිසා අදට නවත්වනවා. ලබන සතියෙ ආයෙමත් ලියනවා. මෙතනින් IMAGE_NT_HEADERS ගැන ලියල ඉවරයි. ලබන සතියෙ ලියන්නෙ Image Section headers ගැනයි.

3 comments:

  1. මුලදී නම් ටිකක් තේරුම් ගන්න අමාරු උනා. දැන් නම් ටිකක් වැඩේ පැහැදිලියි...මේ ගැන උනන්දු අයට මේ ලිපි පෙල සෑහෙන වැදගත් වේවි...!

    ReplyDelete