Wednesday, September 30, 2009

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

පසුගිය කලාපයේ අප සාකච්චා කලේ IMAGE_OPTIONAL_HEADER ගැනයි. මීලගට අපට ඇත්තේ Image Section headers යන කොටස විස්තර කිරීමටයි. නමුත් ඊට ප්‍රථම Relative Virtual Address(RVA) හා Virtual Address(VA) පිළිබදව විස්තර කිරීමක් සිදු කල යුතුය.



RVA හා VA
RVA යනු PE එක RAM එකට load වූ පසු එහි ආරම්භක ස්ථානයට සාපේක්ෂ address එකයි. VA යනු එහි සත්‍ය address එකයි. එය පහත ආකාරයට දැක්විය හැක.

VA = RVA + PE එක RAM එකෙහි ආරම්භක ස්ථානය

RVA මගින් file offset එක සොයන ආකාරය
උදා: calc.exe හි Import table හි RVA = 0x00012B80 වේ. .text section හි pointer to row data =0x00000400, virtual address = 0x00001000 හා virtual size = 0x000126B0 වේ.
තවද මෙහි SectionAlignment = 0x00001000 හා SizeOfHeaders = 0x00000400 වේ.

RVA යනු RAM එකේදී සාපේක්ෂ address එකයි. file එකේදී සෙවීමට නම් පළමුව එය අයත් section එක සොයා ගත යුතුය. .text හි පරාසය 0x00001000 - 0x000136B0 වේ. එම නිසා import table අයත් වනුයේ .text section එකටය. එවිට,

file offset = RVA - Section.VirtualAddress + Section.FileOffset
ලෙස විය යුතුය.

මෙහි Section යනු, RVA එක අයත් Section එක වේ.
එම නිසා Import table හි ආරම්භක file offset එක

= 0x00012B80 - 0x00001000 + 0x00000400
= 0x00011F80

ට සමාන වේ.



සෑම අවස්ථාවකම වාගේ පළමු වන section එක RAM එකෙහි ආරම්භ වනුයේ SectionAlignment එක RVA වන address එකේදීය (FileAlignment නොමැතිව ගත් විට headers හි විශාලත්වය(=0x000002DE), SectionAlignment එකට වඩා කුඩා නිසා.). එලෙසම file එකේදී පළමු section එක ආරම්භ වන ස්ථානය SizeOfHeaders යන අගයට සමාන වේ.

මෙතෙක් අප සාකච්චා කල කොටස් වල රූපමය සටහනක් පහත දක්වා ඇත.

Image Section headers
මීලගට අප නැවතත් Image Section headers ගැන විස්තර කරමු. මෙය ප්‍රධාන කොටස් 2 කට වෙන් කරන්න පුළුවන්.

1. IMAGE_SECTION_HEADER
2. IMAGE_SECTION

IMAGE_SECTION_HEADER
පළමුව IMAGE_SECTION_HEADER පිළිබදව සලකා බලමු. මෙය තවත් කොටස් වලට බෙදේ. එම වෙන් කෙරෙන කොටස් ගනන PE එකෙහි තිබෙන section ගනනට සමාන වේ. එම එක් එක් කොටස් තවත් කොටස් 10 කට වෙන් කෙරේ.

  1. Name
  2. VirtualSize
  3. VirtualAddress
  4. SizeOfRowData
  5. PointerToRowData
  6. PointerToRelocations
  7. PointerToLineNumbers
  8. NumberOfRelocations
  9. NumberOfLineNumbers
  10. Characteristics

Name
මෙහි සදහන්ව ඇත්තේ section එකෙහි නම වේ. එය UTF-8 string එකකි.

VirtualSize
RAM එකට load වූවාට පසු section එකෙහි size එක මෙමගින් දක්වා ඇත.

VirtualAddress
RAM එකට load වූවාට පසු section එකෙහි ImageBase එකට සාපේක්ෂ ආරම්භක address එක මෙමගින් දක්වා ඇත.

SizeOfRowData
file එකේදී section එකේ විශාලත්වය මෙමගින් දක්වා ඇත. එය VirtualSize එකට වඩා විශාල විය යුතුය.

calc.exe හි .text section හි පිහිටීම


PointerToRowData
මෙමගින් section එකෙහි ආරම්භක file offset එක දක්වා ඇත.

PointerToRelocations
Relocations table හි file offset එක දක්වා ඇත. මෙය object files සදහා පමණක් වලංගු වේ.

PointerToLineNumbers
line number information සදහා file offset එක දක්වා ඇත. මෙයද object files සදහා පමණක් වලංගු වේ.

NumberOfRelocations
Relocations ගනන දක්වා ඇත.

