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 එක ගැන වැඩි දුරටත් ලියනවා.

1 comment: