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 පහත ආකාරයෙන් අංක කර ඇත.
0x00000001 | RT_CURSOR |
0x00000002 | RT_BITMAP |
0x00000003 | RT_ICON |
0x00000004 | RT_MENU |
0x00000005 | RT_DIALOG |
0x00000006 | RT_STRING |
0x00000007 | RT_FONTDIR |
0x00000008 | RT_FONT |
0x00000009 | RT_ACCELERATOR |
0x0000000A | RT_RCDATA |
0x0000000B | RT_MESSAGETABLE |
0x0000000C | RT_CURSORGROUP |
0x0000000E | RT_ICONGROUP |
0x00000010 | RT_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 පහත ආකාරයෙන් අංක කර ඇත.
0x00000436 | af | Afrikaans |
0x0000041C | sq | Albanian |
0x00000001 | ar | Arabic |
0x00000401 | ar-sa | Arabic (Saudi Arabia) |
0x00000801 | ar-iq | Arabic (Iraq) |
0x00000C01 | ar-eg | Arabic (Egypt) |
0x00001001 | ar-ly | Arabic (Libya) |
0x00001401 | ar-dz | Arabic (Algeria) |
0x00001801 | ar-ma | Arabic (Morocco) |
0x00001C01 | ar-tn | Arabic (Tunisia) |
0x00002001 | ar-om | Arabic (Oman) |
0x00002401 | ar-ye | Arabic (Yemen) |
0x00002801 | ar-sy | Arabic (Syria) |
0x00002C01 | ar-jo | Arabic (Jordan) |
0x00003001 | ar-lb | Arabic (Lebanon) |
0x00003401 | ar-kw | Arabic (Kuwait) |
0x00003801 | ar-ae | Arabic (U.A.E.) |
0x00003C01 | ar-bh | Arabic (Bahrain) |
0x00004001 | ar-qa | Arabic (Qatar) |
0x0000042D | eu | Basque |
0x00000402 | bg | Bulgarian |
0x00000423 | be | Belarusian |
0x00000403 | ca | Catalan |
0x00000004 | zh | Chinese |
0x00000404 | zh-tw | Chinese (Taiwan) |
0x00000804 | zh-cn | Chinese (China) |
0x00000C04 | zh-hk | Chinese (Hong Kong SAR) |
0x00001004 | zh-sg | Chinese (Singapore) |
0x0000041A | hr | Croatian |
0x00000405 | cs | Czech |
0x00000406 | da | Danish |
0x00000413 | nl | Dutch (Netherlands) |
0x00000813 | nl-be | Dutch (Belgium) |
0x00000009 | en | English |
0x00000409 | en-us | English (United States) |
0x00000809 | en-gb | English (United Kingdom) |
0x00000C09 | en-au | English (Australia) |
0x00001009 | en-ca | English (Canada) |
0x00001409 | en-nz | English (New Zealand) |
0x00001809 | en-ie | English (Ireland) |
0x00001C09 | en-za | English (South Africa) |
0x00002009 | en-jm | English (Jamaica) |
0x00002809 | en-bz | English (Belize) |
0x00002C09 | en-tt | English (Trinidad) |
0x00000425 | et | Estonian |
0x00000438 | fo | Faeroese |
0x00000429 | fa | Farsi |
0x0000040B | fi | Finnish |
0x0000040C | fr | French (France) |
0x0000080C | fr-be | French (Belgium) |
0x00000C0C | fr-ca | French (Canada) |
0x0000100C | fr-ch | French (Switzerland) |
0x0000140C | fr-lu | French (Luxembourg) |
0x0000043C | gd | Gaelic |
0x00000407 | de | German (Germany) |
0x00000807 | de-ch | German (Switzerland) |
0x00000C07 | de-at | German (Austria) |
0x00001007 | de-lu | German (Luxembourg) |
0x00001407 | de-li | German (Liechtenstein) |
0x00000408 | el | Greek |
0x0000040D | he | Hebrew |
0x00000439 | hi | Hindi |
0x0000040E | hu | Hungarian |
0x0000040F | is | Icelandic |
0x00000421 | in | Indonesian |
0x00000410 | it | Italian (Italy) |
0x00000810 | it-ch | Italian (Switzerland) |
0x00000411 | ja | Japanese |
0x00000412 | ko | Korean |
0x00000426 | lv | Latvian |
0x00000427 | lt | Lithuanian |
0x0000042F | mk | FYRO Macedonian |
0x0000043E | ms | Malay (Malaysia) |
0x0000043A | mt | Maltese |
0x00000414 | no | Norwegian (Bokmal) |
0x00000814 | no | Norwegian (Nynorsk) |
0x00000415 | pl | Polish |
0x00000416 | pt-br | Portuguese (Brazil) |
0x00000816 | pt | Portuguese (Portugal) |
0x00000417 | rm | Rhaeto-Romanic |
0x00000418 | ro | Romanian |
0x00000818 | ro-mo | Romanian (Moldova) |
0x00000419 | ru | Russian |
0x00000819 | ru-mo | Russian (Moldova) |
0x00000C1A | sr | Serbian (Cyrillic) |
0x0000081A | sr | Serbian (Latin) |
0x0000041B | sk | Slovak |
0x00000424 | sl | Slovenian |
0x0000042E | sb | Sorbian |
0x0000040A | es | Spanish (Traditional Sort) |
0x0000080A | es-mx | Spanish (Mexico) |
0x00000C0A | es | Spanish (International Sort) |
0x0000100A | es-gt | Spanish (Guatemala) |
0x0000140A | es-cr | Spanish (Costa Rica) |
0x0000180A | es-pa | Spanish (Panama) |
0x00001C0A | es-do | Spanish (Dominican Republic) |
0x0000200A | es-ve | Spanish (Venezuela) |
0x0000240A | es-co | Spanish (Colombia) |
0x0000280A | es-pe | Spanish (Peru) |
0x00002C0A | es-ar | Spanish (Argentina) |
0x0000300A | es-ec | Spanish (Ecuador) |
0x0000340A | es-cl | Spanish (Chile) |
0x0000380A | es-uy | Spanish (Uruguay) |
0x00003C0A | es-py | Spanish (Paraguay) |
0x0000400A | es-bo | Spanish (Bolivia) |
0x0000440A | es-sv | Spanish (El Salvador) |
0x0000480A | es-hn | Spanish (Honduras) |
0x00004C0A | es-ni | Spanish (Nicaragua) |
0x0000500A | es-pr | Spanish (Puerto Rico) |
0x00000430 | sx | Sutu |
0x0000041D | sv | Swedish |
0x0000081D | sv-fi | Swedish (Finland) |
0x0000041E | th | Thai |
0x00000431 | ts | Tsonga |
0x00000432 | tn | Tswana |
0x0000041F | tr | Turkish |
0x00000422 | uk | Ukrainian |
0x00000420 | ur | Urdu |
0x0000042A | vi | Vietnamese |
0x00000434 | xh | Xhosa |
0x0000043D | ji | Yiddish |
0x00000435 | zu | Zulu |
වෙනත් 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 එක ගැන වැඩි දුරටත් ලියනවා.
keep it up
ReplyDelete