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

No comments:

Post a Comment