Monday, September 7, 2009

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

මේ දවස්වල නිකන්ම ඉන්න හින්ද මොනව හරි ලියන්න හිතුන. ඒ හින්ද අද ඉදල දන්න සිංහලෙන් blog එක ලියනවා. මේ ලියන blog එක කොටස් කීපයකට ලියන්න වෙනවා. අද පළවෙනි කොටස ලියනවා. මේ ලියන දේවල් සේරම මම සොයා ගත්තේ අවුරැදු 1 1/2 ක් විතර Internet එක පාවිච්චි කරල. සමහර විට මේ ලිපි වල වැරදි තියෙන්න පුළුවන්, පුලුවන්නම් ඒවා නිවරැදි කරන්න.

PE Format


මම මේ ලිපිය ලියන්නේ වින්‍‍ඩෝස් වල තියෙන PE Format එක ගැනයි. මේ ලිපිය ලියද්දි භාවිතා කරන භාෂා විලාසය පිළිබදව සමාවන්න, මේක පැහැදිලිව ලියන්න නම් මේ විදියටම ලියන්න වෙනවා. PE කියන්නෙ Porta
ble Executable යන්නයි. මේ PE Files .exe (Programs) , .dll (Dynamic Link Library), .ocx (ActiveX Control) හෝ වෙනත් විදියකට තියෙන්න පුලුවන්. මේ වර්ගයේ files භාවිතා වෙන්නෙ Windows NT, Windows 95 හා Win32 files වලයි. Windows NT Drivers තියෙන්නෙත් මේ format එකෙන්ම තමයි. මේ ගැන අවබෝධයක් ලබා ගත්තොත් අපට පුළුවන් Executable එකක Source එක ලබා ගන්නත්, අර්ධ වශයෙන් වෙනස් කරන්නත් පුළුවන්. PE වල Source Code එක තියෙන්නෙ Machine Instruction විධියටමයි. ඒ නිසා වෙනස් කරද්දි ගැටළු මතු වෙනවා. නමුත් GUI සම්බන්ධ කොටස් වල Source එක පහසුවෙන් ‍තේරැම් ගන්නත්, වෙනස් කරන්නත් පුළුවන්. මේ ගැන පැහැදිලි දැනුමක් තියෙනවනම් Source එක වෙනස් කරන්න පුළුවන් Software එකක් වුනත් හදන්න පුළුවන්. පහතින් දැක්වෙනුයේ මාවිසින් නිර්මානය කරන ලද එවැනි Source එක වෙනස් කර re-compile කල හැකි මෘදුකාංගයකි.





* පින්තූර විශාලනය කිරීමට එය
මත click කරන්න.
* Software එකක Source එක වෙනස් කිරීමට ප්‍රථම එහි Copyrights පිළිබදව සැලකිලිමත් වන්න.


මෙහි සියලුම උදාහරණ හා පහදාදීම් සදහා c:\windows\system32\calc.exe හා c:\windows\system32\shell32.dll යොදා ගෙන ඇත.


Program එකක් Execute වීම.


මෙහි c:\windows\system32\calc.exe හි MS-DOS හිදී Instructions කීපයක් දක්වා ඇත.
නිල් වර්ණයෙන් දක්වා ඇත්තේ ඒවාය.




මෙහිදී calc.exe, MS-DOS තුලදී run කල නොහැකි නිසා calc.exe ට අයත් Instrucions 7 ක් තුලදී terminate වීම සිදුවේ. (නමුත් calc.exe ක්‍රියාත්මක කිරීමට windows kernel මගින් විශාල instructions ප්‍රමාණයක් යොදවයි.)


- මෙහි AX හි දැක්වෙනුයේ EAX registry එකෙහි AX කොටසයි. අවසන් instruction එකේදී AX=0x4C01 යනුවෙන් ඇත. මෙහි 4C යනු Exit යන්නත්, 01 යනු return value එකත් වේ.

- මෙහි
BX, CX යනුවෙන් දැක්වෙන්නේ EBX, ECX registry වේ. මෙමගින් Execute වන Program එකෙහි විශාලත්වය පෙන්වයි.
[(0001 BE00)hex] bytes = 114176 bytes මෙය calc.exe හි විශාලත්වයට සමාන නොවේ. (මේ සදහා
IMAGE_DOS_HEADER ---> 64 bytes

Windows® header ---> 448 bytes

එක් වු විට calc.exe හි විශාලත්වයට සමාන වේ.)


- මෙහි DX මගින් දැක්වෙනුයේ Data register එකට ගත යුතු data හි starting offset එකයි. DX=0x000E ලෙස ඇත. මෙමගින් කියවෙනුයේ 0x000E ස්ථානයේ සිට කියවිය යුතු බවය. (මෙහිදී 24 hex value එක හමුවෙන ‍තෙක් read කිරීම සිදු කරයි. එමගින් This program cannot be run in DOS mode. යන්න data register එකට යයි.)

මෙහි

SP - stack pointer

DS - data segment
CS - code segment

IP - instruction pointer

(Assembly language ගැන පසුව හොදින් විස්තර කිරීමට බලාපොරොත්තු වෙනවා.)

ඉහත program එක execute වීමේදී ආරම්භයේ සිට අවසානය තෙක් execute නොවේ. එය යම් කිසි ක්‍රමයකට සිදු වේ. මෙමගින් පැහැදිලි වනුයේ මේ සදහා විශේෂිත file format එකක් ඇති බවයි.

මේ file format එක නිර්මානය කලේ Microsoft ආයතනයෙන්, මේක සම්මත කලේ TIS (Tool Interface Standard) Committee (Microsoft, Intel, Bordland, Watcom, IBM and Others) මගින් 1993 දීය. මේ format එක සමහර Unix හා VMS ව
ලදීද භාවිතා වෙනවා. PE file එකක් සරලව පහත ආකාරයට දක්වන්න පුළුවන්

MS-DOS Stub
IMAGE_NT_HEADERS
Image Section headers
Section 1
Section 2
..........
Section n

PE File එකක් run කිරීමේදී පළමුවම සිදුවනුයේ MS-DOS Stub කියවා එහි validity එක පරීක්ෂා කිරීමයි. MS-DOS Stub එක යනු MS-DOS වැඩසටහකි. එය 16 bit-windows වැඩසටහනකි. පසුව එය valid නම් IMAGE_NT_HEADERS වෙත ගොස් Execute කිරීම ආරම්භ කරයි. IMAGE_NT_HEADERS සිට ඉදිරියට තිබෙන්නේ 32 bit-windows වැඩසටහනකි.

PE file එකක් logical disk එකක් යැයි සිතන්න. එවිට IMAGE_NT_HEADERS යනු logical disk එකෙහි Boot Sector එක ලෙස ගත හැක. එවිට Sections, logical disk හි ඇති files ලෙස ගත හැක. Files සදහා read-only, hidden, system, archive ලෙස attributes තිබිය හැක. මෙලෙස Sections සදහාද attributes තිබිය හැක. එම attributes තබා ගනුයේ Image Section headers හිය. එය array එකක් ආකාරයෙන් පවතී. එහි එක් එක් Sections සදහා වෙන වෙනම attributes තබා ගනී. Sections n ප්‍රමාණයක් තිබේ නම්, Image Section headers හි කොටස් n ප්‍රමාණයක attributes තබා ගනී. මෙම Sections .code, .data, .idata, .edata හා තවත් ආකාර වලින් තිබිය හැක. මෙහි උඩින්ම තියෙන්නෙ MS-DOS Stub එකයි. මෙම‍ගින් අපට පුලුවන් අදාල Executable එක valid Executable එකක්ද කියල දැනගන්න. මේ DOS Stub තවත් කොටස් 2 ක‍ට බෙදන්න පුළුවන්.

1. IMAGE_DOS_HEADER

2. MS-DOS_STUB_PROGRAM


IMAGE_DOS_HEADER

IMAGE_DOS_HEADER එක තවත් කොටස් කීපයකට වෙන් කරන්න පුළුවන්

























