Professional Documents
Culture Documents
Portable Executable
Portable Executable
عنوان پروژه:
دانشجویان:
مرتضی ذاکری
استاد:
پاییز 1395
فهرست
فهرست مطالب
1مقدمه 1 ...........................................................................................
ب
فهرست
ت
بررسی ساختار فایل های PE
1مقدمه
فایل PEیا Portable Executableقالب فایلی ا ست که در سی ستم ها عامل ویندوز به کار می
رود (در هر دو نسخه 32و 64بیتی) PE .قالب استاندارد شده ای برای فایل هایی با پسوند های
رایج زیر است:
در واقع PEداده ســاختاری اســت شــامل االالعات از برای ماژول بارکننده برنامه در
سی ستم عامل که نهایتا فایل را برای اجرا شدن در حافظه قرار می دهد .قبل از ابداع این قالب،
قالبی به نا COFFوجود داشت که در سیستم های Windows NTاستفاده می شد.
2ساختار کلی
اساسا فایل PEاز دو بخش تقسیم شده است که هریک دارای زیر بخش های مختلفی می باشد.
بخش اول Headerو بخش دیگر Sectionنا دارد .شــکل 1-2بخش های اصــلی و زیر بخش
های درون هریک را به صورت گرافیکی نشان می دهد.
1
بررسی ساختار فایل های PE
2
بررسی ساختار فایل های PE
3
بررسی ساختار فایل های PE
DOS Header
DOS Headerیا 64 DOS MZ Headerبایت اول هر فایل PEرا ت شکیل می دهد .این ق سمت
تو سط بارکننده DOSبرر سی می شود و در صورتی که معتبر با شد برنامه DOS STUBاجرا می
شـــود .اما هنگامی که فایل PEحاوی برنامه Win32باشـــد ،در بخش DOS Headerپرش به
ابتدای PE File Headerانجا شده و DOS STUBنیز حاوی کد چاپ پیا زیر می شود.
بنابراین هنگامی که فایل PEدر محیط DOSاجرا شـــود ،با ورود بخش حاوی برنامه کوچک
DOS STUBپیا فوق به کاربر نمایش داده می شود.
شـــا مل االال عاتی مان ند نوع پرداز نده ،ت عداد کل Sectionهای فا یل PEجاری ،مهر ز مان
( )TimeStampو غیره است .آغاز این قسمت با فیلد موسو به PE Signatureاست که محتوی
کد اسکی 45 00یا همان عبارت PE 00می باشد.
Optional Header
علی رقم وجود واژه اختیاری در نا این ق سمت ،االالعات مهمی در آن قرار می گیرند .چند قلم
از این االالعات عبارتند از MajorLinkerVersion :و MinorLinkerVersionشماره نسخه برنامه
Linkerکه این فایل را ایجاد کرده اســـت SizeOfCode .اندازه همه Sectionهای حاوی کد
برنامه AddressOfEntryPoint .آدرســـی که بار کننده اجرا را از آنجا آغاز می کند .این فیلد
حاوی ادرس مجازی ن سبی یه همان RVAمی با شد که به محلی در بخش .textا شاره می کند
و . ...
یک زیر بخش مهم در Optional Headerفیلدی تحت عنوان Data Directoryاســـت .این
بخش در واقع آرایه ای از ساختارهای IMAGE_DATA_DIRECTORYا ست .هر ساختار آدرس
4
بررسی ساختار فایل های PE
مجازی ن سبی ،یک ساختار داده مهم در فایل PEهمچون جدول آدرس واردات فایل ( import
Section Table
بین بخش PE Headerو Sectionها این قســمت قرار گرفته اســت Section Table .در واقع
1
شــبیه یک دفترچه تلفن اســت که االالعاتی راجع به هر Sectionموجود در تصــویر حافظه
برنامه را در بردارد Section .ها بر ا ساس ادرس شروع مجازی خود در حافظه مرتب می شوند
نه عناوینشان.
Sectionها
تعداد و نا Sectionها در فایل های PEمی تواند مختلف باشــد .اما برای هر Sectionاالالعات
یکســانی باید نگاهداری گردد .فایل EXEدر مورد Sectionهایش االالعات نظیر آدرس فیزیکی،
آدرس مجازی ،اندازه االالعات و نوع دســترســی های موجود از قبیل خواندن ،نوشــتن و اجرا را
نگهداری می کند.
در این ق سمت تعدادی از Sectionهایی را که در فایل های .exeو .objوجود دارند معرفی می
کنیم .معموا عنوان هر Sectionبا یک نط قه آغاز می شـــود ولی الزامی برای این کار وجود
ندارد ،یعنی می تواند بدون نقطه هم باشد.
.textاین Sectionجایی است که همه کدهای برنامه که توسط کامپایلر یا اسمبلر تولید شده
است نوشته می شود.
1
Image
5
بررسی ساختار فایل های PE
.idataشــامل داده ها و تابع هایی اســت که از ماژول های DLLدیگر در این فایل درج شــده
است.
و . ...
آن چه گفته شده تو ضیح ب سیار مخت صری از اجزای موجود در ساختار فایل PEبود و
وارد بسیاری از جزئیات نشدیم .شکل 3-2نمایش یک فایل PEبه صورت کد HEXمی باشد که
بخش های گفته شده در آن م شخص شده اند .همان الور که پیدا ست این پایین ترین سطح
نمایشی از یک برنامه و در واقع نمایش در سطح ماشین است ( صفر و یک) .در بخش سو این
نوشتار یک فایل PEرا در عمل بررسی می کنیم.
6
بررسی ساختار فایل های PE
معرفی برنامه
در این قســمت یک برنامه بســیار کوچک به زبان C++در Win32می نویســیم و ســپس آن را
کامپایل می کنیم تا فایل اجرایی در قالب EXEتولید شـــود .در ادامه ســـاختار فایل EXEتولید
شده را که از قالب فایل های PEپیروی می کند برر سی می کنیم تا موارد شرح داده شده در
بخش 2این نوشتار را به صورت عملی مشاهده نماییم.
کد برنامه به صورت شکل 1-3است .برنامه در محیط Microsoft Visual Studio 2015نوشته
و کامپایل شده ا ست .دو ن سخه اجرایی 64و 32بیتی از برنامه ایجاد کرده ایم تا بتوانیم تفاوت
های ساختار فایل های PEدر نسخه های مختلف را بررسی کنیم.
7
PE بررسی ساختار فایل های
#include <iostream>
using namespace std;
void checkPrime(int n)
{
int flag = 1;
for (int i = 2; i*i < n && flag; i++)
{
if (!(n%i))
{
flag = 0;
}
}
if (!flag)
{
cout << "Is Not Prime!\n";
}
else
{
cout << "Is Prime!\n";
}
}
int main()
{
int n;
cout << "Enter Number: ";
cin >> n;
checkPrime(n);
system("pause");
return 0;
}
8
بررسی ساختار فایل های PE
فایل PEیک محتوی یک کد دودویی ا ست بنابراین از نوع متنی نی ست و نمی توان با ویرا ستار
های متنی آن را گ شود و ساختار آن را م شاهده کرد .اما می توان آن را با یک ویرای شگر فایل
های HEXیا همان باینری گ شود .برنامه های ب سیاری ه ستند که برای نمایش ساختار فایل PE
ا ستفاده می شوند و عالوه بر نمایش مقادیر دودویی اجزا را به صورت البقه بندی شده ن شان
داده و االالعات را از پیکره فایل PEبیرون می کشـــند .این برنامه ها عمدتا در امکاناتی نظیر
ج ست و جو و وا سط کاربر تفاوت هایی دارند .ما فهر ستی از برنامه ها را ت ست کردیم تا گزینه
بهتر را انتخاب کنیم؛ از جمله:
کلیه اجزای موجود در فایل های PEتوســط ســاختارهای برنامه نویســی زبان C/C++
تعریف می شوند .برای نمونه بخش DOS Headerبه صورت زیر در زبان Cتعریف می شود ،این
ساختار در داخل فایل سرایند WINNT.Hوجود دارد.
بدیهی ا ست که APIویندوز توابعی را برای کار با این داده ساختار ها تدارک دیده ا ست .برنامه
های نمایش ســاختار PEکه در باا به برخی از آن ها اشــاره شــد ،از چنین توابعی اســتفاده می
9
بررسی ساختار فایل های PE
کنند .بنابراین نو شتن یک برنامه که بتواند نمایش صحیحی از فایل PEارایه دهد کار ساده ای
است.
بخش DOS MZ Headerخالی است و تنها یک دستور پرش به F8که ابتدای PE File Header
ا ست دارد .االالعات شکل 3-3از شکل 4-3که معادل دودویی آن ا ست بیرون ک شیده شده
است.
10
بررسی ساختار فایل های PE
به همین ترتیب می توان سایر ق سمت های بخش دو این نو شتار را م شاهده کرد .به
عنوان مثال کد برنامه در .textو ثابت های رشــته ای در .rdataتعریف شــده اند .هنگامی که
برنامه اجرا می شــود ،پیا " "Enter Number:روی کنســول به نمایش در می آید .می خواهیم
محل این پیا را در فایل باینری بیابیم .در منوی سمت چپ روی .rdataدوبار کلیک می کنیم
تا محدوده مربوط به این Sectionدر کد باینری یافت شــود .حال این محدوده را مشــاهده می
کنیم.
چنان چه مشــاهده می شــود کلیه ثابت های رشــته ای برنامه در قالب کد اســکی و به
صــورت متوالی ذخیره شــده اند .ادرس محل ذخیره موجودیت غیر فعال (کد برنامه) نیز در این
قسمت وجود دارد.
11
بررسی ساختار فایل های PE
قالب فایل های اجرایی در ویندوزهای 64بیتی ( )x64نیز مانند ویندوز 32بیتی ( )x86همان
قالب فایل PEاست ،اما تفاوت هایی دارد .در این جا کشف این تفاوت ها یک نسخه 64بیتی از
برنامه بررسی اعداد اول که در قسمت قبل دیدیم را ایجاد می کنیم .سپس آن را در محیط ابزار
NikPEViewerباز می کنیم.
اولین تفاوت در حجم ن سخه های 32بیتی و 64بیتی ا ست .ن سخه 64بیتی ما حدودا
1کیلوبایت از نسخه 32بیتی ،بزرگتر است ( 13کیلوبایت در مقابل 12کیلوبایت).
12
بررسی ساختار فایل های PE
نتیجه گیری
از ابزار NikPEViewerتفاوت های بیش تری را نمی توان تشــخیص داد .با اســتفاده از
ابزار IDA Proمشاهده می شود از آن جایی که برنامه از نوع Win32می باشد لذا در نسخه 64
بیتی نیز همچنان از ثبات های 32بیتی اســتفاده شــده اســت و از این لحاظ مزیتی ندارد .می
توان این نتیجه را گرفت که با وجود تفاوت های جزیی ساختار کلی همان ساختار PEا ست و
در واقع برای به حداکثر ر سانی قابلیت حمل این فایل ها تفاوت ا سا سی در آن ها ایجاد ن شده
است.
4منابع و ماخذ
13