NumberOfLineNumbers
line number informations ගනන දක්වා ඇත.

Characteristics
මෙමගින් අදාල section හි Characteristics විස්තර කරයි. පළමුව මෙය පහත ආකාරයට වෙන් කර ගත යුතුය.

bit 0 (IMAGE_SCN_MEM_WRITE) - The section can be written to.
bit 1 (IMAGE_SCN_MEM_READ) - The section can be read.
bit 2 (IMAGE_SCN_MEM_EXECUTE) - The section can be executed as code.
bit 3 (IMAGE_SCN_MEM_SHARED) - The section can be shared in memory.
bit 4 (IMAGE_SCN_MEM_NOT_PAGED) - The section is not pageable.
bit 5 (IMAGE_SCN_MEM_NOT_CACHED) - The section cannot be cached.
bit 6 (IMAGE_SCN_MEM_DISCARDABLE) - The section can be discarded as needed.
bit 7 (IMAGE_SCN_LNK_NRELOC_OVFL) - The section contains extended relocations.
ASCII_Code(1st 4 bits of byte 2) == 1 (IMAGE_SCN_ALIGN_1BYTE) - Align data on a 1-byte boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 2 (IMAGE_SCN_ALIGN_2BYTES) - Align data on a 2-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 3 (IMAGE_SCN_ALIGN_4BYTES) - Align data on a 4-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 4 (IMAGE_SCN_ALIGN_8BYTES) - Align data on a 8-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 5 (IMAGE_SCN_ALIGN_16BYTES) - Align data on a 16-bytes boundary. Valid only for object files.
ASCII_Code(1st 4
bits of byte 2) == 6 (IMAGE_SCN_ALIGN_32BYTES) - Align data on a 32-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 7 (IMAGE_SCN_ALIGN_64BYTES) - Align data on a 64-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 8 (IMAGE_SCN_ALIGN_128BYTES) - Align data on a 128-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 9 (IMAGE_SCN_ALIGN_256BYTES) - Align data on a 256-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 10 (IMAGE_SCN_ALIGN_512BYTES) - Align data on a 512-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 11 (IMAGE_SCN_ALIGN_1024BYTES) - Align data on a 1024-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 12 (IMAGE_SCN_ALIGN_2048BYTES) - Align data on a 2048-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 13 (IMAGE_SCN_ALIGN_4096BYTES) - Align data on a 4096-bytes boundary. Valid only for object files.
ASCII_Code(1st 4 bits of byte 2) == 14 (IMAGE_SCN_ALIGN_8192BYTES) - Align data on a 8192-bytes boundary. Valid only for object files.
bit 12 (IMAGE_SCN_MEM_LOCKED) - Reserved for future use.
bit 13 (IMAGE_SCN_MEM_16BIT) - Reserved for future use.
bit 14 (IMAGE_SCN_MEM_PURGEABLE) - Reserved for future use.
bit 15 (IMAGE_SCN_MEM_SYSHEAP) - Reserved for future use.
bit 16 (IMAGE_SCN_MEM_FARDATA) - The section contains data referenced through the global pointer (GP).
bit 17 (IMAGE_SCN_NO_DEFER_SPEC_EXC) - Not Used.
bit 18 - Not Used.
bit 19 (IMAGE_SCN_LNK_COMDAT) - The section contains COMDAT data.
bit 20 (IMAGE_SCN_LNK_REMOVE) - The section will not become part of the image.
bit 21 (IMAGE_SCN_TYPE_OVER) - Reserved for future use.
bit 22 (IMAGE_SCN_LNK_INFO) - The section contains comments or other information.
bit 23 (IMAGE_SCN_LNK_OTHER) - Reserved for future use.
bit 24 (IMAGE_SCN_CNT_UNINITIALIZED_DATA) - The section contains uninitialized data.
bit 25 (IMAGE_SCN_CNT_INITIALIZED_DATA) - The section contains initialized data.
bit 26 (IMAGE_SCN_CNT_CODE) - The section contains executable code.
bit 27 (IMAGE_SCN_TYPE_COPY) - Reserved for future use.
bit 28 (IMAGE_SCN_TYPE_NO_PAD) - The section should not be padded to the next boundary.
bit 29 (IMAGE_SCN_TYPE_GROUP) - Reserved for future use.
bit 30 (IMAGE_SCN_TYPE_NOLOAD) - Reserved for future use.
bit 31 (IMAGE_SCN_TYPE_DSECT) - Reserved for future use.

උදා: 0x60000020 ලෙස ඇත්නම්,
[The section can be read.],[The section can be executed as code.],[The section contains executable code.] යන Characteristics ඇත.

