https://medium.com/@fedoraman/kashi-ctf-2025-reverse-engineering-writeup-painfully-slow-f44819a16894
Medium
Kashi CTF 2025 Reverse Engineering Writeup “Painfully Slow”
Greetings, my name is fedoraman737, and I am the leader of our CTF team noscriptd “Fedoraman Project” . Our team has participated in Kashi CTF…
تحلیل ساختار فایلهای اجرایی PE در ویندوز
باید بدونید که فایلهای اجرایی (EXE، DLL و...) چجوری ساخته میشن و چطور داخل حافظه لود میشن چون مهندسی معکوس بیشتر روی این فایلها انجام میشه فهمیدن ساختارشون خیلی مهمه
فرمتهای مختلف فایلهای اجرایی
وقتی یه برنامه رو توی ویندوز یا لینوکس اجرا میکنید اون فایل اجرایی توی حافظه لود میشه فایلهای اجرایی توی سیستمعاملهای مختلف فرمتهای متفاوتی دارن:
PE (Portable Executable) → مخصوص ویندوز
ELF (Executable and Linkable Format) → مخصوص لینوکس و اندروید
Mach-O → مخصوص macOS و iOS
2. ساختار فایل PE در ویندوز (EXE و DLL)
هر فایل اجرایی در ویندوز یه فرمت استاندارد به اسم PE (Portable Executable) داره این فرمت برای EXEها و DLLها استفاده میشن
ساختار کلی یک فایل PE :
| DOS Header |
اطلاعات ابتدایی (شاملMZ Signature) |
| PE Header | اطلاعات کلی فایل اجرایی |
| Section Table | فهرست سکشنهای فایل (کد، داده، منابع و ...) |
| Sections | بخشهای مختلف برنامه (کد اسمبلی، دادهها و ...) |
با ابزار CFF Explorer یا PEview میتونید این اطلاعات رو ببینید
بخشهای مهم در فایل PE
1 DOS Header:
اولین قسمت فایل PE هست و همیشه با MZ Signature شروع میشه این بخش قدیمیه و برای سازگاری با DOS استفاده میشه
2 PE Header (NT Headers):
این قسمت شامل اطلاعات کلی درباره فایل اجراییه مثل:
نوع پردازنده (32 یا 64 بیت)
تعداد سکشنها
آدرس نقاط ورود (Entry Point)
3 Section Table (جدول سکشنها):
فایل PE به چند سکشن (بخش) تقسیم میشه. هر سکشن یه هدف خاص داره:
توی مهندسی معکوس معمولا کد مخرب یا مکانیزمهای کرک در سکشن .text یا .data قرار دارن
4 Import Table (جدول ایمپورتها):
این جدول نشون میده که برنامه از کدوم DLLها و APIها استفاده میکنه برای مهندسی معکوس خیلی مهمه چون میتونی بفهمی که یه برنامه چجوری کار میکنه
5 Entry Point :
این آدرسیه که برنامه از اونجا اجرا میشه توی دیباگر (مثلاً x64dbg) این نقطه همونجاییه که اولین دستور اسمبلی اجرا میشه
باید بدونید که فایلهای اجرایی (EXE، DLL و...) چجوری ساخته میشن و چطور داخل حافظه لود میشن چون مهندسی معکوس بیشتر روی این فایلها انجام میشه فهمیدن ساختارشون خیلی مهمه
فرمتهای مختلف فایلهای اجرایی
وقتی یه برنامه رو توی ویندوز یا لینوکس اجرا میکنید اون فایل اجرایی توی حافظه لود میشه فایلهای اجرایی توی سیستمعاملهای مختلف فرمتهای متفاوتی دارن:
PE (Portable Executable) → مخصوص ویندوز
ELF (Executable and Linkable Format) → مخصوص لینوکس و اندروید
Mach-O → مخصوص macOS و iOS
2. ساختار فایل PE در ویندوز (EXE و DLL)
هر فایل اجرایی در ویندوز یه فرمت استاندارد به اسم PE (Portable Executable) داره این فرمت برای EXEها و DLLها استفاده میشن
ساختار کلی یک فایل PE :
| DOS Header |
اطلاعات ابتدایی (شاملMZ Signature) |
| PE Header | اطلاعات کلی فایل اجرایی |
| Section Table | فهرست سکشنهای فایل (کد، داده، منابع و ...) |
| Sections | بخشهای مختلف برنامه (کد اسمبلی، دادهها و ...) |
با ابزار CFF Explorer یا PEview میتونید این اطلاعات رو ببینید
بخشهای مهم در فایل PE
1 DOS Header:
اولین قسمت فایل PE هست و همیشه با MZ Signature شروع میشه این بخش قدیمیه و برای سازگاری با DOS استفاده میشه
2 PE Header (NT Headers):
این قسمت شامل اطلاعات کلی درباره فایل اجراییه مثل:
نوع پردازنده (32 یا 64 بیت)
تعداد سکشنها
آدرس نقاط ورود (Entry Point)
3 Section Table (جدول سکشنها):
فایل PE به چند سکشن (بخش) تقسیم میشه. هر سکشن یه هدف خاص داره:
توی مهندسی معکوس معمولا کد مخرب یا مکانیزمهای کرک در سکشن .text یا .data قرار دارن
4 Import Table (جدول ایمپورتها):
این جدول نشون میده که برنامه از کدوم DLLها و APIها استفاده میکنه برای مهندسی معکوس خیلی مهمه چون میتونی بفهمی که یه برنامه چجوری کار میکنه
5 Entry Point :
این آدرسیه که برنامه از اونجا اجرا میشه توی دیباگر (مثلاً x64dbg) این نقطه همونجاییه که اولین دستور اسمبلی اجرا میشه
👍5🔥1
ChaCha20 or Salsa20
یک الگوریتم رمزنگاریه که برای امنیت بالا و سرعت زیاد طراحی شده باهاش میشه دادهها رو رمزگذاری کرد تا کسی بدون کلید نتونه بخونه این الگوریتم جایگزین خوبی برای AES هست مخصوصاً توی موبایلها و پردازندههایی که سختافزار مخصوص رمزنگاری ندارن
چطوری کار میکنه؟
ChaCha20 یه جور رمزنگاری جریانیه، یعنی دادهها رو دونهدونه رمز میکنه نه بهصورت بلوکهای بزرگ
ورودیهاش چیه؟
یه کلید 256 بیتی همون رمز اصلی
یه مقدار تصادفی Nonce برای جلوگیری از تکراری شدن رمزها
یه شمارنده که توی هر بلاک تغییر میکنه
چی کار میکنه؟
چند تا عملیات ریاضی ساده مثل جمع XOR و چرخش بیتی روی دادهها انجام میده
این عملیات 20 بار تکرار میشه تا یه سری اعداد تصادفی قوی تولید کنه
این اعداد با متن اصلی ترکیب میشن و دادهی رمزگذاریشده تولید میشه
چرا از ChaCha20 استفاده کنیم؟
سریعتره چون نیاز به محاسبات پیچیدهی AES نداره
امنیت بالایی داره و در برابر حملات رمزنگاری مقاومه
روی موبایل و دستگاههای کمقدرت بهتر کار میکنه، چون نیاز به سختافزار خاصی نداره
در برابر حملات جانبی مثل حملات کش CPU امن تره
کجاها ازش استفاده میشه؟
توی HTTPS امن کردن اینترنت
توی WireGuard VPN برای اتصال امن
توی OpenSSH برای ارتباطات رمزگذاریشده
توی Google QUIC که اینترنت رو سریعتر و امنتر میکنه
یک الگوریتم رمزنگاریه که برای امنیت بالا و سرعت زیاد طراحی شده باهاش میشه دادهها رو رمزگذاری کرد تا کسی بدون کلید نتونه بخونه این الگوریتم جایگزین خوبی برای AES هست مخصوصاً توی موبایلها و پردازندههایی که سختافزار مخصوص رمزنگاری ندارن
چطوری کار میکنه؟
ChaCha20 یه جور رمزنگاری جریانیه، یعنی دادهها رو دونهدونه رمز میکنه نه بهصورت بلوکهای بزرگ
ورودیهاش چیه؟
یه کلید 256 بیتی همون رمز اصلی
یه مقدار تصادفی Nonce برای جلوگیری از تکراری شدن رمزها
یه شمارنده که توی هر بلاک تغییر میکنه
چی کار میکنه؟
چند تا عملیات ریاضی ساده مثل جمع XOR و چرخش بیتی روی دادهها انجام میده
این عملیات 20 بار تکرار میشه تا یه سری اعداد تصادفی قوی تولید کنه
این اعداد با متن اصلی ترکیب میشن و دادهی رمزگذاریشده تولید میشه
چرا از ChaCha20 استفاده کنیم؟
سریعتره چون نیاز به محاسبات پیچیدهی AES نداره
امنیت بالایی داره و در برابر حملات رمزنگاری مقاومه
روی موبایل و دستگاههای کمقدرت بهتر کار میکنه، چون نیاز به سختافزار خاصی نداره
در برابر حملات جانبی مثل حملات کش CPU امن تره
کجاها ازش استفاده میشه؟
توی HTTPS امن کردن اینترنت
توی WireGuard VPN برای اتصال امن
توی OpenSSH برای ارتباطات رمزگذاریشده
توی Google QUIC که اینترنت رو سریعتر و امنتر میکنه
👍5
ساختار فایل ELF در لینوکس
ELF (Executable and Linkable Format)
فرمت استاندارد فایلهای اجرایی در لینوکس و اندرویده ساختار ELF کمی متفاوت از PE هست ولی اصولش شبیه به همه
ساختار کلی یک فایل ELF:
| بخش | توضیح |
| ELF Header | اطلاعات کلی فایل اجرایی |
| Program Header Table | مشخصات سکشنهای اجرایی |
| Section Header Table | اطلاعات سکشنهای برنامه |
| Sections | بخشهای مختلف برنامه (کد، داده، منابع) |
با ابزار readelf یا objdump میتونید این اطلاعات رو ببینید
بخشهای مهم در فایل ELF
1 ELF Header:
شامل اطلاعات کلی فایل مثل نوع پردازنده نوع باینری (32 یا 64 بیت) و نقطه ورود (Entry Point)
2 Program Header Table:
این قسمت برای لود کردن فایل در حافظه استفاده میشه شامل ادرسهایی که باید به RAM منتقل بشن
3 Section Header Table (جدول سکشنها):
مثل PE فایلهای ELF هم چندین سکشن دارن:
4 Symbol Table:
اگه یه برنامه با دیباگ اطلاعات کامپایل شده باشه، توی این بخش اسم متغیرها و توابع رو میتونید ببینید
مقایسه PE و ELF در مهندسی معکوس
مهندسی معکوس در ویندوز معمولا روی PE و در لینوکس روی ELF انجام میشه، ولی اصول کلیشون شبیه به همه
ارتباط این اطلاعات با مهندسی معکوس
اگر بخواید کرک کنید یا آنپک کنید: باید Entry Point، Import Table و سکشنهای text. و data. رو بررسی کنید
اگر بخواید بدافزار انالیز کنید: باید ببینید که از چه APIهایی استفاده میکنه (Import Table یا PLT/GOT در ELF)
اگر بخواید یه برنامه رو دیباگ کنید: باید بدونید که کد اجرایی داخل text. هست و مقدار متغیرها توی data. ذخیره میشه
فایلهای اجرایی در ویندوز (PE) و لینوکس (ELF) ساختار خاصی دارن
PE شامل سکشنهایی مثل .text (کد برنامه) و .data (متغیرها) هست
ELF هم سکشنهای مشابهی داره ولی مکانیزم ایمپورتها در اون متفاوته
برای انالیز PE از ابزارهایی مثل PEview و برای ELF از readelf استفاده میشه
ELF (Executable and Linkable Format)
فرمت استاندارد فایلهای اجرایی در لینوکس و اندرویده ساختار ELF کمی متفاوت از PE هست ولی اصولش شبیه به همه
ساختار کلی یک فایل ELF:
| بخش | توضیح |
| ELF Header | اطلاعات کلی فایل اجرایی |
| Program Header Table | مشخصات سکشنهای اجرایی |
| Section Header Table | اطلاعات سکشنهای برنامه |
| Sections | بخشهای مختلف برنامه (کد، داده، منابع) |
با ابزار readelf یا objdump میتونید این اطلاعات رو ببینید
بخشهای مهم در فایل ELF
1 ELF Header:
شامل اطلاعات کلی فایل مثل نوع پردازنده نوع باینری (32 یا 64 بیت) و نقطه ورود (Entry Point)
2 Program Header Table:
این قسمت برای لود کردن فایل در حافظه استفاده میشه شامل ادرسهایی که باید به RAM منتقل بشن
3 Section Header Table (جدول سکشنها):
مثل PE فایلهای ELF هم چندین سکشن دارن:
4 Symbol Table:
اگه یه برنامه با دیباگ اطلاعات کامپایل شده باشه، توی این بخش اسم متغیرها و توابع رو میتونید ببینید
مقایسه PE و ELF در مهندسی معکوس
مهندسی معکوس در ویندوز معمولا روی PE و در لینوکس روی ELF انجام میشه، ولی اصول کلیشون شبیه به همه
ارتباط این اطلاعات با مهندسی معکوس
اگر بخواید کرک کنید یا آنپک کنید: باید Entry Point، Import Table و سکشنهای text. و data. رو بررسی کنید
اگر بخواید بدافزار انالیز کنید: باید ببینید که از چه APIهایی استفاده میکنه (Import Table یا PLT/GOT در ELF)
اگر بخواید یه برنامه رو دیباگ کنید: باید بدونید که کد اجرایی داخل text. هست و مقدار متغیرها توی data. ذخیره میشه
فایلهای اجرایی در ویندوز (PE) و لینوکس (ELF) ساختار خاصی دارن
PE شامل سکشنهایی مثل .text (کد برنامه) و .data (متغیرها) هست
ELF هم سکشنهای مشابهی داره ولی مکانیزم ایمپورتها در اون متفاوته
برای انالیز PE از ابزارهایی مثل PEview و برای ELF از readelf استفاده میشه
👍4❤1
ابزارهای آنپکینگ و بایپس Obfuscation
خیلی از برنامههای پولی و بدافزارها پک یا مبهمسازی (Obfuscation) میشن تا مهندسی معکوسشون سخت بشه این ابزارها کمک میکنن که اونها رو آنپک کنید
UPX یه ابزار رایج برای فشردهسازی و آنپک کردن فایلها
Detect It Easy (DIE) تشخیص پکینگ و کامپایلرهای فایلهای اجرایی
x64dbg (با پلاگین Scylla) آنپک کردن فایلهای پکشده
Unpacker.me یه سرویس آنلاین برای آنپک کردن بعضی باینریها
وقتی برنامهای که داری بررسی میکنی کدش به نظر عجیب و مبهم میاد یا وقتی اجرا میشه خودش رو از حالت فشرده خارج میکنه
خیلی از برنامههای پولی و بدافزارها پک یا مبهمسازی (Obfuscation) میشن تا مهندسی معکوسشون سخت بشه این ابزارها کمک میکنن که اونها رو آنپک کنید
UPX یه ابزار رایج برای فشردهسازی و آنپک کردن فایلها
Detect It Easy (DIE) تشخیص پکینگ و کامپایلرهای فایلهای اجرایی
x64dbg (با پلاگین Scylla) آنپک کردن فایلهای پکشده
Unpacker.me یه سرویس آنلاین برای آنپک کردن بعضی باینریها
وقتی برنامهای که داری بررسی میکنی کدش به نظر عجیب و مبهم میاد یا وقتی اجرا میشه خودش رو از حالت فشرده خارج میکنه
👏2❤1
Practical_Binary_Analysis_Build_Your_Own_Linux_Tools_for_Binary.pdf
33.5 MB
کتاب Practical Binary Analysis نوشته Dennis Andriesse یکی از منابع عالی برای یادگیری مهندسی معکوس، تحلیل باینری و امنیت نرمافزار است این کتاب بهطور عملی و از پایه تحلیل باینری رو توضیح میده و به موضوعاتی مثل دیساسمبلی دیباگینگ مهندسی معکوس و تحلیل آسیبپذیریها رو میگه
موضوعات کلیدی کتاب:
مقدمهای بر معماری کامپیوتر و پردازندهها
کار با ابزارهای دیساسمبلر و دیباگر
مهندسی معکوس برنامههای کامپایلشده
تحلیل باینریها بدون نیاز به سورس کد
مفاهیم امنیتی مثل اکسپلویتنویسی و بایپس مکانیزمهای حفاظتی
موضوعات کلیدی کتاب:
مقدمهای بر معماری کامپیوتر و پردازندهها
کار با ابزارهای دیساسمبلر و دیباگر
مهندسی معکوس برنامههای کامپایلشده
تحلیل باینریها بدون نیاز به سورس کد
مفاهیم امنیتی مثل اکسپلویتنویسی و بایپس مکانیزمهای حفاظتی
❤10🔥1👏1
تحلیل ساختار فایلهای Mach-O (macOS و iOS)
بعد از بررسی PE (ویندوز) و ELF (لینوکس) حالا بریم سراغ Mach-O (Mach Object) که فرمت فایل اجرایی در macOS و iOS هست این فرمت روی مکبوک آیفون آیپد و اپل واچ استفاده میشه و اگر بخوای مهندسی معکوس روی اپلیکیشنهای macOS یا iOS انجام بدی، باید این ساختار رو بشناسی
1 Mach-O چیست؟
Mach-O یه فرمت فایل اجراییه که در سیستمعاملهای macOS و iOS استفاده میشه این فرمت جایگزین a.out شد و شبیه ELF در لینوکس کار میکنه، اما یک سری تفاوت داره
فایلهای Mach-O میتونن این نوعها رو داشته باشن:
Executable:
فایلهای اجرایی که میتونی مستقیماً اجرا کنی
Dylib (Dynamic Library):
مشابه DLL در ویندوز یا .so در لینوکس، برای کتابخانههای داینامیک
Bundle:
برای پلاگینهای macOS (مثلاً پلاگینهای Xcode)
Object Files:
فایلهای شیء که قبل از لینک شدن استفاده میشن
اپلیکیشنهای iOS معمولا به شکل Mach-O کامپایل میشن و داخل فایل IPA قرار میگیرن
2 ساختار کلی فایل Mach-O
فایلهای Mach-O سه بخش اصلی دارن:
برخلاف PE و ELF که سکشنهای مشخصی دارن Mach-O از یک سیستم انعطافپذیرتر به نام "Load Commands" استفاده میکنه
3 Mach Header (هدر اصلی Mach-O)
Mach Header اولین بخش فایل هست که مشخص میکنه این فایل چی هست و روی چه پردازندهای اجرا میشه
اطلاعات داخل Mach Header:
Magic Number امضای فایل Mach-O (برای شناسایی نوع فایل)
CPU Type مشخص میکنه این فایل برای چه پردازندهای هست (Intel x86_64 ARM64 و ...)
File Type مشخص میکنه که این فایل اجرایی کتابخانه یا فایل آبجکت هست
Number of Load Commands تعداد کامندهای لود در فایل
Magic Number در Mach-O:
| مقدار | توضیح |
0xfeedface Mach-O 32-bit
0xfeedfacf Mach-O 64-bit
0xcafebabe Fat Binary (برای اجرا روی چند CPU)
Fat Binary چیه؟
Fat Binary یه نوع خاص از Mach-O هست که میتونه کدهای چندین معماری مختلف رو داخل یک فایل داشته باشه مثلا یه برنامه که هم روی Intel و هم روی ARM (Apple Silicon) اجرا بشه
4 Load Commands (دستورات لود)
بعد از Mach Header یه لیست از Load Commands داریم که مشخص میکنه سیستمعامل چطور این فایل رو در حافظه لود کنه
مهمترین Load Commandها
LC_SEGMENT_64 | تعریف یک Segment (بخش حافظهای)
LC_LOAD_DYLIB لود کردن یک کتابخانه داینامیک (Dylib)
LC_MAIN مشخص کردن نقطه ورود برنامه
LC_SYMTAB | جدول نمادها (برای دیباگ و سمبلها)
مثلاً اگه برنامه از یک DLL خارجی استفاده کنه Load Command مربوط به LC_LOAD_DYLIB نشون میده که کدوم کتابخونهها باید لود بشن
5 Segments & Sections (کد، دادهها و سکشنها)
بعد از Load Commands میرسیم به بخش اصلی فایل که شامل Segments & Sections هست این بخش دقیقا مشابه سکشنهای .text، .data و ... در PE و ELF عمل میکنه
مهمترین Segments در Mach-O:
Segment | توضیح
__TEXT | شامل کد اجرایی برنامه (مشابه .text در PE/ELF)
__DATA | شامل متغیرهای استاتیک (مشابه .data در PE/ELF)
__LINKEDIT | شامل اطلاعات مربوط به لینک شدن (مشابه Symbol Table در ELF)
مهمترین Sections در Mach-O:
| Section | داخل کدوم Segment توضیح |
| text | TEXT | شامل کد اسمبلی اجرایی برنامه
| cstring | TEXT | شامل رشتههای متنی برنامه |
| data | DATA | شامل متغیرهای مقداردهی شده
| bss | DATA | شامل متغیرهای مقداردهی نشده |
مهندسی معکوس در Mach-O بیشتر روی TEXT و DATA انجام میشه،چون کد و متغیرهای مهم اینجا هستن
6 مقایسه Mach-O با PE و ELF
Mach-O انعطافپذیرتر از PE و ELF هست، ولی بررسیش سختتره چون Load Commands به جای Section Table استفاده میشن
7 کاربرد Mach-O در مهندسی معکوس
اگر بخوای کرک کنی یا بایپس کنی:
باید __TEXT (کد برنامه) و LC_LOAD_DYLIB (وابستگی به کتابخانهها) رو بررسی کنی
اگر بخوای اپلیکیشنهای iOS مهندسی معکوس کنی:
باید با Mach-O و ابزارهایی مثل Hopper، Ghidra، otool و jtool کار کنی
اگر بخوای دیباگ کنی: باید بدونی که متغیرها توی DATA و کد داخل TEXT هستن
ساختارش شامل Mach Header Load Commands و Segments هست
نقطه ورود (Entry Point) در LC_MAIN تعریف میشه
کد برنامه در TEXT و متغیرها در DATA قرار دارن
برای بررسی Mach-O از ابزارهایی مثل otool, jtool, Hopper, و Ghidra استفاده میشه
بعد از بررسی PE (ویندوز) و ELF (لینوکس) حالا بریم سراغ Mach-O (Mach Object) که فرمت فایل اجرایی در macOS و iOS هست این فرمت روی مکبوک آیفون آیپد و اپل واچ استفاده میشه و اگر بخوای مهندسی معکوس روی اپلیکیشنهای macOS یا iOS انجام بدی، باید این ساختار رو بشناسی
1 Mach-O چیست؟
Mach-O یه فرمت فایل اجراییه که در سیستمعاملهای macOS و iOS استفاده میشه این فرمت جایگزین a.out شد و شبیه ELF در لینوکس کار میکنه، اما یک سری تفاوت داره
فایلهای Mach-O میتونن این نوعها رو داشته باشن:
Executable:
فایلهای اجرایی که میتونی مستقیماً اجرا کنی
Dylib (Dynamic Library):
مشابه DLL در ویندوز یا .so در لینوکس، برای کتابخانههای داینامیک
Bundle:
برای پلاگینهای macOS (مثلاً پلاگینهای Xcode)
Object Files:
فایلهای شیء که قبل از لینک شدن استفاده میشن
اپلیکیشنهای iOS معمولا به شکل Mach-O کامپایل میشن و داخل فایل IPA قرار میگیرن
2 ساختار کلی فایل Mach-O
فایلهای Mach-O سه بخش اصلی دارن:
برخلاف PE و ELF که سکشنهای مشخصی دارن Mach-O از یک سیستم انعطافپذیرتر به نام "Load Commands" استفاده میکنه
3 Mach Header (هدر اصلی Mach-O)
Mach Header اولین بخش فایل هست که مشخص میکنه این فایل چی هست و روی چه پردازندهای اجرا میشه
اطلاعات داخل Mach Header:
Magic Number امضای فایل Mach-O (برای شناسایی نوع فایل)
CPU Type مشخص میکنه این فایل برای چه پردازندهای هست (Intel x86_64 ARM64 و ...)
File Type مشخص میکنه که این فایل اجرایی کتابخانه یا فایل آبجکت هست
Number of Load Commands تعداد کامندهای لود در فایل
Magic Number در Mach-O:
| مقدار | توضیح |
0xfeedface Mach-O 32-bit
0xfeedfacf Mach-O 64-bit
0xcafebabe Fat Binary (برای اجرا روی چند CPU)
Fat Binary چیه؟
Fat Binary یه نوع خاص از Mach-O هست که میتونه کدهای چندین معماری مختلف رو داخل یک فایل داشته باشه مثلا یه برنامه که هم روی Intel و هم روی ARM (Apple Silicon) اجرا بشه
4 Load Commands (دستورات لود)
بعد از Mach Header یه لیست از Load Commands داریم که مشخص میکنه سیستمعامل چطور این فایل رو در حافظه لود کنه
مهمترین Load Commandها
LC_SEGMENT_64 | تعریف یک Segment (بخش حافظهای)
LC_LOAD_DYLIB لود کردن یک کتابخانه داینامیک (Dylib)
LC_MAIN مشخص کردن نقطه ورود برنامه
LC_SYMTAB | جدول نمادها (برای دیباگ و سمبلها)
مثلاً اگه برنامه از یک DLL خارجی استفاده کنه Load Command مربوط به LC_LOAD_DYLIB نشون میده که کدوم کتابخونهها باید لود بشن
5 Segments & Sections (کد، دادهها و سکشنها)
بعد از Load Commands میرسیم به بخش اصلی فایل که شامل Segments & Sections هست این بخش دقیقا مشابه سکشنهای .text، .data و ... در PE و ELF عمل میکنه
مهمترین Segments در Mach-O:
Segment | توضیح
__TEXT | شامل کد اجرایی برنامه (مشابه .text در PE/ELF)
__DATA | شامل متغیرهای استاتیک (مشابه .data در PE/ELF)
__LINKEDIT | شامل اطلاعات مربوط به لینک شدن (مشابه Symbol Table در ELF)
مهمترین Sections در Mach-O:
| Section | داخل کدوم Segment توضیح |
| text | TEXT | شامل کد اسمبلی اجرایی برنامه
| cstring | TEXT | شامل رشتههای متنی برنامه |
| data | DATA | شامل متغیرهای مقداردهی شده
| bss | DATA | شامل متغیرهای مقداردهی نشده |
مهندسی معکوس در Mach-O بیشتر روی TEXT و DATA انجام میشه،چون کد و متغیرهای مهم اینجا هستن
6 مقایسه Mach-O با PE و ELF
Mach-O انعطافپذیرتر از PE و ELF هست، ولی بررسیش سختتره چون Load Commands به جای Section Table استفاده میشن
7 کاربرد Mach-O در مهندسی معکوس
اگر بخوای کرک کنی یا بایپس کنی:
باید __TEXT (کد برنامه) و LC_LOAD_DYLIB (وابستگی به کتابخانهها) رو بررسی کنی
اگر بخوای اپلیکیشنهای iOS مهندسی معکوس کنی:
باید با Mach-O و ابزارهایی مثل Hopper، Ghidra، otool و jtool کار کنی
اگر بخوای دیباگ کنی: باید بدونی که متغیرها توی DATA و کد داخل TEXT هستن
ساختارش شامل Mach Header Load Commands و Segments هست
نقطه ورود (Entry Point) در LC_MAIN تعریف میشه
کد برنامه در TEXT و متغیرها در DATA قرار دارن
برای بررسی Mach-O از ابزارهایی مثل otool, jtool, Hopper, و Ghidra استفاده میشه
🔥5❤1
📌 ابزارهای دیکامپایل و بازگردانی سورسکد
اگه برنامهای به زبانهای سطح بالا مثل C#، Java یا Python نوشته شده باشه میتونی سورسکدش رو برگردونی
🔹 dnSpy / ILSpy → دیکامپایلر برای برنامههای داتنت (C# و VB)
🔹 JADX / Bytecode Viewer → دیکامپایلر برای برنامههای اندروید (APK)
🔹 Ghidra (با پلاگینهای decompiler) → دیکامپایلر برای باینریهای کامپایلشده
🔹 Decompiler.com → یه سرویس آنلاین برای دیکامپایل زبانهای مختلف
💡
وقتی بخوای ببینی یه برنامهای که به زبان Java یا C# نوشته شده، چه کدی داره
اگه برنامهای به زبانهای سطح بالا مثل C#، Java یا Python نوشته شده باشه میتونی سورسکدش رو برگردونی
🔹 dnSpy / ILSpy → دیکامپایلر برای برنامههای داتنت (C# و VB)
🔹 JADX / Bytecode Viewer → دیکامپایلر برای برنامههای اندروید (APK)
🔹 Ghidra (با پلاگینهای decompiler) → دیکامپایلر برای باینریهای کامپایلشده
🔹 Decompiler.com → یه سرویس آنلاین برای دیکامپایل زبانهای مختلف
💡
وقتی بخوای ببینی یه برنامهای که به زبان Java یا C# نوشته شده، چه کدی داره
🔥4👍1
The_IDA_Pro_book_The_unofficial_guide_to_the_worlds_most_popular.pdf
6.1 MB
کتاب The IDA Pro Book یکی از بهترین منابع برای یادگیری مهندسی معکوس با IDA Pro هست توی این کتاب یاد میگیرید که چطور کدهای باینری و اسمبلی رو تحلیل کنید ساختار یه برنامه رو بشناسید مکانیزمهای ضد مهندسی معکوس رو دور بزنید و حتی بدافزارها رو بررسی کنید
چرا این کتاب مهمه؟
چون IDA Pro یکی از قویترین ابزارهای مهندسی معکوسه و این کتاب قدمبهقدم بهت یاد میده بهتون که چطور ازش استفاده کنید از رابط کاربری و اسکریپتنویسی گرفته تا دیباگ کردن و تحلیل نرمافزارها
اگه ردتیمینگ کار میکنید و دنبال اینید که بفهمید برنامهها چطور از مهندسی معکوس محافظت میشن
چرا این کتاب مهمه؟
چون IDA Pro یکی از قویترین ابزارهای مهندسی معکوسه و این کتاب قدمبهقدم بهت یاد میده بهتون که چطور ازش استفاده کنید از رابط کاربری و اسکریپتنویسی گرفته تا دیباگ کردن و تحلیل نرمافزارها
اگه ردتیمینگ کار میکنید و دنبال اینید که بفهمید برنامهها چطور از مهندسی معکوس محافظت میشن
🔥10👍1
تکنیکهای ضد دیباگ و ضد مهندسی معکوس در نرمافزارها
حالا که ساختار فایلهای اجرایی (PE, ELF, Mach-O) رو شناختید باید بدونید که چطور توسعهدهندهها از مهندسی معکوس جلوگیری میکنن توی این بخش میریم سراغ مکانیزمهای ضد دیباگ و ضد مهندسی معکوس که توی نرمافزارهای مختلف استفاده میشن
1 چرا نرمافزارها از ضد دیباگ استفاده میکنن؟
تکنیکهای ضد دیباگ (Anti-Debugging) و ضد مهندسی معکوس (Anti-Reversing)
معمولا برای این کارها استفاده میشن:
✅ جلوگیری از کرک شدن نرمافزار
✅ سختتر کردن تحلیل بدافزارها
✅ محافظت از الگوریتمهای حساس و لایسنس نرمافزار
✅ جلوگیری از دستکاری و مهندسی معکوس
برنامههایی مثل بازیها نرمافزارهای امنیتی DRM و بدافزارها از این تکنیکها زیاد استفاده میکنن
2 روشهای تشخیص دیباگر در ویندوز (Anti-Debugging در PE)
ویندوز یه سری API داره که برنامهها با استفاده از اونها میتونن بفهمن که آیا تحت دیباگ هستن یا نه
📌 مهمترین روشها :
IsDebuggerPresent()
این تابع از kernel32.dll چک میکنه که برنامه داره تحت دیباگ اجرا میشه یا نه
برای بایپس کردن این تابع میتونیم مقدار برگشتی رو تغییر بدیم
NtQueryInformationProcess()
این تابع از ntdll.dll اطلاعاتی در مورد پروسه میگیره، از جمله اینکه آیا دیباگ میشه یا نه
این روش رو میتونیم با تغییر مقدار ProcessDebugPort در رجیسترها دور بزنیم.
3 روشهای ضد دیباگ در لینوکس (ELF Anti-Debugging)
توی لینوکس، برنامهها میتونن با استفاده از ptrace() تشخیص بدن که تحت دیباگ هستن
استفاده از ptrace() برای جلوگیری از دیباگ
برای بایپس این روش، میتونیم با gdb مقدار برگشتی ptrace() رو تغییر بدیم
4 روشهای ضد دیباگ در macOS (Mach-O Anti-Debugging)
توی macOS، روشهای مشابه لینوکس استفاده میشه ولی از sysctl() هم میشه برای تشخیص دیباگر استفاده کرد:
برای بایپس، میتونیم مقدار p_flag رو تغییر بدیم
5 تکنیکهای پیشرفته ضد مهندسی معکوس
بعضی برنامهها از روشهای پیچیدهتری برای جلوگیری از تحلیل شدن استفاده میکنن
مهمترین تکنیکها:
بدافزارهای حرفهای مثل Zeus و TrickBot از این تکنیکها استفاده میکنن
6 ابزارهای دور زدن ضد دیباگ
🔹 Windows: ScyllaHide, x64dbg, Cheat Engine
🔹 Linux: GDB, ptrace hooks, Frida
🔹 macOS: LLDB, Hopper, Frida
حالا که ساختار فایلهای اجرایی (PE, ELF, Mach-O) رو شناختید باید بدونید که چطور توسعهدهندهها از مهندسی معکوس جلوگیری میکنن توی این بخش میریم سراغ مکانیزمهای ضد دیباگ و ضد مهندسی معکوس که توی نرمافزارهای مختلف استفاده میشن
1 چرا نرمافزارها از ضد دیباگ استفاده میکنن؟
تکنیکهای ضد دیباگ (Anti-Debugging) و ضد مهندسی معکوس (Anti-Reversing)
معمولا برای این کارها استفاده میشن:
✅ جلوگیری از کرک شدن نرمافزار
✅ سختتر کردن تحلیل بدافزارها
✅ محافظت از الگوریتمهای حساس و لایسنس نرمافزار
✅ جلوگیری از دستکاری و مهندسی معکوس
برنامههایی مثل بازیها نرمافزارهای امنیتی DRM و بدافزارها از این تکنیکها زیاد استفاده میکنن
2 روشهای تشخیص دیباگر در ویندوز (Anti-Debugging در PE)
ویندوز یه سری API داره که برنامهها با استفاده از اونها میتونن بفهمن که آیا تحت دیباگ هستن یا نه
📌 مهمترین روشها :
IsDebuggerPresent()
این تابع از kernel32.dll چک میکنه که برنامه داره تحت دیباگ اجرا میشه یا نه
#include <windows.h>
#include <iostream>
int main() {
if (IsDebuggerPresent()) {
std::cout << "Debugger detected!" << std::endl;
return 1;
}
std::cout << "No debugger detected." << std::endl;
return 0;
}
🔹 چطور بایپسش کنیم؟
🔹 مقدار PEB->BeingDebugged رو توی دیباگر تغییر بدیم.
CheckRemoteDebuggerPresent()
این API چک میکنه که یه دیباگر خارجی مثل x64dbg به پروسه وصل شده یا نه
BOOL IsDebuggerAttached() {
BOOL isDebugger = FALSE;
CheckRemoteDebuggerPresent(GetCurrentProcess(), &isDebugger);
return isDebugger;
}
برای بایپس کردن این تابع میتونیم مقدار برگشتی رو تغییر بدیم
NtQueryInformationProcess()
این تابع از ntdll.dll اطلاعاتی در مورد پروسه میگیره، از جمله اینکه آیا دیباگ میشه یا نه
#include <windows.h>
#include <winternl.h>
#include <iostream>
typedef NTSTATUS(WINAPI* pNtQueryInformationProcess)(HANDLE, ULONG, PVOID, ULONG, PULONG);
int main() {
pNtQueryInformationProcess NtQIP = (pNtQueryInformationProcess)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
DWORD isDebuggerPresent = 0;
NtQIP(GetCurrentProcess(), 0x07, &isDebuggerPresent, sizeof(DWORD), NULL);
if (isDebuggerPresent) {
std::cout << "Debugger detected!" << std::endl;
return 1;
}
std::cout << "No debugger detected." << std::endl;
return 0;
این روش رو میتونیم با تغییر مقدار ProcessDebugPort در رجیسترها دور بزنیم.
3 روشهای ضد دیباگ در لینوکس (ELF Anti-Debugging)
توی لینوکس، برنامهها میتونن با استفاده از ptrace() تشخیص بدن که تحت دیباگ هستن
استفاده از ptrace() برای جلوگیری از دیباگ
#include <sys/ptrace.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void anti_debug() {
if (ptrace(PTRACE_TRACEME, 0, 0, 0) == -1) {
printf("Debugger detected!\n");
exit(1);
}
}
int main() {
anti_debug();
printf("Program is running normally.\n");
return 0;
}
برای بایپس این روش، میتونیم با gdb مقدار برگشتی ptrace() رو تغییر بدیم
4 روشهای ضد دیباگ در macOS (Mach-O Anti-Debugging)
توی macOS، روشهای مشابه لینوکس استفاده میشه ولی از sysctl() هم میشه برای تشخیص دیباگر استفاده کرد:
#include <sys/types.h>
#include <sys/sysctl.h>
#include <stdio.h>
int is_debugger_attached() {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()};
struct kinfo_proc info;
size_t size = sizeof(info);
sysctl(mib, 4, &info, &size, NULL, 0);
return (info.kp_proc.p_flag & P_TRACED) != 0;
}
int main() {
if (is_debugger_attached()) {
printf("Debugger detected!\n");
return 1;
}
printf("No debugger detected.\n");
return 0;
}
برای بایپس، میتونیم مقدار p_flag رو تغییر بدیم
5 تکنیکهای پیشرفته ضد مهندسی معکوس
بعضی برنامهها از روشهای پیچیدهتری برای جلوگیری از تحلیل شدن استفاده میکنن
مهمترین تکنیکها:
بدافزارهای حرفهای مثل Zeus و TrickBot از این تکنیکها استفاده میکنن
6 ابزارهای دور زدن ضد دیباگ
🔹 Windows: ScyllaHide, x64dbg, Cheat Engine
🔹 Linux: GDB, ptrace hooks, Frida
🔹 macOS: LLDB, Hopper, Frida
👍5❤2
برای دور زدن مکانیزمهای ضد دیباگ، میتونیم APIهای مربوطه رو هوک کنیم یا مقدار برگشتی اونها رو تغییر بدیم
برنامهها از تکنیکهای ضد دیباگ برای جلوگیری از کرک و مهندسی معکوس استفاده میکنن.
روشهای ساده مثل IsDebuggerPresent() و ptrace() در ویندوز و لینوکس استفاده میشن.
روشهای پیشرفتهتر مثل Code Virtualization و Packing در بدافزارها دیده میشن
ابزارهایی مثل Frida و x64dbg میتونن این مکانیزمها رو دور بزنن
برنامهها از تکنیکهای ضد دیباگ برای جلوگیری از کرک و مهندسی معکوس استفاده میکنن.
روشهای ساده مثل IsDebuggerPresent() و ptrace() در ویندوز و لینوکس استفاده میشن.
روشهای پیشرفتهتر مثل Code Virtualization و Packing در بدافزارها دیده میشن
ابزارهایی مثل Frida و x64dbg میتونن این مکانیزمها رو دور بزنن
👍4👏1
The_Ghidra_Book_The_Definitive_Guide_by_Chris_Eagle,_Kara_Nance.pdf
17.6 MB
معرفی کتاب "The Ghidra Book"
📚 نام کتاب: The Ghidra Book: The Definitive Guide
✍️ نویسندگان: Chris Eagle و Kara Nance
📅 انتشار: سال 2020
📖 موضوع: مهندسی معکوس با Ghidra
🔍 کتاب درباره چی هست؟
کتاب The Ghidra Book یکی از بهترین منابع برای یادگیری Ghidra، ابزار رایگان و متنباز تحلیل باینری توسعهیافته توسط NSA است. این کتاب از مقدماتی تا پیشرفته تمام قابلیتهای Ghidra رو آموزش میده و به مهندسی معکوس نرمافزارها، آنالیز بدافزارها و کرک کردن باینریها میپردازه
📚 نام کتاب: The Ghidra Book: The Definitive Guide
✍️ نویسندگان: Chris Eagle و Kara Nance
📅 انتشار: سال 2020
📖 موضوع: مهندسی معکوس با Ghidra
🔍 کتاب درباره چی هست؟
کتاب The Ghidra Book یکی از بهترین منابع برای یادگیری Ghidra، ابزار رایگان و متنباز تحلیل باینری توسعهیافته توسط NSA است. این کتاب از مقدماتی تا پیشرفته تمام قابلیتهای Ghidra رو آموزش میده و به مهندسی معکوس نرمافزارها، آنالیز بدافزارها و کرک کردن باینریها میپردازه
👍17