Monday, October 26, 2009

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

ගිය සතියෙ ලිව්වෙ Import table එක ගැනයි. මේ සතියෙ ලියන්නෙ Resource table එක ගැනයි. මේක ප්‍රමානයෙන් විශාල table එකක්. ඒක හින්ද කොටස් කීපයකට ලියන්න වෙනවා.





Resources (IMAGE_RESOURCE_DIRECTORY)


මෙහි ඇත්තේ dialog boxes, menus, icons වැනි resources වේ. මෙම කොටස පහසුවෙන් වෙනස් කිරීමක් කල හැක. මෙහි GUI සම්බන්ධ කොටස් ඇත. මෙය .rsrc යන section එක තුල තිබේ. මෙම section එක ආරම්භක ස්ථානය සෙවීමට වෙනත් sections ආරම්භ වන ස්ථාන සොයන ආකාරයට කල නොහැක. මෙය ආරම්භ වනුයේ IMAGE_SECTION_HEADER හි .rsrc යටතේ ඇති PointerToRowData හි ඇති offset එකෙන් වේ. මෙම section එකෙහි IMAGE_SCN_CNT_INITIALIZED_DATA හා IMAGE_SCN_MEM_READ යන්න 1 ලෙස සටහන්ව තිබිය යුතුය.

7-Zip File Manager මගින් Excutable එකක Sections බලා ගත හැක. එක් එක් Sections හි Properties ලබා ගැනීමෙන් ඒවායේ අමතර විස්තරද ලබා ගත හැක.



මෙහි resources තිබෙන ආකාරය tree එකක් ආකාරයෙන් දැක්විය හැක.



එහි root එක RT_CURSOR, RT_BITMAP, RT_ICON වැනි කොටස් වලට වෙන් කල හැක. එක් කොටසක resources කීපයක් තිබිය හැක. පසුව එම resources විශේෂිත අංකයකින් හෝ නමකින් හදුන්වයි. එම resouces, languages එකකින් හෝ කීපයකින් තිබිය හැක. language කීපයකින් තිබෙන resources, win 95 තුලදී ක්‍රියාත්මක නොවේ.

resources පහත ආකාරයෙන් අංක කර ඇත.


0x00000001RT_CURSOR
0x00000002RT_BITMAP
0x00000003RT_ICON
0x00000004RT_MENU
0x00000005RT_DIALOG
0x00000006RT_STRING
0x00000007RT_FONTDIR
0x00000008RT_FONT
0x00000009RT_ACCELERATOR
0x0000000ART_RCDATA
0x0000000BRT_MESSAGETABLE
0x0000000CRT_CURSORGROUP
0x0000000ERT_ICONGROUP
0x00000010RT_VERSIONINFO


වෙනත් අංකයක් ඇත්නම් එය අංකයේ නමින්ම හදුන්වයි. ඒවා custom resources වේ.
පහත රූප සටහනෙහි දක්වා ඇත්තේ shell32.dll හි resources වේ. මෙහි AVI, REGINST, TYPELIB, UIFILE, 23, 24 ලෙස ඇත්තේ custom resources වේ.



මෙහි 1033 ලෙස ඇත්තේ languages ID එක වේ.
1033 = 0x00000409 = en-us, English (United States)

languages පහත ආකාරයෙන් අංක කර ඇත.