calc.exe හි IMAGE_SECTION_HEADER පිහිටීම

















































මීලගට ඇත්තේ IMAGE_SECTION යන කොටසයි.

IMAGE_SECTION
මෙහි PE හි ක්‍රියාකාරීත්වයට අදාල Instructions තිබෙන්නේ මෙය තුලය.
මෙය පහත දැක්වෙන ලෙස section හා tables වලට වෙන් කල හැක.

code section
data section
bss section
Copyright (IMAGE_DIRECTORY_ENTRY_COPYRIGHT)
Exported symbols (IMAGE_DIRECTORY_ENTRY_EXPORT)
Imported symbols (IMAGE_DIRECTORY_ENTRY_IMPORT)
Resources (IMAGE_DIRECTORY_ENTRY_RESOURCE)
Relocations (IMAGE_DIRECTORY_ENTRY_BASERELOC)

code section
මෙහි execute කරන code එක තිබේ. මෙමගින් execute කරීම ආරම්භ කිරීමට නම් අවම වශයෙන් පහත කරුනු තෘප්ත විය යුතුය.

IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE හා IMAGE_SCN_MEM_READ යන ඒවා 1 ලෙස තිබිය යුතුය.
AddressOfEntryPoint මෙම code එක තුල යම් ස්ථානයකට සම්බන්ධ කර තිබිය යුතුය.

බොහෝ අවස්ථා වලදී BaseOfCode මගින් මෙහි ආරම්භක ස්ථානය දක්වා ඇත. මෙහි .text, .code වැනි section අඩංගුව තිබේ. මෙය Disassemble කරන ආකාරය පසුව විස්තර කරන්නෙමි.

data section
මෙහි initialized static variables අඩංගුව ඇත.
උදා: static int b = 8;
මෙහි IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ හා IMAGE_SCN_MEM_WRITE යන ඒවා 1 ලෙස සටහන්ව තිබිය යුතුය. final ලෙස හදුන්වා ඇත්නම් IMAGE_SCN_MEM_WRITE යන්න 0 ලෙස තිබේ(.rdata තුලදී). මෙය BaseOfData යන ස්ථානයෙන් ආරම්භ වේ. එහි විශාලත්වය SizeOfInitializedData මගින් දක්වා ඇත. මෙහි .data, .edata වැනි section අඩංගුව තිබේ.

bss section
මෙහි uninitialized static variables අඩංගුව ඇත.

මෙහි IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_MEM_READ හා IMAGE_SCN_MEM_WRITE යන ඒවා 1 ලෙස සටහන්ව තිබිය යුතුය.

PointerToRawData මගින් ආරම්භක ස්ථානය දක්වා ඇත. SizeOfUninitializedData මගින් විශාලත්වය දක්වා ඇත. මෙහි .bss වැනි section අඩංගුව තිබේ.

Copyright
මෙය ඉතා කුඩා කොටසකි. මෙහි Copyrights පිළිබදව හැදින්වීමක් වාක්‍යක් ලෙස ලියා ඇත. IMAGE_SCN_CNT_INITIALIZED_DATA යන්න 1 ලෙස තිබීම අවශ්‍ය වේ. මෙය .descr වැනි section එකක් තුල තිබේ.

Exported symbols
මෙය සාමාන්‍යයෙන් dll තුල දක්නට ලැබේ. මෙහි අඩංගු වනුයේ PE එක මගින් Export කළ හැකි funtions වල Entry point list එකකි. PE එකකට වෙනත් PE එකකින් funtions import කළ හැක. එසේ import කරනුයේ එහි export table හි ඇති funtions වේ.මෙම table එක IMAGE_DIRECTORY_ENTRY_EXPORT ලෙස IMAGE_DATA_DIRECTORY හි හදුන්වා ඇත. funtion එකක් සදහා properties වශයෙන් Name හා Name Ordinal පවතී. මෙම export table එක බොහෝ විට .edata section එක තුල තිබිය හැක. මෙහි initialized data තිබීම හා readable වීම අත්‍යාවශ්‍ය වේ. PE එකකට, funtion එකේ RVA සෙවීමට GetProcAddress() යන method එකෙන් run වීමේදී call කිරීම සිදු වේ. එමනිසා එය discardable නොවිය යුතුය.

මෙය කොටස් 11 කට වෙන් කෙරේ.



typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions;
DWORD AddressOfNames;
DWORD AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;









Characteristics

මෙය භාවිතා නොකරන අතර 0x00000000 අගයෙහි පවතී.

TimeDateStamp
table එක නිර්මානය කළ දිනය හා වේලාව දක්වා ඇත.

MajorVersion හා MinorVersion මගින් version එක දැක්වූවද 0x0000 යන අගයෙහි පවතී.

DLL Name RVA
මෙහි DLL එකේ නම තිබෙන RVA එක ඇත. එම RVA එක ඔස්සේ ගිය විට පහත ආකාරයට දැක ගත හැක. එය 0-terminated ASCII string එකක් ලෙස ඇත. එය කියවීමේදී 0x00 යන අගය හමුවන තෙක් කියවිය යුතුය.



Ordinal Base
මෙමගින් දැක්වෙනුයේ array එකක ආරම්භක index එකට අදාල ordinal number එක වේ. windows kernel මගින් මෙම table එකෙහි export ordinal තබා ගනුයේ array එකක් ආකාරයෙනි. මෙය බොහෝ විට 1 ලෙස තිබේ.

NumberOfFunctions
export කරන funtions ගනන මෙයින් දක්වා ඇත. එකම name ordinal එකෙන් හා එකම name එකෙන් funtions කීපයක් export කළ හැක.

NumberOfNames
export කරන names ගනන මෙයින් දක්වා ඇත.

AddressOfFunctions
මෙහි තිබෙනුයේ funtions වල RVA list එක තිබෙන ස්ථානයේ RVA එකයි. මේ ඔස්සේ ගිය විට අපට ලැබෙනුයේ funtions, NumberOfFunctions ප්‍රමාණයකි. ඒවා array එකකට ඇතුලත් කර ගන්න. එම array එකෙහි තිබෙන RVA හරහා ගිය විට ඊට ආදාල funtion එක ලබා ගත හැක. එවිට එය පහත ආකාරයට දැක්විය හැක.

AddressOfNames
මෙයද ඉහත ආකාරයේම RVA list එකකට ඇති RVA එකකි. එම RVA හරහා ගිය විට ලැබෙනුයේ අදාල funtion එකෙහි name එක වේ.

AddressOfNameOrdinals
මෙයද ඉහත ආකාරයම වේ. මෙය හරහා ගිය විට ලැබෙනුයේ name ordinal එක වේ.
shell32.dll එක otherdll ලෙස හදුන්වා ඇත්නම් හා එහි name ordinal 0x0066 වන Activate_RunDLL නැමති funtion එකට call කිරීමට අවශ්‍ය නම්, otherdll.#66 ලෙස හෝ otherdll.Activate_RunDLL ලෙස call කළ හැක.

Function එකක් ගැන සම්පූර්ණ විස්තරයක් ලබා ගන්නා ආකාරය පහත දක්වා ඇත.



ඉහත දැක්වෙන රූප සටහනෙහි

වර්ණයෙන් ඇති line එක දිගේ ගිය විට name RVA එක හා name එක ලැබේ. එය පහත ආකාරයට වගුවකට ඇතුලත් කර ගන්න.
පසුව

වර්ණයෙන් ඇති line එක දිගේ ගිය විට Ordinal numbers ලැබේ. එයද වගුවට ඇතුලත් කර ගන්න.
එලෙසම

වර්ණයෙන් ඇති line එක දිගේ ගොස් function RVA හා offset එකද ඇතුලත් කරන්න.

NameOrdinal numberFunction RVAFunction offset
Function 1Activate_RunDLL0x00660x00036F8F0x0003638F
Function 2AppCompat_RunDLL0x00670x000F38760x000F2C76















Function nshlwapi.PathGetDriveNumberW0x028A0x000EE2CA0x000ED6CA

මෙම වගුවෙහි Row එකක් ගත් විට එහි අඩංගු වනුයේ export කළ හැකි එක් function එකක් ගැන විස්තර වේ.

මේ සතියට ලිව්ව ඇති. ආයෙත් ලබන සතියේ ලියනවා. මේ දවස්වල Assignment ගොඩ ගැහිලා. blog එක ලියන්න වෙලාවක් සොයා ගන්නත් අමාරුයි. ලබන සතියේ Import table ගැන ලියනවා.

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 ගැනයි.

Wednesday, September 16, 2009

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

ගිය සතියේ මෙතුලින් අප කතා කලේ IMAGE_DOS_HEADER එක ගැනයි. මීලගට අප හට ඇත්තේ IMAGE_NT_HEADERS යන කොටසයි. මෙම කොටස තුල program එකක ‍වැදගත්ම කොටස තිබේ. මෙහි file offset එක සොයා ගැනීම ඉතා පහසුය. IMAGE_DOS_HEADER යටතේ ඇති e_lfanew මගින් මෙහි file offset එක සොයා ගත හැක. ‍මෙම කොටසේ විශාලත්වය 248 bytes වේ. එය PE32 application එකක් සදහා නියත අගයකි.

එය ප්‍රධාන කොටස් 3 කට වෙන් කළ හැක.

1. IMAGE_NT_SIGNATURE
2. IMAGE_FILE_HEADER
3. IMAGE_OPTIONAL_HEADER

IMAGE_NT_SIGNATURE

මෙහි IMAGE_NT_SIGNATURE යනු 32 bits විශාලත්වයක් ඇති Dword එකකි. එහි 0x00004550 (PE) යන අගය පවතී.

IMAGE_FILE_HEADER

මීලගට තිබෙන්නේ IMAGE_FILE_HEADER යන කොටසයි. මෙය තවත් කොටස් 7 කට වෙන් කල හැක.

typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

*(මෙය microsoft ආයතනයෙන් සකසන ලද winnt.h නැමැති source file එකෙහි හදුන්වා ඇති ආකාරය වේ.)

මෙහි Machine මගින් දක්වනුයේ අදාල program එක සුදුසු වන CPU platform එකයි. මේ සදහා පහත අගයන් තිබිය හැක.


0x01D3 - Matsushita AM33
0x8664 - x64
0x01C0 - ARM little endian
0x0EBC - EFI byte code
0x014C - Intel 386 or later processors and compatible processors
0x014D - Intel 486 or later processors and compatible processors
0x014E - Intel pentium or later processors and compatible processors
0x0020 - Intel Itanium processor family
0x9401 - Mitsubishi M32R little endian
0x0200 - Intel 64
0x0266 - MIPS16
0x0366 - MIPS with FPU
0x0466 - MIPS16 with FPU
0x0160 - R3000 (MIPS) processor, big endian
0x0162 - R3000 (MIPS) processor, little endian
0x0166 - R4000 (MIPS) processor, little endian
0x0168 - R10000 (MIPS) processor, little endian
0x0169 - MIPS little-endian WCE v2
0x0184 - DEC Alpha AXP processor
0x0284 - ALPHA64 or AXP64
0x01F0 - IBM Power PC, little endian
0x01F1 - Power PC with floating point support
0x01A2 - Hitachi SH3
0x01A3 - Hitachi SH3 DSP
0x01a4 - SH3E little-endian
0x01A6 - Hitachi SH4
0x01A8 - Hitachi SH5
0x01C2 - Thumb
0x0000 - Any machine type

NumberOfSections - මගින් දැක්වෙන්නේ අදාල program එක තුල ඇති sections ගනනයි. අප sections ගනන වෙනස් කරන්නේ නම් මෙහි ඇති අගයද වෙනස් කල යුතුය. sections පිළිබදව පසුව ලිවීමට බළාපොරොත්තු වෙනවා.

TimeDateStamp - මගින් දැක්වෙන්නේ program එ
ක නිර්මානය කල දිනය හා වේලාවයි. එහි සදහන්ව ඇත්තේ 1970 ජනවාරි මස 1 දින පෙ.ව. 12.00.00 සි‍ට ගත වූ තත්පර ගනනෙහි hex value එකයි.

උදා - 0x3B7D8410 ලෙස ඇත්නම්
998081552 seconds = 31:07:15 20:52:32

PointerToSymbolTable හා NumberOfSymbols සෑම අවස්ථාවකම 0x00000000 අගයෙහි පවතී. එය debug කිරීම් සදහා යොදා ගනී.

SizeOfOptionalHeader - මෙමගින් IMAGE_OPTIONAL_HEADER හි විශාලත්වය දක්වා ඇත. එය PE file එකෙහි නිරවද්‍යතාව පරීක්ෂා කිරීමට යොදා ගත හැක.




Characteristics මගින් අදාල program එක dll හෝ exe එකක්ද යන්න
බලා ගත හැක.
Characteristics ලබා ගැනීමට නම් පළමුව එය bit වශයෙන් පහත ආකාරයට වෙන් කර ගත යුතුය.



පහත දැක්වෙන bits, 1 ලෙස සටහන්ව ඇත්නම් ඒවාට පහත Characteristics තිබේ.

bit 0 (IMAGE_FILE_BYTES_REVERSED_HI) - Big endian: the MSB precedes the LSB in memory.
bit 1 (IMAGE_FILE_UP_SYSTEM_ONLY) - The file should be run only on a uniprocessor machine.
bit 2 (IMAGE_FILE_DLL) - The image file is a dynamic-link library (DLL).
bit 3 (IMAGE_FILE_SYSTEM) - The image file is a system file, not a user program. (ex: driver)
bit 4 (IMAGE_FILE_NET_RUN_FROM_SWAP) - If the image is on network media, fully load it and copy it to the swap file.
bit 5 (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP) - If the image is on removable media, fully load it and copy it to the swap file.
bit 6 (IMAGE_FILE_DEBUG_STRIPPED) - Debugging information is removed from the image file.
bit 7 (IMAGE_FILE_32BIT_MACHINE) - Machine is based on a 32-bit-word architecture.
bit 8 (IMAGE_FILE_BYTES_REVERSED_LO) - Little endian: the least significant bit (LSB) precedes the most significant bit (MSB) in memory.
bit 9 - This flag is reserved for future use.
bit 10 (IMAGE_FILE_LARGE_ADDRESS_AWARE) - Application can handle > 2 GB addresses.
bit 11 (IMAGE_FILE_AGGRESIVE_WS_TRIM) - Obsolete. Aggressively trim working set.
bit 12 (IMAGE_FILE_LOCAL_SYMS_STRIPPED) - COFF symbol table entries for local symbols have been removed.
bit 13 (IMAGE_FILE_LINE_NUMS_STRIPPED) - COFF line numbers have been removed.
bit 14 (IMAGE_FILE_EXECUTABLE_IMAGE) - Image only.
bit 15 (IMAGE_FILE_RELOCS_STRIPPED) - Image only, Windows CE, and Windows NT® and later.

උදා:- 0x010F ලෙස ඇත්නම් එය 2 පාදයට ගත් විට 0000000100001111 ලෙස වේ.
එවිට මෙය - [Machine is based on a 32-bit-word architecture.],[COFF symbol table entries for local symbols have been removed.],[COFF line numbers have been removed.],[Image only.],[Image only, Windows CE, and Windows NT® and later.]

මෙහි දක්වා තිබෙන්නේ IMAGE_NT_HEADERS හි උප කොටස් වේ.


අදට මෙතනින් ලියන එක නවත්වනවා ලබන සතියේ IMAGE_OPTIONAL_HEADER ගැන විස්තර කරන්න බලාපොරොත්තු වෙනවා.

Monday, September 7, 2009

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

මේ දවස්වල නිකන්ම ඉන්න හින්ද මොනව හරි ලියන්න හිතුන. ඒ හින්ද අද ඉදල දන්න සිංහලෙන් blog එක ලියනවා. මේ ලියන blog එක කොටස් කීපයකට ලියන්න වෙනවා. අද පළවෙනි කොටස ලියනවා. මේ ලියන දේවල් සේරම මම සොයා ගත්තේ අවුරැදු 1 1/2 ක් විතර Internet එක පාවිච්චි කරල. සමහර විට මේ ලිපි වල වැරදි තියෙන්න පුළුවන්, පුලුවන්නම් ඒවා නිවරැදි කරන්න.

PE Format


මම මේ ලිපිය ලියන්නේ වින්‍‍ඩෝස් වල තියෙන PE Format එක ගැනයි. මේ ලිපිය ලියද්දි භාවිතා කරන භාෂා විලාසය පිළිබදව සමාවන්න, මේක පැහැදිලිව ලියන්න නම් මේ විදියටම ලියන්න වෙනවා. PE කියන්නෙ Porta
ble Executable යන්නයි. මේ PE Files .exe (Programs) , .dll (Dynamic Link Library), .ocx (ActiveX Control) හෝ වෙනත් විදියකට තියෙන්න පුලුවන්. මේ වර්ගයේ files භාවිතා වෙන්නෙ Windows NT, Windows 95 හා Win32 files වලයි. Windows NT Drivers තියෙන්නෙත් මේ format එකෙන්ම තමයි. මේ ගැන අවබෝධයක් ලබා ගත්තොත් අපට පුළුවන් Executable එකක Source එක ලබා ගන්නත්, අර්ධ වශයෙන් වෙනස් කරන්නත් පුළුවන්. PE වල Source Code එක තියෙන්නෙ Machine Instruction විධියටමයි. ඒ නිසා වෙනස් කරද්දි ගැටළු මතු වෙනවා. නමුත් GUI සම්බන්ධ කොටස් වල Source එක පහසුවෙන් ‍තේරැම් ගන්නත්, වෙනස් කරන්නත් පුළුවන්. මේ ගැන පැහැදිලි දැනුමක් තියෙනවනම් Source එක වෙනස් කරන්න පුළුවන් Software එකක් වුනත් හදන්න පුළුවන්. පහතින් දැක්වෙනුයේ මාවිසින් නිර්මානය කරන ලද එවැනි Source එක වෙනස් කර re-compile කල හැකි මෘදුකාංගයකි.





* පින්තූර විශාලනය කිරීමට එය
මත click කරන්න.
* Software එකක Source එක වෙනස් කිරීමට ප්‍රථම එහි Copyrights පිළිබදව සැලකිලිමත් වන්න.


මෙහි සියලුම උදාහරණ හා පහදාදීම් සදහා c:\windows\system32\calc.exe හා c:\windows\system32\shell32.dll යොදා ගෙන ඇත.


Program එකක් Execute වීම.


මෙහි c:\windows\system32\calc.exe හි MS-DOS හිදී Instructions කීපයක් දක්වා ඇත.
නිල් වර්ණයෙන් දක්වා ඇත්තේ ඒවාය.




මෙහිදී calc.exe, MS-DOS තුලදී run කල නොහැකි නිසා calc.exe ට අයත් Instrucions 7 ක් තුලදී terminate වීම සිදුවේ. (නමුත් calc.exe ක්‍රියාත්මක කිරීමට windows kernel මගින් විශාල instructions ප්‍රමාණයක් යොදවයි.)


- මෙහි AX හි දැක්වෙනුයේ EAX registry එකෙහි AX කොටසයි. අවසන් instruction එකේදී AX=0x4C01 යනුවෙන් ඇත. මෙහි 4C යනු Exit යන්නත්, 01 යනු return value එකත් වේ.

- මෙහි
BX, CX යනුවෙන් දැක්වෙන්නේ EBX, ECX registry වේ. මෙමගින් Execute වන Program එකෙහි විශාලත්වය පෙන්වයි.
[(0001 BE00)hex] bytes = 114176 bytes මෙය calc.exe හි විශාලත්වයට සමාන නොවේ. (මේ සදහා
IMAGE_DOS_HEADER ---> 64 bytes

Windows® header ---> 448 bytes

එක් වු විට calc.exe හි විශාලත්වයට සමාන වේ.)


- මෙහි DX මගින් දැක්වෙනුයේ Data register එකට ගත යුතු data හි starting offset එකයි. DX=0x000E ලෙස ඇත. මෙමගින් කියවෙනුයේ 0x000E ස්ථානයේ සිට කියවිය යුතු බවය. (මෙහිදී 24 hex value එක හමුවෙන ‍තෙක් read කිරීම සිදු කරයි. එමගින් This program cannot be run in DOS mode. යන්න data register එකට යයි.)

මෙහි

SP - stack pointer

DS - data segment
CS - code segment

IP - instruction pointer

(Assembly language ගැන පසුව හොදින් විස්තර කිරීමට බලාපොරොත්තු වෙනවා.)

ඉහත program එක execute වීමේදී ආරම්භයේ සිට අවසානය තෙක් execute නොවේ. එය යම් කිසි ක්‍රමයකට සිදු වේ. මෙමගින් පැහැදිලි වනුයේ මේ සදහා විශේෂිත file format එකක් ඇති බවයි.

මේ file format එක නිර්මානය කලේ Microsoft ආයතනයෙන්, මේක සම්මත කලේ TIS (Tool Interface Standard) Committee (Microsoft, Intel, Bordland, Watcom, IBM and Others) මගින් 1993 දීය. මේ format එක සමහර Unix හා VMS ව
ලදීද භාවිතා වෙනවා. PE file එකක් සරලව පහත ආකාරයට දක්වන්න පුළුවන්

MS-DOS Stub
IMAGE_NT_HEADERS
Image Section headers
Section 1
Section 2
..........
Section n

PE File එකක් run කිරීමේදී පළමුවම සිදුවනුයේ MS-DOS Stub කියවා එහි validity එක පරීක්ෂා කිරීමයි. MS-DOS Stub එක යනු MS-DOS වැඩසටහකි. එය 16 bit-windows වැඩසටහනකි. පසුව එය valid නම් IMAGE_NT_HEADERS වෙත ගොස් Execute කිරීම ආරම්භ කරයි. IMAGE_NT_HEADERS සිට ඉදිරියට තිබෙන්නේ 32 bit-windows වැඩසටහනකි.

PE file එකක් logical disk එකක් යැයි සිතන්න. එවිට IMAGE_NT_HEADERS යනු logical disk එකෙහි Boot Sector එක ලෙස ගත හැක. එවිට Sections, logical disk හි ඇති files ලෙස ගත හැක. Files සදහා read-only, hidden, system, archive ලෙස attributes තිබිය හැක. මෙලෙස Sections සදහාද attributes තිබිය හැක. එම attributes තබා ගනුයේ Image Section headers හිය. එය array එකක් ආකාරයෙන් පවතී. එහි එක් එක් Sections සදහා වෙන වෙනම attributes තබා ගනී. Sections n ප්‍රමාණයක් තිබේ නම්, Image Section headers හි කොටස් n ප්‍රමාණයක attributes තබා ගනී. මෙම Sections .code, .data, .idata, .edata හා තවත් ආකාර වලින් තිබිය හැක. මෙහි උඩින්ම තියෙන්නෙ MS-DOS Stub එකයි. මෙම‍ගින් අපට පුලුවන් අදාල Executable එක valid Executable එකක්ද කියල දැනගන්න. මේ DOS Stub තවත් කොටස් 2 ක‍ට බෙදන්න පුළුවන්.

