PE Format
මම මේ ලිපිය ලියන්නේ වින්ඩෝස් වල තියෙන PE Format එක ගැනයි. මේ ලිපිය ලියද්දි භාවිතා කරන භාෂා විලාසය පිළිබදව සමාවන්න, මේක පැහැදිලිව ලියන්න නම් මේ විදියටම ලියන්න වෙනවා. PE කියන්නෙ Portable 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_magic | Magic number e_magic සදහා තිබිය හැකි අගයන් IMAGE_DOS_SIGNATURE - 0x5A4D, MZ IMAGE_OS2_SIGNATURE - 0x454E, NE IMAGE_OS2_SIGNATURE_LE - 0x454C, LE |
ii. | e_cblp | Bytes on last page of file |
iii. | e_cp | Pages in file |
iv. | e_crlc | Number of relocation entries stored after the header. |
v. | e_cparhdr | Size of header in paragraphs |
vi. | e_minalloc | Minimum extra paragraphs needed |
vii. | e_maxalloc | Maximum extra paragraphs needed |
viii. | e_ss | Relative value of the stack segment. |
ix. | e_sp | Initial value of the SP register. |
x. | e_csum | Word checksum. |
xi. | e_ip | Initial value of the IP register. |
xii. | e_cs | Initial value of the CS register.(relative to the segment the program was loaded at.) |
xiii. | e_lfarlc | File address of relocation table |
xiv. | e_ovno | Overlay 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_oemid | OEM identifier (for e_oeminfo) |
xx. | e_oeminfo | OEM 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_lfanew | File 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 එකෙහි හදුන්වා ඇති ආකාරය වේ.)
ela...
ReplyDeletedigatama blog eka liyanana