0x00000436afAfrikaans
0x0000041CsqAlbanian
0x00000001arArabic
0x00000401ar-saArabic (Saudi Arabia)
0x00000801ar-iqArabic (Iraq)
0x00000C01ar-egArabic (Egypt)
0x00001001ar-lyArabic (Libya)
0x00001401ar-dzArabic (Algeria)
0x00001801ar-maArabic (Morocco)
0x00001C01ar-tnArabic (Tunisia)
0x00002001ar-omArabic (Oman)
0x00002401ar-yeArabic (Yemen)
0x00002801ar-syArabic (Syria)
0x00002C01ar-joArabic (Jordan)
0x00003001ar-lbArabic (Lebanon)
0x00003401ar-kwArabic (Kuwait)
0x00003801ar-aeArabic (U.A.E.)
0x00003C01ar-bhArabic (Bahrain)
0x00004001ar-qaArabic (Qatar)
0x0000042DeuBasque
0x00000402bgBulgarian
0x00000423beBelarusian
0x00000403caCatalan
0x00000004zhChinese
0x00000404zh-twChinese (Taiwan)
0x00000804zh-cnChinese (China)
0x00000C04zh-hkChinese (Hong Kong SAR)
0x00001004zh-sgChinese (Singapore)
0x0000041AhrCroatian
0x00000405csCzech
0x00000406daDanish
0x00000413nlDutch (Netherlands)
0x00000813nl-beDutch (Belgium)
0x00000009enEnglish
0x00000409en-usEnglish (United States)
0x00000809en-gbEnglish (United Kingdom)
0x00000C09en-auEnglish (Australia)
0x00001009en-caEnglish (Canada)
0x00001409en-nzEnglish (New Zealand)
0x00001809en-ieEnglish (Ireland)
0x00001C09en-zaEnglish (South Africa)
0x00002009en-jmEnglish (Jamaica)
0x00002809en-bzEnglish (Belize)
0x00002C09en-ttEnglish (Trinidad)
0x00000425etEstonian
0x00000438foFaeroese
0x00000429faFarsi
0x0000040BfiFinnish
0x0000040CfrFrench (France)
0x0000080Cfr-beFrench (Belgium)
0x00000C0Cfr-caFrench (Canada)
0x0000100Cfr-chFrench (Switzerland)
0x0000140Cfr-luFrench (Luxembourg)
0x0000043CgdGaelic
0x00000407deGerman (Germany)
0x00000807de-chGerman (Switzerland)
0x00000C07de-atGerman (Austria)
0x00001007de-luGerman (Luxembourg)
0x00001407de-liGerman (Liechtenstein)
0x00000408elGreek
0x0000040DheHebrew
0x00000439hiHindi
0x0000040EhuHungarian
0x0000040FisIcelandic
0x00000421inIndonesian
0x00000410itItalian (Italy)
0x00000810it-chItalian (Switzerland)
0x00000411jaJapanese
0x00000412koKorean
0x00000426lvLatvian
0x00000427ltLithuanian
0x0000042FmkFYRO Macedonian
0x0000043EmsMalay (Malaysia)
0x0000043AmtMaltese
0x00000414noNorwegian (Bokmal)
0x00000814noNorwegian (Nynorsk)
0x00000415plPolish
0x00000416pt-brPortuguese (Brazil)
0x00000816ptPortuguese (Portugal)
0x00000417rmRhaeto-Romanic
0x00000418roRomanian
0x00000818ro-moRomanian (Moldova)
0x00000419ruRussian
0x00000819ru-moRussian (Moldova)
0x00000C1AsrSerbian (Cyrillic)
0x0000081AsrSerbian (Latin)
0x0000041BskSlovak
0x00000424slSlovenian
0x0000042EsbSorbian
0x0000040AesSpanish (Traditional Sort)
0x0000080Aes-mxSpanish (Mexico)
0x00000C0AesSpanish (International Sort)
0x0000100Aes-gtSpanish (Guatemala)
0x0000140Aes-crSpanish (Costa Rica)
0x0000180Aes-paSpanish (Panama)
0x00001C0Aes-doSpanish (Dominican Republic)
0x0000200Aes-veSpanish (Venezuela)
0x0000240Aes-coSpanish (Colombia)
0x0000280Aes-peSpanish (Peru)
0x00002C0Aes-arSpanish (Argentina)
0x0000300Aes-ecSpanish (Ecuador)
0x0000340Aes-clSpanish (Chile)
0x0000380Aes-uySpanish (Uruguay)
0x00003C0Aes-pySpanish (Paraguay)
0x0000400Aes-boSpanish (Bolivia)
0x0000440Aes-svSpanish (El Salvador)
0x0000480Aes-hnSpanish (Honduras)
0x00004C0Aes-niSpanish (Nicaragua)
0x0000500Aes-prSpanish (Puerto Rico)
0x00000430sxSutu
0x0000041DsvSwedish
0x0000081Dsv-fiSwedish (Finland)
0x0000041EthThai
0x00000431tsTsonga
0x00000432tnTswana
0x0000041FtrTurkish
0x00000422ukUkrainian
0x00000420urUrdu
0x0000042AviVietnamese
0x00000434xhXhosa
0x0000043DjiYiddish
0x00000435zuZulu