1. IMAGE_DOS_HEADER

2. MS-DOS_STUB_PROGRAM


IMAGE_DOS_HEADER

IMAGE_DOS_HEADER එක තවත් කොටස් කීපයකට වෙන් කරන්න පුළුවන්

























i.e_magicMagic number
e_magic සදහා තිබිය හැකි අගයන්
IMAGE_DOS_SIGNATURE - 0x5A4D, MZ
IMAGE_OS2_SIGNATURE - 0x454E, NE
IMAGE_OS2_SIGNATURE_LE - 0x454C, LE
ii.e_cblpBytes on last page of file
iii.e_cpPages in file
iv.e_crlcNumber of relocation entries stored after the header.
v.e_cparhdrSize of header in paragraphs
vi.e_minallocMinimum extra paragraphs needed
vii.e_maxallocMaximum extra paragraphs needed
viii.e_ssRelative value of the stack segment.
ix.e_spInitial value of the SP register.
x.e_csumWord checksum.
xi.e_ipInitial value of the IP register.
xii.e_csInitial value of the CS register.(relative to the segment the program was loaded at.)
xiii.e_lfarlcFile address of relocation table
xiv.e_ovnoOverlay number
xv.e_res(0)Reserved words
xvi.e_res(1)Reserved words
xvii.e_res(2)Reserved words
xviii.e_res(3)Reserved words
xix.e_oemidOEM identifier (for e_oeminfo)
xx.e_oeminfoOEM information
xxi.e_res2(0)Reserved words
xxii.e_res2(1)Reserved words
xxiii.e_res2(2)Reserved words
xiv.e_res2(3)Reserved words
xv.e_res2(4)Reserved words
xvi.e_res2(5)Reserved words
xvii.e_res2(6)Reserved words
xviii.e_res2(7)Reserved words
xxix.e_res2(8)Reserved words
xxx.e_res2(9)Reserved words
xxxi.e_lfanewFile address of new exe header


DQ - Qword    DD - Dword    DW - Word    DB - Byte

MS-DOS_STUB_PROGRAM හිදී Executable එක invalid නම් "This program cannot be run in DOS mode." හෝ වෙනත් Text එකක් දර්ශනය කරමින් ඉවත් වේ. මෙම දර්ශනය වන Text එක assembler/compiler එක මගින් යොදන Text එකකි. Executable එක valid නම් IMAGE_NT_HEADERS සිට ඉදිරියට ඇති වැඩසටහන ආරම්භ කරයි. ඉහත e_lfarlc මගින් MS-DOS_STUB_PROGRAM හි ආරම්භක ස්ථානයත් e_lfnew මගින් IMAGE_NT_HEADERS හි ආරම්භක ස්ථානයත් දක්වා ඇත. එමගින් අපට MS-DOS_STUB_PROGRAM හි විශාලත්වය ලබා ගත හැක.
මෙහි DOS_STUB_PROGRAM හි ආරම්භක ස්ථානය දක්වා ඇත්තේ 16 bit word එකකිනි. IMAGE_NT_HEADERS හි ආරම්භක ස්ථානය දක්වා ඇත්තේ 32 bit word එකකිනි. එමගින් පැහැදිලි වනුයේ DOS Stub එක 16 bit-windows වැඩසටහක් බවත් IMAGE_NT_HEADERS සිට ඉදිරියට 32 bit-windows වැඩසටහනක් ඇති බවත්ය.

MS-DOS Stub හි පිහිටීම

සැ.යු. :- Data කියවීමේදී Right-to-Left Order එක‍ට කියවිය යුතුය.

උදා:- F0 00 00 00 ලෙස ඇත්නම් 00 00 00 F0 වන ආකාරයට කියවිය යුතුය.

12 34 56 78 ලෙස ඇත්නම් 78 56 34 12 වන ආකාරය‍ට කියවිය යුතුය.

#include "pshpack1.h"

#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ
#define IMAGE_OS2_SIGNATURE 0x4E45 // NE
#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE
#define IMAGE_NT_SIGNATURE 0x50450000 // PE00

typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

(මෙය microsoft ආයතනයෙන් සකසන ලද winnt.h නැමැති source file එකෙහි හදුන්වා ඇති ආකාරය වේ.)