Thursday, March 11, 2010

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

මෙම ලිපියෙන් ලිවීමට බලාපොරොත්තු වනුයේ win32 Portable Executable format යනුවෙන් හදුන්වන්නේ කුමක්ද යන්නත් මෙතෙක් ලියු ලිපි වල සාරාංශයක් ඉදිරිපත් කිරීමටත්ය.





සිං
හලෙන් win32 Portable Executable format - part 9 සදහා මීට පෙර ලිපියට යන්න.


මෙය විස්තර කිරීම සදහා නිශ්චිත ක්‍රමයක් නොමැත. එම නිසා මා දන්නා පමණනින් විස්තර කිරීම‍ට බලාපොරොත්තු වෙන්නෙමි. මෙම file format එක COFF (Common Object File Format) ලෙසද හදුන්වන ස්ථානද දක්නට ඇත. මෙය Microsoft ආයතනය විසින් පමණක් නිර්මානය කරන ලද්දක් නොවන අතර Intel, Borland, Watcom, IBM වැනි ආයතන කිහිපයක්ද එකතුව නිර්මානය කරන ලද්දකි.
මෙයටද වෙනත් file වර්ග(.html, .zip, .bmp වැනි) වලට මෙන්ම ආවේනික රටාවක් තිබේ. මෙම format එකට සකසන files .exe, .dll, .ocx, .cpl, .sys වැනි extenstions වලින් තිබිය හැක.

PE එකක් යනු compiler එකක් මගින් සකසන ලද file එකක් වේ. එය අපට නිර්මානය කිරීමට අපහසුය. අපට win32 executable එකක් සැකසීමට නම් PE format එක ගැනත් Linker එකක ක්‍රියාවලියත් යන 2ම ගැන හොද අවබෝධයක් තිබිය යුතුය. ඊ‍ට අමතරව library file වල ඇති functions ගැනත්, ඒවායේ කාර්යයන් ගැනත් හොද අවබෝධයක් තිබිය යුතුය.

මෙම ලිපි මාලාවේ පැහැදිලි කිරීම් සදහා calc.exe හා shell32.dll (අනවසරයෙන්)යොදා ගෙන ඇත.

PE file එකක් සැකසීමට 0 සිට 255 (ASCII Code) දක්වා ඇති සියලුම අකුරැ භාවිතයට ගනී. එම නිසා ඒවා text editor එකකින් කියවිය නොහැක. ඒවා කියවීමට නම් එය hex editor එකකින් විවෘත කර ගත යුතුය.

Source එක හා output එක පමණක් සැලකූ විට,

html source file එකක් web browser එකක් මගින් විවෘත කල විට එහි source එකට අනුව output එකක් නිර්මාණය කර දෙයි.



එසේම exe එකක් ක්‍රියාත්මක කල විට PE එකෙහි source එකට අදාල output එකක් අපට දැක ගත හැක.



PE format එක යනු PE එකක source එක තබා ගන්නා ආකෘතිය වේ. මෙම ලිපි මාලාවෙන් පැහැදිලි කර තිබෙනුයේ PE එකක source file එකෙහි format එක ගැනය. එය html යන language එක ගැන පැහැදිලි කිරීමක් වැනිය.
මෙහිදී සියළු පැහැදිලි කිරීම් සිදුකර ඇත්තේ අන්තර්ජාලය හරහා ලබා ගත් තොරතුරු මත හා මාගේ ස්වයං අධ්‍යයන මත ලබා ගත් කරුනු මගිනි. මෙම පැහැදිලි කිරීම් සදහා මා විසින් නිර්මාණය කරන ලද මෘදුකාංගයක් යොදා ගෙන ඇත. එය PE file එක තිබෙන ආකාරය බලා ගැනීමට හා වෙනස් කිරීමට හැකි IDE එකක් ලෙස ක්‍රියා කරයි. නමුත් මෙමගින් නව PE file එකක් නිර්මාණය කල නොහැක. මෙහිදී සිදු කරනුයේ PE එකෙහි data වෙනස් කර පිටපතක් save කිරීම පමනකි.

මෙම PE file වල magic code එක "MZ" වේ. PE එකක ව්‍යුහය පිළිබදව අන්තර්ජාලය තුල සෙවීම් කිරීමේදී විවිධ ආකාරයේ පැහැදිලි කිරීම් දක්නට තිබේ. නමුත් මෙහිදී මා පළමුව සිදු කලේ PE එක ප්‍රධාන කොටස් 3 කට වෙන් කර එය tree එකක් ආකාරයට සකසා ගැනීමයි. පළමු කොටස MS-DOS දත්ත සදහාද, දෙවන කොටස Win NT දත්ත සදහාද, තෙවන කොටස PE එකෙහි data ඇති කොටස වශයෙන්ද වෙන් කර ඇත. මෙහි පළමු කොටස් 2හි ඇති සියළු උප කොටස් සෑම PE එකකම පාහේ දක්නට ඇත.තෙවන කොටස section වල meta data හා section data යනුවෙන් තවත් කොටස් 2 කට වෙන් කර ඇත. මෙම sections .text, .rsrc, .data වැනි නම් වලින් පිහිටා තිබේ. මෙම section තුල data අඩංගු tables පිහිටා ඇත. ඒවා import table, export table, resource table වැනි නම් වලින් පිහිටා ඇත. මෙම table තුල භාවිතා කරන දත්ත, executable code එක, වෙනත් library තුලින් import කල යුතු functions ගැන විස්තර ආදිය තිබේ.

මෙහි PE එකෙහි ව්‍යුහය tree එකක් ආකාරයට දක්වා ඇත.

Wednesday, March 10, 2010

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

පසුගිය සතියේ RT_DIALOG පිළිබදව විස්තර කිරීමක් සිදු කර ඇත. තවද dialog එකක් තුල ඇති Object classes කිහිපයක් ගැනද, ඒවායේ attribute ගැනද සදහන් කර ඇත. මේ සතියේ තවත් Object classes කිහිපයක් ගැන සදහන් කිරීමට බලාපොරොත්තු වෙමි.





COMBO BOX
STYLE NAMEBIT #
CBS_LOWERCASExviii=1
CBS_UPPERCASExix=1
CBS_DISABLENOSCROLLxxi=1
CBS_NOINTEGRALHEIGHTxxii=1
CBS_HASSTRINSxxiii=1
CBS_SORTxxiv=1
CBS_OEMCONVERTxxv=1
CBS_AUTOHSCROLLxxvi=1
CBS_OWNERDRAWVARIABLExxvii=1
CBS_OWNERDRAWFIXEDxxviii=1
CBS_DROPDOWNLISTxxxi=1 And
xxxii=1
CBS_DROPDOWNxxxi=1 And
xxxii=0
CBS_SIMPLExxxi=0 And
xxxii=1

msctls_trackbar32
TBS_NOTHUMBxxv=1
TBS_FIXEDLENGHTxxvi=1
TBS_ENABLESELRANGExxvii=1
TBS_NOTICKSxxviii=1
TBS_HORZxxxi=0
TBS_VERTxxxi=1
TBS_AUTOTICKSxxxii=1
TBS_RIGHTxxx=0
TBS_BOTTOMxxx=0
TBS_TOPxxx=1
TBS_LEFTxxx=1
TBS_BOTHxxix=1

msctls_updown32
UDS_NOTHOUSANDSxxv=1
UDS_HORZxxvi=1
UDS_ARROWKEYSxxvii=1
UDS_AUTOBUDDYxxviii=1
UDS_ALIGNLEFTxxix=1
UDS_ALIGNRIGHTxxx=1
UDS_SETBUDDYINTxxxi=1
UDS_WRAPxxxii=1

msctls_progress32
PBS_VERTICALxxx=1
PBS_SMOOTHxxxii=1

SysListView32
LVS_NOSORTHEADERxvii=1
LVS_NOCOLUMHEADERxviii=1
LVS_NOSCROLLxix=1
LVS_OWNERDATAxx=1
LVS_OWNERDRAWFIXEDxxii=1
LVS_EDITLABELSxxiii=1
LVS_AUTOARRANGExxiv=1
LVS_ALIGNTOPxxi=0
LVS_ALIGNLEFTxxi=1
LVS_NOLABELWRAPxxv=1
LVS_SHAREIMAGELISTSxxvi=1
LVS_SORTDESCENGINGxxvii=1
LVS_SORTASCENDINGxxviii=1
LVS_LISTxxxi=1 And
xxxii=1
LVS_SMALLICONxxxi=1 And
xxxii=0
LVS_REPORTxxxi=0 And
xxxii=1
LVS_ICONxxxi=0 And
xxxii=0
LVS_SHOWSELALWAYSxxx=1
LVS_SINGLESELxxix=1

SysTreeView32
TVS_SHOWSELALWAYSxxvi=1
TVS_DISABLEDRAGDROPxxvii=1
TVS_EDITLABELSxxviii=1
TVS_LINESATROOTxxix=1
TVS_HASLINESxxxi=1
TVS_HASBUTTONSxxxii=1

