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

No comments:

Post a Comment