වෙනත් languages ID ද තිබිය හැක. පරිගනකයේ ඇති languages බලා ගැනීමට පහත command එක command prompt එකෙහි type කරන්න.

reg query hklm\SOFTWARE\Classes\MIME\Database\Rfc1766 /s >> c:\langID.txt

එවිට c:\ හි langID.txt නමින් file එකක් සෑදේ. එහි language ID සමග language name එක තිබේ.

IMAGE_RESOURCE_DIRECTORY format

මෙය ප්‍රධාන කොටස් 5 කට වෙන් කල හැක.

Resource Directory Tables
Resource Directory Entries
Resource Directory Strings
Resource Data Description
Resource Data

Resource Directory Tables

මෙහි විශාලත්වය 16 bytes වේ. මෙය කොටස් 6 කට වෙන් කෙරේ.



typedef struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
WORD NumberOfNamedEntries;
WORD NumberOfIdEntries;
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;


Characteristics
භාවිතා නොවේ. 0x00000000 යන අගයෙහි පවතී.

TimeDateStamp
resource table එක නිර්මාණය කල දිනය හා වේලාව දක්වා ඇත. මෙහි 0x00000000 යන අගයද තිබිය හැක.

MajorVersion හා MinorVersion
resource table හි version එක ඇත.

NumberOfNamedEntries
string මගින් හදුන්වා ඇති resource ගනන දක්වා ඇත.

NumberOfIdEntries‍
integer මගින් හදුන්වා ඇති resource ගනන දක්වා ඇත.

මෙහි NumberOfNamedEntries+NumberOfIdEntries‍ මගින් මෙහි ඇති මුළු resources ගනන දක්වා ඇත.

Resource Directory Entries

මෙය array එකක් ලෙස ගත හැක. එහි මුළු resources ගනනට සමාන කොටස් ප්‍රමාණයක් තිබේ. එක් කොටසක විශාලත්වය 8 bytes වේ. එහි එක් කොටසක් පහත ආකාරයට වෙන් කල හැක.





typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
union {
struct {
DWORD NameOffset:31;
DWORD NameIsString:1;
};
DWORD Name;
WORD Id;
};
union {
DWORD OffsetToData;
struct {
DWORD OffsetToDirectory:31;
DWORD DataIsDirectory:1;
};
};
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;


දෙවන 32 bits ප්‍රමාණය ගත් විට එහි පළමු bit එක 1 ලෙස ඇත්නම් ඉතිරි 31 bits ප්‍රමාණයෙන් දැක්වෙන්නේ data ඇති sub directory එකකට offset එකකි. එවිට පළමු 32 bits ප්‍රමාණයේ, එහි පළමු bit එක 1 ලෙස ඇත්නම් අනෙක් 31 bits මගින් දැක්වෙන්නේ resource type එකට අදාල Name එකෙහි offset එක වේ. පළමු bit එක 0 ලෙස ඇත්නම් අනෙක් 31 bits මගින් දැක්වෙන්නේ resource ID එක වේ. resource ID ඉහතින් දක්වා ඇත.





සැ.යු. මෙහිදී file offset එක ගනනය කිරීමට section එකෙහි ආරම්භක offset එකට අදාල අගය එකතු කල යුතුය.

උදා:- shell32.dll හි .rsrc section එකෙහි ආරම්භක offset එක 0x00205400 වේ. එහි පළමු resource type එකට අදාල මුල් 32 bits 0x8001A3F0 ලෙස ඇත. එවිට එහි resource type එකට අදාල Name එකෙහි offset එක

0x00205400 + 0x0001A3F0 = 0x0021F7F0

මෙම names තිබෙන්නේ Resource Directory Strings යන කොටසෙහි වේ.

මෙහි sub directory එකට ඇති offset එක හරහා ගිය වි‍ට, එය නැවතත් Resource Directory Tables හි ආකාරයේ structure එකකට පැමිණේ. මෙම sub directories වල Characteristics,TimeDateStamp, MajorVersion, MinorVersion යන ඒවා 0 යන අගයෙහි පවතී.