SysTabControl32
TCS_FOCUSNEVERxvii=1
TCS_TOOLTIPSxviii=1
TCS_OWNERDRAWFIXEDxix=1
TCS_FOCUSONBUTTONDOWNxx=1
TCS_RIGHTJUSTIFYxxii=0
TCS_FIXEDWIDTHxxii=1
TCS_SINGLExxiii=0
TCS_MULTILINExxiii=1
TCS_TABSxxiv=0
TCS_BUTTONSxxiv=1
TCS_RAGGEDRIGHTxxi=1
TCS_VERTICALxxv=1
TCS_HOTTRACKxxvi=1
TCS_FORCELABELLEFTxxvii=1
TCS_FORCEICONLEFTxxviii=1
TCS_RIGHTxxxi=1
TCS_BOTTOMxxxi=1
TCS_SCROLLOPPOSITExxxii=1

SysAnimate32
ACS_TIMERxxviii=1
ACS_AUTOPLAYxxix=1
ACS_TRANSPARENTxxxi=1
ACS_CENTERxxxii=1

RichEdit20A
ES_SELECTIONBARix=1
ES_VERTICALx=1
ES_NOIMExiii=1
ES_SELFIMExiv=1
ES_SAVESELxvii=1
ES_SUNKENxviii=1
ES_DISABLENOSCROLLxix=1
ES_WANTRETURNxx=1
ES_READONLYxxi=1
ES_NOHIDESELxxiv=1
ES_AUTOHSCROLLxxv=1
ES_AUTOVSCROLLxxvi=1
ES_PASSWORDxxvii=1
ES_RIGHTxxxi=1 And
xxxii=0
ES_CENTERxxxi=0 And
xxxii=1
ES_LEFTxxxi=0 And
xxxii=0
ES_NOOLEDRAGDROPxxix=1
ES_MULTILINExxx=1

SysDateTimePick32
DTS_RIGHTALIGNxxvii=1
DTS_APPCANPARSExxviii=1
DTS_SHOWNONExxxi=1
DTS_UPDOWNxxxii=1
DTS_SHORTDATEFORMATxxx=0
DTS_LONGDATEFORMATxxx=1
DTS_TIMEFORMATxxix=1

SysMonthCal32
MCS_NOTODAYxxix=1
MCS_WEEKNUMBERSxxx=1
MCS_MULTISELECTxxxi=1
MCS_DAYSTATExxxii=1

ComboBoxEx32
CBS_LOWERCASExviii=1
CBS_UPPERCASExix=1
CBS_DISABLENOSCROLLxxi=1
CBS_NOINTGRALHRIGHTxxii=1
CBS_HASSTRINGSxxiii=1
CBS_SORTxxiv=1
CBS_OEMCONVERTxxv=1
CBS_AUTOHSCROLLxxvi=1
CBS_DROPDOWNLISTxxxi=1 And
xxxii=1
CBS_DROPDOWNxxxi=1 And
xxxii=0
CBS_SIMPLExxxi=0 And
xxxii=1




object සදහා වන Styles හා ExStyles යෙදිය හැකි අගයන් ඉහත දක්වා තිබේ. මීගල‍ට ඇති 4 bytes මගින් දක්වනු ලබන්නේ එම object එක තිබෙන ස්ථානයේ x හා y ඛණ්ඩාංකයන් වේ. මිලග 4 bytes මගින් දක්වා ඇත්තේ එම object එකෙහි පළල හා උස වේ. මෙම අගයන් පික්සල්(px) මගින් දක්වා ඇත. මීලග 4 bytes මගින් පෙන්වනු ලබන්නේ Object එකෙහි ID එක වේ. මීලග‍ට ඇති 2 bytes මගින් 0xFFFF පෙන්නුම් කර ඇත්නම් එමගින් කියවෙනුයේ ඉන් පසුව ඇති 2 bytes මගින් Object class එකට අදාල අංකය දක්වා ඇති බවය. එසේ නොමැති නම් පසුව ඇත්තේ එම Object එකෙහි නම වේ.





Object class වලට අදාල අංක පහත ආකාර වේ.

0x0080BUTTON
0x0081TEXT BOX
0x0082STATIC
0x0083LIST BOX
0x0084SCROLLBAR
0x0085COMBO BOX

වෙනත් අංකයක් නම් එහි Object class එක ලෙස එම අංකයම යොදා ගනී.

මීලග‍ට ඇති 2 bytes මගින් 0xFFFF නිරෑපනය කර ඇත්නම් එමගින් කියවනුයේ මීලගට ඇති 2 bytes මගින් අදාල Object එක හා සම්බන්ධ කර ඇති resource එකක ID එකක් වේ.

උදා:- Object එක Icon එකක් යැයි සිතන්න එවිට එයට යෙදිය යුතු Icon එකෙහි ID එක මෙහි දක්වා ඇත.
එසේ නොමැති නම් මෙහි සදහන් වනුයේ text එකකි. එය Object එකට අදාල caption එකක් විය හැක.

මෙතනින් RT_DIALOG ගැන ලියල ඉවරයි. ලබන සතියේ ලියන්නේ RT_STRING ගැනයි.