در دنیای کامپیوتر، همه چیز در نهایت به فایلها ختم میشه. از عکسهایی که میبینیم، تا برنامه هایی که اجرا میکنیم، همه در قالب فایلهایی با ساختار مشخص ذخیره میشن.
این ساختارها که با نام فرمت فایل (File Format) شناخته میشن، تعیین میکنن که دادههای داخل فایل چطوری تفسیر و پردازش بشن.
هر فایل، صرفنظر از نوعش (تصویر، متن، موسیقی یا برنامه)، از یک ساختار مشخص تبعیت میکنه. برای مثال، فایلهای تصویری ممکنه فرمتهایی مانند JPEG یا PNG داشته باشن. فایلهای صوتی ممکنه بصورت MP3 یا WAV ذخیره بشن. اما وقتی صحبت از برنامههای اجرایی در سیستم عامل ویندوز میشه، با فرمتی بنام PE (Portable Executable) مواجه هستیم.
فرمت PE پایه و اساس تمامی فایلهای اجرایی در ویندوز هستش. از فایلهای exe و dll گرفته تا sys و حتی بسیاری از فایلهایی که در پسزمینه اجرا میشن.
درک ساختار این فرمت نه تنها برای توسعهدهندگان نرمافزار، بلکه برای علاقهمندان به امنیت سایبری، مهندسین معکوس نرم افزار، آنالیز بدافزار و تحلیلگران سیستمهای ویندوز اهمیت حیاتی داره.
در این آموزشی و عملی، بصورت قدم به قدم با ساختار فایلهای PE آشنا میشیم. این دوره با محوریت امنیت سایبری تهیه شده، بنابراین برای تیم های قرمز، تیم های آبی، علاقمندان به امنیت سایبری کاربردی هستش.
در کل دوره در 2 فصل ارائه میشه. در فصل اول با ساختار فایلهای PE آشنا میشیم، بعد از آشنایی اولیه، در فصل دوم میریم و از این مواردی که یاد گرفتیم، در پروژه های عملی استفاده میکنیم.
اگه به دنیای امنیت سایبری، بخصوص دنیای باینری علاقمند هستید، میتونید دوره رایگان مهندسی معکوس نرم افزار رو که شامل 32 ویدیو و بیش از 21 ساعت فیلم آموزشی هستش رو هم مشاهده کنید.
وضعیت دوره: در حال پخش فصل اول (شروع از 10 مرداد 1404)
زمان انتشار: بصورت هفتگی ( سعی میکنم هر هفته، جمعه منتشر کنیم)
آخرین بروزرسانی: 25-7-1404
قسمت صفر: معرفی دوره
در این ویدیو به معرفی دوره ی رایگان بررسی ساختار فایلهای PE و ابزارهای مورد نیاز این دوره پرداختیم و در ادامه نگاه کلی به ساختار فایلهای PE، تفاوت بین PE و COFF، اهمیت یادگیری ساختار فایلهای PE، تفاوت PE روی مموری و دیسک، تفاوت بین Module و Process انداختیم و با مفاهیمی مانند آفست (Offset)، آدرس مجازی (Virtual Address) و آدرس مجازی نسبی (Relative Virtual Address) آشنا شدیم. [مشاهده در یوتیوب – اسلایدها]
قسمت اول: بررسی DOS Header
در این قسمت رفتیم سراغ DOS HEADER و دو تا فیلد مهم این هدر یعنی، e_magic و e_lfanew رو بررسی کردیم. در ادامه e_magic رو بعنوان شناساگر در نظر گرفتیم و ازش در رولهای یارا (YARA) استفاده کردیم. این قضیه رو در YaraX بررسی کردیم، یک برنامه در پایتون با کتابخونه ی Yara python نوشتیم و همچنین بخش YARA رو در Detect It Easy بررسی کردیم. کدهای PE Parser رو برای بخش DOS Header تکمیل کردیم. در این قسمت PE Parser رو در پایتون و سی پلاس توسعه دادیم. در نهایت روش بررسی ساختار PE در ابزارهای x64dbg و IDA Pro و Windbg رو معرفی کردیم. [مشاهده در یوتیوب – اسلایدها و کدها ]
قسمت دوم: بررسی DOS STUB
در این قسمت، DOS STUB رو بررسی کردیم. بطور کلی DOS STUB رو معرفی و ساختارش رو استخراج کردیم و در CMD، DOS BOX، PE Bear و IDA Pro بررسیش کردیم. در ادامه به کمک OPENWATCOM یه برنامه ی DOS توسعه دادیم و بجای DOS STUB معمول، داخل فایل PE قرار دادیم. در نهایت این بخش رو هم به PE Parser اضافه کردیم. [مشاهده در یوتیوب – اسلایدها و کدها]
قسمت سوم: RICH HEADER
در ادامه بررسی فایلهای PE، این جلسه ساختار Rich Header رو معرفی و در PE Bear بررسیش کردیم و در ادامه این بخش رو هم به PE Parser اضافه کردیم. در نهایت نگاهی به نحوه سوء استفاده از این هدر در OlympicDestroyer انداختیم. [مشاهده در یوتیوب – اسلایدها و کدها]
قسمت چهارم: NT Headers بخش Signature
در این قسمت NT Headers رو بررسی کردیم که از سه بخش Signature و File Header و Optional Header تشکیل شده و بصورت ویژه ساختار Signature رو آنالیز کردیم. این بخش چون ویژگی امضاء رو داره، بنابراین ابزار معروف Suricata رو نصب و پیکربندی کردیم و با نوشتن رول در این ابزار، به شناسایی Signature در ترافیک دانلودی پرداختیم. در نهایت این بخش رو به PE Parser اضافه کردیم. [مشاهده در یوتیوب – اسلایدها و کدها]
قسمت پنجم: NT Headers بخش File Header
در ادامه بررسی NT Headers، در این قسمت رفتیم سراغ File Header. این هدر از فیلدهای Machine و NumberOfSections و TimeDateStamp و PointerToSymbolTable و NumberOfSymbols و SizeOfOptionalHeader و Characteristics تشکیل شده، همه ی این موارد رو بررسی کردیم و در نهایت این هدر رو هم به PE Parser اضافه کردیم. [مشاهده در یوتیوب – اسلایدها و کدها]
قسمت ششم: NT Headers بخش اول Optional Header
در این قسمت Optional Header رو معرفی و فیلدهای Magic و MajorLinkerVersion و MinorLinkerVersion و SizeOfCode و SizeOfInitializedData و SizeOfUninitializedData و AddressOfEntryPoint و BaseOfCode و BaseOfData و ImageBase رو معرفی و در PE Bear بررسیشون کردیم. بقیه فیلدهارو در جلسات بعدی بررسی میکنیم. در ادامه در ویژوال استدیو 2022 بخشی با عنوان BSS ایجاد و در x64dbg بررسی کردیم. پکر UPX رو معرفی کردیم. فیلدهای AddressOfEntryPoint و ImageBase رو در x64dbg و windbg و IDA Pro بررسی کردیم. ابزار Editbin رو معرفی و ازش برای تغییر ImageBase استفاده کردیم و در نهایت به کمک این فیلد IDA Pro و x64dbg رو با هم سینک کردیم. [مشاهده در یوتیوب – اسلایدها و کدها]
قسمت هفتم: NT Headers بخش دوم Optional Header
در ادامه بررسی NT Headers، این جلسه هم بررسی Optional Header رو ادامه میدیم و فیلدهای SectionAlignment و FileAlignment و Major/Minor OperatingSystemVersion و Major/Minor ImageVersion و Major/Minor SubsystemVersion و Win32VersionValue و SizeOfImage و SizeOfHeaders و Checksum و Subsystem رو معرفی و تک تک در PE Bear بررسی میکنیم. همچنین بررسی میکنیم چطوری میتونیم فیلدهای Major/Minor OperatingSystemVersion و Major/Minor ImageVersion و Major/Minor SubsystemVersion و Subsystem رو در ویژوال استدیو 2022 تغییر بدیم، مقدار SizeOfHeaders رو محاسبه و Checksum رو با Editbin و MapFileAndCheckSumA بررسی کنیم. [مشاهده در یوتیوب – اسلایدها]
قسمت هشتم: NT Headers بخش سوم Optional Header
در ادامه بررسی Optional Header، این جلسه رفتیم سراغ فیلد DLL Characteristics. این فیلد از چندین فلگ تشکیل شده که این جلسه و جلسه بعدی در موردشون صحبت میکنیم.
این جلسه فلگ های HIGH_ENTROPY_VA و DYNAMIC_BASE و FORCE_INTEGRITY و NX_COMPAT رو معرفی و در ادامه در PE Bear و ویژوال استدیو 2022 بررسیشون میکنیم. [مشاهده در یوتیوب – اسلایدها]
قسمت نهم: NT Headers بخش چهارم Optional Header
در ادامه بررسی فلگهای DLL Characteristics این جلسه فلگ های زیر رو معرفی و در Pe Bear و ویژوال استدیو 2022 بررسی کردیم:
- IMAGE_DLLCHARACTERISTICS_NO_SEH
- IMAGE_DLLCHARACTERISTICS_APPCONTAINER
- IMAGE_DLLCHARACTERISTICS_GUARD_CF
- IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
- IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
قسمت دهم: NT Headers بخش پنجم (آخر) Optional Header
این جلسه آخرین قسمت از بررسی Optional Header هستش و بالاخره این هدر رو تموم میکنیم. در این قسمت فیلدهای SizeOfStackReserve/Commit و SizeOfHeapReserve/Commit و LoaderFlags و NumberOfRvaAndSizes و DataDirectory رو معرفی و در PE Bear و VS2022 بررسیشون کردیم. همچنین با مفاهیم Reserve و Commit و Main Thread یا ترد اصلی و Stack و Heap و Default Process Heap آشنا شدیم و با CreateThread و VMMAP و GetProcessHeap و HeapCreate کار کردیم. از x64dbg و دستورات teb! و peb! و heap! و Address! و ~ در windbg استفاده کردیم. در نهایت PE Parser، که با کتابخونه ی Lief در پایتون توسعه میدادیم رو برای قسمت Optional Header هم تکمیل میکنیم. [مشاهده در یوتیوب – اسلاید و کدها]
قسمت یازدهم: Section Headers
در این قسمت Section Table و Section Headers رو معرفی کردیم و فیلدهای Section Header که شامل NAME و PhysicalAddress و VirtualSize و VirtualAddress و SizeOfRawData و PointerToRawData و PointerToRelocations و NumberOfRelocations و PointerToLineNumbers و NumberOfLineNumbers و Characteristics میشه رو معرفی و در PE Bear بررسی کردیم. همچنین در ویژوال استدیو 2022، یک section دلخواه اضافه کردیم و اسم یک Section رو تغییر دادیم. یسری از فیلدهارو در x64dbg هم بررسی کردیم. در نهایت Section Headers رو هم به پروژه ی PE Parser، که در پایتون و با کتابخونه ی LIEF توسعه میدیم، اضافه کردیم. [مشاهده در یوتیوب – اسلایدها و کدها]