i.e_magicMagic number
e_magic සදහා තිබිය හැකි අගයන්
IMAGE_DOS_SIGNATURE - 0x5A4D, MZ
IMAGE_OS2_SIGNATURE - 0x454E, NE
IMAGE_OS2_SIGNATURE_LE - 0x454C, LE
ii.e_cblpBytes on last page of file
iii.e_cpPages in file
iv.e_crlcNumber of relocation entries stored after the header.
v.e_cparhdrSize of header in paragraphs
vi.e_minallocMinimum extra paragraphs needed
vii.e_maxallocMaximum extra paragraphs needed
viii.e_ssRelative value of the stack segment.
ix.e_spInitial value of the SP register.
x.e_csumWord checksum.
xi.e_ipInitial value of the IP register.
xii.e_csInitial value of the CS register.(relative to the segment the program was loaded at.)
xiii.e_lfarlcFile address of relocation table
xiv.e_ovnoOverlay number
xv.e_res(0)Reserved words
xvi.e_res(1)Reserved words
xvii.e_res(2)Reserved words
xviii.e_res(3)Reserved words
xix.e_oemidOEM identifier (for e_oeminfo)
xx.e_oeminfoOEM information
xxi.e_res2(0)Reserved words
xxii.e_res2(1)Reserved words
xxiii.e_res2(2)Reserved words
xiv.e_res2(3)Reserved words
xv.e_res2(4)Reserved words
xvi.e_res2(5)Reserved words
xvii.e_res2(6)Reserved words
xviii.e_res2(7)Reserved words
xxix.e_res2(8)Reserved words
xxx.e_res2(9)Reserved words
xxxi.e_lfanewFile address of new exe header


DQ - Qword    DD - Dword    DW - Word    DB - Byte

MS-DOS_STUB_PROGRAM හිදී Executable එක invalid නම් "This program cannot be run in DOS mode." හෝ වෙනත් Text එකක් දර්ශනය කරමින් ඉවත් වේ. මෙම දර්ශනය වන Text එක assembler/compiler එක මගින් යොදන Text එකකි. Executable එක valid නම් IMAGE_NT_HEADERS සිට ඉදිරියට ඇති වැඩසටහන ආරම්භ කරයි. ඉහත e_lfarlc මගින් MS-DOS_STUB_PROGRAM හි ආරම්භක ස්ථානයත් e_lfnew මගින් IMAGE_NT_HEADERS හි ආරම්භක ස්ථානයත් දක්වා ඇත. එමගින් අපට MS-DOS_STUB_PROGRAM හි විශාලත්වය ලබා ගත හැක.
මෙහි DOS_STUB_PROGRAM හි ආරම්භක ස්ථානය දක්වා ඇත්තේ 16 bit word එකකිනි. IMAGE_NT_HEADERS හි ආරම්භක ස්ථානය දක්වා ඇත්තේ 32 bit word එකකිනි. එමගින් පැහැදිලි වනුයේ DOS Stub එක 16 bit-windows වැඩසටහක් බවත් IMAGE_NT_HEADERS සිට ඉදිරියට 32 bit-windows වැඩසටහනක් ඇති බවත්ය.

MS-DOS Stub හි පිහිටීම

සැ.යු. :- Data කියවීමේදී Right-to-Left Order එක‍ට කියවිය යුතුය.

උදා:- F0 00 00 00 ලෙස ඇත්නම් 00 00 00 F0 වන ආකාරයට කියවිය යුතුය.

12 34 56 78 ලෙස ඇත්නම් 78 56 34 12 වන ආකාරය‍ට කියවිය යුතුය.

#include "pshpack1.h"

#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ
#define IMAGE_OS2_SIGNATURE 0x4E45 // NE
#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE
#define IMAGE_NT_SIGNATURE 0x50450000 // PE00

typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

(මෙය microsoft ආයතනයෙන් සකසන ලද winnt.h නැමැති source file එකෙහි හදුන්වා ඇති ආකාරය වේ.)

1 comment: