Monday, December 7, 2009

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

හුග කාලෙකට පස්සෙ සතියක නිවාඩුවක් ලැබුන. ඒ හින්ද ආයෙමත් blog එක ලියන්න වෙලාවක් වෙන් කර ගන්න පුළුවන් කමක් ලැබුන. පසුගිය කොටස් වල ලිව්වෙ resource data ලබා ගන්න ආකාරය, මේ ‍කොටසේ සිට ලියන්නෙ එම resource data තිබෙන format එක ගැනයි.




Resource Data

මෙම කොටසෙහි ඇත්තේ Resource Data වේ. ඒවා ගිය වර කලාපයේ දක්වන ලද Resource types 14 ට හෝ Custom resource එකක් විය හැක. එහි මෙම Resource Data තිබෙන ස්ථානය පිළිබද විස්තරයක් කර ඇත. මෙම එක් එක් Resource Data වලින් data ලබා ගන්නා ආකාරය පහත දක්වා ඇත.

RT_CURSOR (0x00000001)
මෙහි ඇත්තේ PE සදහා යොදා ගන්නා Cursors වේ. මෙහි cursor එකෙහි සම්පූර්ණ data ප්‍රමාණයම නොමැත. මෙහි ඇති data මගින් අප cursor එක නිර්මානය කර ගත යුතුය. මෙය සිදු කිරීමට නම් අප cursor data format එක ගැන දැනගෙන සිටිය යුතුය.

එක් cursor file එකක් තුල images කීපයක් තිබිය හැක. එසේ තිබෙන්නේ වෙනස් bit depths හා වෙනස් dimentions සහිත එකම image එක වේ. නමුත් මෙහිදී ඇති cursor එකක තිබෙන්නේ තනි image එකක් පමණි. RT_CURSORGROUP යටතේ මෙම තනි cursor, group වන ආකාරය සදහන්ව ඇත. අපට අවශ්‍ය පරිදි එක් image එකක් සහිත තනි cursor file එකක් හෝ image කීපයක් එක් කර සාදා ගන්නා තනි cursor file එකක් වුවද ලබා ගත හැක.

Cursor File Format (.cur)
මෙහි පළමු 6 bytes සම්පූර්ණ cursor එකටම අදාල වේ. පළමු බයිට 4, 0x00000200 ලෙස වේ. ඊලග 2 bytes මගින් cursor images ගනන දක්වා ඇත. ඉන් පසු එක් image එකක් සදහා 16 bytes බැගින් වන headers තිබේ. එම header එකක පළමු 2 bytes මගින් dimentions දක්වා ඇත‍. මීලග 2 bytes මගින් Bit depth දක්වා තිබුනද 0x0000 යන අගයේද තිබිය හැක. එය 0x0000 ලෙස ඇත්නම් True color වේ. එම අගය ලබා ගත යුත්තේ RT_CURSORGROUP යන ස්ථානයෙන් වේ. මීලග 2 bytes මගින් click point එකෙහි x කණ්ඩාංකය දක්වා ඇත. එලෙසම ඊලග 2 bytes මගින් y කණ්ඩාංක දක්වා ඇත. මීලග 4 bytes මගින් cursor data හි විශාලත්වය දක්වා ඇත. මීලග 4 bytes මගින් cursor එකෙහි data ආරම්හ වන ස්ථානය headers හි ආරම්භක ස්ථානයට සාපේක්ෂව දක්වා ඇත. ඉන් පසුව cursor data පිහිටා ඇත. එහි පිහිටීම පහත රෑප සටහනේ දක්වා ඇත.



cursor data වෙත ගිය විට ඇත්තේ එම cursor එකෙහි x හා y කණ්ඩාංක හා cursor data පමණි. මෙහි dimentions, cursor data තුලින් ලබා ගත හැක.

RT_BITMAP (0x00000002)
මෙහි ඇත්තේ PE එක සදහා යොදා ගන්නා pictures වේ. ඒවා .bmp ආකාරයෙන් තිබේ. මෙහිද සම්පූර්ණ picture එක දක්නට නොලැබේ. එය අප picture data තුලින් නිර්මාණය කර ගත යුතු වේ.

Bitmap Image File Format (.bmp)
මෙම format එකෙහි පළමු 2 bytes 0x424D ලෙස වේ. මීලග 4 bytes මගින් image data හි විශාලත්වය දක්වා ඇත. මීලග 4 bytes 0x00000000 ලෙස තබන්න. මීලග 4 bytes, bit depth මත තීරනය වේ. නිල් පාටින් දක්වා ඇති ස්ථානයේ ඇත්තේ 0x00000000 නම්, රතු පාටින් දක්වා ඇති ස්ථානයේ අගය 0x0004 වන විට 0x00000076 ලෙසද, 0x0008 වන විට 0x00000436 ලෙසද, 0x0018 හෝ 0x0020 වන විට 0x00000036 ලෙසද විය යුතුය. නිල් පාටින් ඇති ස්ථානයේ වෙනත් අගයක් ඇත්නම් එම අගය 0x04 න් ගුණ කර 0x36 ක් එකතු කර ලිවිය යුතුය. ඉන් පසුව image data තිබේ.



RT_ICON (0x00000003)
මෙහි ඇත්තේ PE එක සදහා භාවිතා කරන icons වේ. මෙයට ඇත්තේ cursor format එකට සමාන format එකකි.

Icon File Format (.ico)
එහි පළමු 4 bytes, 0x00000100 ලෙස යොදන්න. ඊලග 2 bytes මගින් icon images ගනන දක්වා ඇත. header එකක පළමු 2 bytes මගින් dimentions දක්වා ඇත. ඊලග 2 bytes මගින් bit depth එක දක්වා ඇත. එය 0x0000 ලෙස ඇත්නම් True color වේ. එම අගය ලබා ගත යුත්තේ RT_ICONGROUP යන ස්ථානයෙන් වේ. මීලග 4 bytes සදහා 0x00000000 යොදන්න. මීලග 4 bytes මගින් icon data හි විශාලත්වය දක්වා ඇත. මීලග 4 bytes මගින් icon එකෙහි data ආරම්හ වන ස්ථානය දක්වා ඇත. ඉන් පසුව icon image එකට අදාල data තිබේ.



group කරන ලද icon එකෙහි පිහිටීමද මෙහි දක්වා ඇත.



RT_MENU (0x00000004)
මෙහි තිබෙන්නේ PE එකෙහි ඇති Menus වේ. මෙහි menu ආකාර දෙකකින් තිබේ. මෙහි පළමු byte එක 0x00 ලෙස ඇත්නම් එක් ආකාරයක්ද, 0x01 ලෙස ඇත්නම් තවත් ආකාරයක්ද වේ. එය පහත විස්තර කර ඇත.

පළමු byte එක 0x00 ලෙස ඇත්නම්,
පළමු 4 bytes අත් හරින්න. පසුව ඇත්තේ menu items වේ. එක් menu item එකක් ගත් විට
එහි පළමු 2 bytes මගින් පෙන්නුම් කරනුයේ attributes වේ. එය bit ආකාරයෙන් ගත් විට එහි 9 වැනි bit එක 1 ලෙස සටහන්ව ඇත්නම් එම menu item එක එම munu level එකෙහි අවසන් munu item එක වේ. එසේම 12 වැනි bit එක 1 ලෙස ඇත්නම් එම menu item එකෙන් sub menu එකක් ආරම්භ වේ. මෙම 2 bytes 0x0000 ලෙස ඇත්නම් එය ඉහත ආකාර දෙකට අයත් නොවන menu item එකක් වේ.
දෙවන 2 bytes මගින් menu item ID එක දැක්වේ. මෙම ආකාරයේ menu වල sub menu එකක් ආරම්භ වන items (popup items) commands ලබා දීම සදහා භාවිතයට නොගනී. එම නිසා එකම item ID එක වුවද තිබිය හැක. මීලගට ඇත්තේ menu text එක වේ. එය 2 bytes බැගින් 0x0000 හමු වන තෙක් කියවිය යුතුය. menu text එක NULL අගයක් නම් එමගින් කියවනුයේ එය separator එකක් බවය.
එක් menu item හි සැකසුම පහත ආකාර වේ.



මෙහි පළමු item එකෙහි පළමු 2 bytes හි 12 වන bit එක 1 බැවින් එමගින් sub menu එකක් ආරම්භ වේ. එම නිසා Properties යන item එක Printer යන item එකෙහි sub menu එකක් වේ. Close යන item එකෙහි පළමු 2 bytes හි 9 වැනි bit එක 1 ලෙස ඇති බැවින් එම ස්ථානයෙන් sub menu එක අවසන් වේ. එම නිසා Document යන්න Printer යන item එක ඇති level එකෙහිම ඇති item එකක් වේ. Help යන item එකෙහි පළමු 2 bytes හි 9 වැනි bit එක 1 බැවින් එම ස්ථානයෙන් menu එක අවසන් වේ.

පළමු byte එක 0x01 ලෙස ඇත්නම්,
පළමු 8 bytes අත් හරින්න. ඒවායින් කෙරෙනුයේ menu එකෙහි වර්ගය හදුනා ගැනීමයි. ඉන් පසුව ඇත්තේ menu items වේ. මෙම සෑම menu item එකක්ම ආරම්භ වනුයේ file offset එක 4 හි ගුණාකාරයක් වන ස්ථානයකිනි. එනම් මෙම කොටසෙහි file alignment එක 4 ක් වේ. මෙම එක් menu item එකක් ගත් විට
එහි පළමු 8 bytes මගින් properties පෙන්නුම් කරයි. properties පහත ආකාර විය හැක.
MFT_STRING
මෙහි අඩංගු වන්නේ string එකක් බව කියවේ.



MFT_SEPARATOR
මෙම 8 bytes හි 7 වන byte එක 0x08 ලෙස ඇත්නම් මෙය separator එකක් බව කියවේ.



MFT_RADIOCHECK
මෙහි 7 වන byte එක 0x02 ලෙස ඇත්නම් menu item කිහිපයක් අතුරින් එක් item එකක් පමණක් තෝරා ගත හැකි සේ සැකසේ.



MFT_RIGHTORDER
මෙහි 7 වන byte එක 0x20 ලෙස ඇත්නම් එම ස්ථානයේ සි‍ට එකම level එකෙහි ඉදිරියට ඇති menu items දකුණු කෙලවරේ සිට සැකසේ.



MFT_RIGHTJUSTIFY
මෙහි 7 වන byte එක 0x40 ලෙස ඇත්නම් menu bar එකෙහි එම ස්ථානයේ සි‍ට ඉදිරියට ඇති menu items දකුණු කෙලවරේ සිට සැකසේ.



MFT_MENUBARBREAK
මෙහි 8 වන byte එක 0x20 ලෙස ඇත්නම් menu bar එක දෙකකට වෙන් වේ.



MFT_MENUBREAK
මෙහි 8 වන byte එක 0x40 ලෙස ඇත්නම් menu එක දෙකකට වෙන් වේ.



MFS_DEFAULT
3 වන byte එක 0x10 ලෙස ඇත්නම් select වී තිබිය යුතු menu item එක දක්වා ඇත.



MFS_CHECKED
4 වන byte එක 0x08 ලෙස ඇත්නම් මෙහි checked = true ලෙස සැකසේ.



MFS_ENABLED
මෙමගින් menu item එක enable බව කියවේ.

MFS_GRAYED
4 වන byte එක 0x03 ලෙස ඇත්නම් එම menu item එක disable බව කියවේ.



properties වලින් පසුව ඇති 4 bytes මගින් menu item ID එක දැක්වේ.
ඉන් පසු ඇති 2 bytes මගින් attributes දක්වා ඇත. මෙය bit ආකාරයෙන් ගත් විට 9 වැනි bit එක 1 ලෙස ඇත්නම් එම menu item එක එම level එකෙහි අවසන් menu item එක වේ. එසේම 16 වන bit එක 1 ලෙස ඇත්නම් එම ස්ථානයෙන් sub menu එකක් ආරම්භ වේ.
ඉන් පසුව ඇත්තේ menu item text එක වේ. එය 2 bytes බැගින් 0x0000 හමු වන තෙක් කියවිය යුතුය.
අදාල menu item එක sub menu එකක ආරම්භක ස්ථානයක් නම් menu text එකට පසුව bytes 4 ක් 0x00000000 ලෙස තැබිය යුතුය. ඉන් පසුව file alignment එකට අදාල bytes ප්‍රමානය 0x00 ලෙස තැබිය යුතුය.



අදට ලියන එක මෙතනින් නවත්වනවා. ආයෙමත් කොටසක් ලගදීම ලියනවා.

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

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