එසේම

දෙවන 32 bits ප්‍රමාණයේ එහි පළමු bit එක 0 ලෙස ඇත්නම් ඉතිරි ප්‍රමාණයෙන් දැක්වෙන්නේ data සදහා offset එකකට ඇති offset එකකි. එය පිහිටා ඇත්තේ Resource Data Description තුලය.



තවද මෙවිට පළමු 32 bits ප්‍රමාණයෙන් දැක්වෙන්නේ resource එකට අදාල language ID එක වේ. language IDs ඉහත දක්වා ඇත.

Resource Directory Strings

මෙහි ඇත්තේ Unicode strings වේ. එය මෙලෙස හැදින්විය හැක.

typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
WORD Length;
WCHAR NameString[ 1 ];
} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;




මෙහි string එක කියවීමේදී length එකට සමාන අකුරු ප්‍රමාණයක් කියවිය යුතුය.

Resource Data Description

මෙහි data තිබෙන ස්ථාන සදහා offset එක, එහි විශාලත්වය වැනි දත්ත තිබේ. එය පහත ආකාරයට දැක්විය හැක.

typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
DWORD OffsetToData;
DWORD Size;
DWORD CodePage;
DWORD Reserved;
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;




OffsetToData
මෙමගින් data ඇති ස්ථානයේ offset එක ඇත.
මෙමගින් file offset එක ලබා ගැනීමට පහත ආකාරයට කල යුතුය.

file offset = data_offset - [.rsrc].VirtualAddress + [.rsrc].PointerToRowData

උදා:- shell32.dll හි AVI sub directory හි resource ID එක 150 වන resource එකෙහි data_offset එක 0x00011870 වේ. .rsrc හි VirtualAddress එක 0x00219000 වේ. .rsrc හි PointerToRowData එක 0x00205400 වේ. එවිට එහි

‍file offset = 0x003A6460 - 0x00219000 + 0x00205400
= 0x00392860

Size
මෙහි කියවිය යුතු data හි විශාලත්වය දක්වා ඇත.

CodePage
decode කිරීම් සදහා යොදා ගනී. බොහෝ අවස්ථාවල 0x00000000 යන අගයෙහි පවතී.

Reserved
0x00000000 යන අගයෙහි පවතී.

අදට ලිව්ව ඇති. මීලග කොටසින් Resource directory එක ගැන වැඩි දුරටත් ලියනවා.

Tuesday, October 13, 2009

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

මුලින්ම පසුගිය කලාපයේ සිදු වූ අතපසු වීමක් නිවැරැදි කල යුතුයි. ගිය වර කලාපයේ DLL Name RVA සම්බන්ධ පින්තූර සටහන යෙදීමේදී අතපසු වීමක් සිදු වී ඇත. එය නිවැරැදි කිරීමක් සිදු කර ඇත.
මේ සතියේ ලිවීමට ඇත්තේ Import table එක ගැනයි.




Imported symbols

මෙම කොටස සෑම PE එකකම වාගේ දක්නට ඇත. මෙහි දැක්වෙනුයේ PE එක ක්‍රියාත්මක වීමට අවශ්‍ය නමුත් වෙනත් object files වලින් ලබා ගත යුතු functions වල list එකකි. වෙනත් අයුරකින් කිවහොත් PE එකට අවශ්‍ය dependencies වේ. මෙම functions, object file එකේ export table හි අඩංගු ඒවා වේ. මෙම table එක IMAGE_DIRECTORY_ENTRY_IMPORT ලෙස IMAGE_DATA_DIRECTORY හි හදුන්වා ඇත. මේ හා සම්බන්ධ වන data directory කීපයක් ඇත.

IMAGE_DIRECTORY_ENTRY_EXPORT
IMAGE_DIRECTORY_ENTRY_RESOURCE
IMAGE_DIRECTORY_ENTRY_BASERELOC
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
IMAGE_DIRECTORY_ENTRY_IAT

* මෙහි initialized data තිබීම හා readable වීම අත්‍යාවශ්‍ය වේ.

මෙයද array එකක් ආකාරයෙන් පවතී. මෙම array එකෙහි විශාලත්වය import කරන dll ගනනට සමාන වේ. මෙම array එක IMAGE_IMPORT_DESCRIPTOR හි array එකකි. එහි එක් කොටසක් ගත් විට, එය කොටස් 5 කට වෙන් කළ හැක. array එකෙහි අවසාන කොටස null වේ.



typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
};
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;

OriginalFirstThunk
මෙහි සදහන් වනුයේ function names (IMAGE_IMPORT_BY_NAME) වලට තිබෙන RVA අඩංගු array එකකට තිබෙන RVA එකකි. function names පහත ආකාරයට ලබා ගත හැක.
මෙහි මුලින්ම තිබෙන්නේ Ordinal number (16 bits) එක වේ. පසුව 0x00 හමුවන තෙක් කියවීමෙන් function name එක ලබා ගත හැක.



typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;

TimeDateStamp
මෙය භාවිතා නොවේ. මෙය 0x00000000 හෝ 0x‍FFFFFFFF යන අගයන්හි පවතී.

ForwarderChain
මෙයද සාමාන්‍යයෙන් 0x‍FFFFFFFF යන අගයෙහි පවතී. නමුත් භාවිතා කරන අවස්ථාද තිබේ.

DLL Name RVA
DLL එකෙහි නම ඇති ස්ථානයේ RVA එක වේ.

Ordinal numbers, function names හා DLL Name පිහිටා ඇති ආකාරය


මෙහි

වර්ණයෙන් වට කර ඇති ප්‍රදේශයේ එක් Object එකක විස්තර ඇත.


වර්ණයෙන් වට කර ඇති ස්ථාන වල Ordinal number එකද,


වර්ණයෙන් වට කර ඇති ස්ථානයේ function name එකද ඇත. එසේ එක් Object file එකක් සදහා functions කීපයක් තිබිය හැක.


වර්ණයෙන් Object file name එක ඇත.

මෙහි Ordinal numbers, function names හෝ DLL Name එකක alignment එක 2 වේ. එම නිසා ඒවා ආරම්භ වනුයේ 2 හි ගුණාකාරයක් වන ‍file offset වලිනි. එම නිසා

වර්ණයෙන් ඇති කොටස් අත් හැර දමයි.

FirstThunk (IMAGE_THUNK_DATA)
මෙහි සදහන්ව ඇත්තේ import කළ යුතු function එකෙහි VA එක ඇති ස්ථානයේ RVA එක වේ. මෙය RAM එකට load වූවාට පසු සත්‍ය VA එක මෙයට replace වීමක් සිදු වේ. jmp [VA] මගින් dll එක හා සම්බන්ධ වේ. මෙම VA ඇත්තේ IMAGE_DIRECTORY_ENTRY_IAT යන table එකෙහි වේ.


Import කල යුතු function එකක විස්තර ලබා ගන්නා ආකාරය පහත දක්වා ඇත.


ඉහත රූප සටහනෙහි

වර්ණයෙන් ඇති line එක දිගේ ගිය විට Ordinal number හා function name එක ලබා ගත හැක.

වර්ණයෙන් ඇති line එක දිගේ ගිය විට Object file name එක ලබා ගත හැක.

වර්ණයෙන් ඇති line එක දිගේ ගිය විට import කළ යුතු function එකෙහි VA එක ලබා ගත හැක.
ලබා ගන්නා දත්ත පහත ආකාරයට දැක්විය හැක.



මෙම වගුවෙහි දැක්වෙනුයේ එක් එක් Object files වලින් import කල හැකි functions වල විස්තර වේ.

shell32.dll හි import table හි පිහිටීම පහත දක්වා ඇත.



‍ගිය සතියෙ ලියපු Export table සටහනේ, shell32.dll දී Export table හි පිහිටීමද මෙහි දක්වා ඇත.



Export table බලා ගත හැකි Application එකක් හා එහි Source code එක මෙතනින් Download කර ගත හැක.

Import table බලා ගත හැකි Application එකක් හා එහි Source code එක මෙතනින් Download කර ගත හැක.

අදට ලිව්වා ඇති. ලබන සතියේ ආයෙත් ලියනවා. ලබන සතියෙ ලියන්න තියෙන්නෙ Resource table එක ගැනයි.