ReverseEngineering – Telegram
ReverseEngineering
1.24K subscribers
40 photos
10 videos
55 files
666 links
Download Telegram
تحلیل ضد دیباگینگ و ضد مهندسی معکوس

تاخیر در اجرای کد برای شناسایی دیباگر Timing checks

شناسایی دیباگرها با Timing Check

یکی از روش‌های محبوب برای تشخیص اینکه یه برنامه تحت دیباگ اجرا می‌شه یا نه،اینه که زمان اجرای بخش‌های مختلف کد رو بررسی کنه چرا چون وقتی یه دیباگر فعال باشه اجرای کد یه مقدار کندتر می‌شه مخصوصا وقتی Breakpoint بزاری یا دستور Single-Step اجرا کنی

روش‌های رایج Timing Check و چجوری بایپسشون کنیم؟

1 اندازه‌گیری زمان با APIهای ویندوز
برنامه میاد با یه سری توابع مثل
GetTickCount، QueryPerformanceCounter، RDTSC
زمان اجرا رو اندازه‌گیری می‌کنه. اگه زمان بیشتر از حد عادی باشه یعنی دیباگر فعاله

مثال ساده:

#include <windows.h>
#include <iostream>

int main() {
DWORD start = GetTickCount();
Sleep(100);
DWORD end = GetTickCount();

if (end - start > 110) {
std::cout << "Debugger detected!" << std::endl;
} else {
std::cout << "No debugger found." << std::endl;
}
}

چرا جواب می‌ده؟

چون اگه دیباگر فعال باشه اجرای برنامه متوقف می‌شه و این وقفه باعث می‌شه تاخیر بیشتر بشه و لو بری

چطور دورش بزنیم؟

Patch کردن API ها

(Sleepمثلاً مقدار
رو تغییر بدی)

Hook کردن GetTickCount و مقدار فیک برگردوندن

2 استفاده از RDTSC (دستور تایمر CPU)
دستور RDTSC تعداد سیکل‌های CPU از زمان روشن شدن سیستم رو میشمره اگه برنامه ببینه مقدار تغییر یافته بیش از حد معمول باشه یعنی احتمالا یه دیباگر فعاله

کد اسمبلی:

rdtsc
mov ebx, eax
; اجرای یه بخش از کد
rdtsc
sub eax, ebx
cmp eax, 1000
jg debugger_detected


چطور دورش بزنیم؟

پچ کردن کدی که RDTSC رو اجرا می‌کنه
Hook کردن RDTSC و مقدار فیک برگردوندن

استفاده از پلاگین‌های Anti-Anti-Debug مثل ScyllaHide

3 مقایسه زمان Sleep() با مقدار واقعی
برنامه یه تاخیر عمدی (مثلاً Sleep(500)) ایجاد می‌کنه و بعد چک می‌کنه آیا واقعا همونقدر طول کشیده یا نه اگه بیشتر طول کشیده باشه → یعنی دیباگر توی کاره

مثال:


#include <windows.h>
#include <iostream>

int main() {
LARGE_INTEGER freq, start, end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);

Sleep(500);

QueryPerformanceCounter(&end);
double elapsed = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart;

if (elapsed > 0.55) {
std::cout << "Debugger detected!" << std::endl;
} else {
std::cout << "No debugger found." << std::endl;
}
}



چطور دورش بزنیم؟

Patch کردن Sleep()

تا مقدار واقعی Sleep نادیده گرفته بشه

Hook QueryPerformanceCounter

و مقدار ثابت برگردوندن
👍83
ReverseEngineering
رمز ترنسپوزیشن چیه؟ رمز ترنسپوزیشن یه روش رمزنگاریه که توش حروف متن اصلی تغییر نمیکنن فقط جاشون عوض میشه یعنی همون حروف هستن ولی یه ترتیب دیگه دارن یه مثال ساده: کلمه "سلام" رو در نظر بگیرید اگه جای حروف رو جابه‌جا کنیم می‌تونیم چیزایی مثل "مالس" یا "لامس"…
روش راه‌آهنی (Rail Fence Cipher)

تو این روش متن رو به‌شکل زیگزاگی می‌نویسیم و بعد خط به خط میخونیم

مثال :

متن: HELLO WORLD

اگه با 3 ردیف اینو بنویسیم میشه :

H L O W D E L O R L O


بعد اگه از بالا به پایین بخونیم متن رمز شده می‌شه :

HLOWD ELOR LO
👍21
ابزارهای بررسی حافظه و انالیز رفتار برنامه

این ابزارها کمک می‌کنن که بفهمی یه برنامه چه کارهایی توی سیستم انجام میده

Process Hacker نمایش همه پردازش‌های در حال اجرا و اطلاعات مربوط به اون‌ها

Procmon (Process Monitor) بررسی تمام فعالیت‌های یک برنامه روی فایل‌ها و رجیستری

HxD / 010 Editor ویرایشگر هگز برای تغییر فایل‌های باینری

Cheat Engine تغییر مقدار متغیرهای داخل حافظه (برای کرکینگ و بازی‌ها)

وقتی بخوای ببینی یه برنامه موقع اجرا چه فایلی می‌خونه چه تغییری توی رجیستری میده یا چه داده‌ای توی حافظه ذخیره کرده از اینا استفاده میکنیم
👍61
دوستان کتاب هم میخاید براتون بزارم؟
Anonymous Poll
98%
👍🏻
2%
👎🏻
Practical_reverse_engineering_x86,_x64,_ARM,_Windows_Kernel,_reversing.pdf
4.6 MB
این کتاب شامل تمرین‌ها و راه‌حل‌هایی با ویروس‌ها و روت‌کیت‌های واقعی و مخربه نویسندگان این کتاب عمدا این کار رو انجام دادن تا اطمینان پیدا کنن که خوانندگان می‌تونن فورا مهارت‌های که یاد گرفتن خودشون استفاده کنن نمونه‌های بدافزار به ترتیب حروف الفبا (نمونه A، B، C، …)
انواع معماری رو هم میگه Arm x64 x86
5👏1
ابزارهای بررسی و ویرایش فایل‌های اجرایی

این ابزارها برای بررسی و تغییر فایل‌های PE (ویندوز) و ELF (لینوکس) استفاده میشن

🔹 PE-bear → نمایش ساختار فایل‌های PE و ویرایش اون‌ها

🔹 LordPE → استخراج توابع و اطلاعات PE

🔹 CFF Explorer → بررسی هدرهای فایل PE و تغییر مشخصات اون

وقتی بخوایم بفهمیم یه فایل اجرایی چجوری ساخته شده یا مثلا یه امضای دیجیتال رو ازش حذف کنیم
👍4
تحلیل ساختار فایل‌های اجرایی 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) این نقطه همونجاییه که اولین دستور اسمبلی اجرا میشه
👍5🔥1
دوستان حمایت کنید کانال رو دمتون گرم
🫶🏼🙏🏻
9
ChaCha20 or Salsa20

یک الگوریتم رمزنگاریه که برای امنیت بالا و سرعت زیاد طراحی شده باهاش میشه داده‌ها رو رمزگذاری کرد تا کسی بدون کلید نتونه بخونه این الگوریتم جایگزین خوبی برای AES هست مخصوصاً توی موبایل‌ها و پردازنده‌هایی که سخت‌افزار مخصوص رمزنگاری ندارن


چطوری کار می‌کنه؟

ChaCha20 یه جور رمزنگاری جریانیه، یعنی داده‌ها رو دونه‌دونه رمز می‌کنه نه به‌صورت بلوک‌های بزرگ

ورودی‌هاش چیه؟

یه کلید 256 بیتی همون رمز اصلی

یه مقدار تصادفی Nonce برای جلوگیری از تکراری شدن رمزها

یه شمارنده که توی هر بلاک تغییر می‌کنه


چی کار می‌کنه؟

چند تا عملیات ریاضی ساده مثل جمع XOR و چرخش بیتی روی داده‌ها انجام میده

این عملیات 20 بار تکرار میشه تا یه سری اعداد تصادفی قوی تولید کنه

این اعداد با متن اصلی ترکیب میشن و داده‌ی رمزگذاری‌شده تولید میشه


چرا از ChaCha20 استفاده کنیم؟

سریع‌تره چون نیاز به محاسبات پیچیده‌ی AES نداره

امنیت بالایی داره و در برابر حملات رمزنگاری مقاومه

روی موبایل و دستگاه‌های کم‌قدرت بهتر کار می‌کنه، چون نیاز به سخت‌افزار خاصی نداره

در برابر حملات جانبی مثل حملات کش CPU امن‌ تره

کجاها ازش استفاده میشه؟

توی HTTPS امن کردن اینترنت

توی WireGuard VPN برای اتصال امن

توی OpenSSH برای ارتباطات رمزگذاری‌شده

توی Google QUIC که اینترنت رو سریع‌تر و امن‌تر می‌کنه
👍5
ReverseEngineering pinned «دوستان حمایت کنید کانال رو دمتون گرم 🫶🏼🙏🏻»
ساختار فایل 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 استفاده میشه
👍41
ابزارهای آنپکینگ و بایپس Obfuscation

خیلی از برنامه‌های پولی و بدافزارها پک یا مبهم‌سازی (Obfuscation) میشن تا مهندسی معکوسشون سخت بشه این ابزارها کمک می‌کنن که اون‌ها رو آنپک کنید

UPX  یه ابزار رایج برای فشرده‌سازی و آنپک کردن فایل‌ها

Detect It Easy (DIE)  تشخیص پکینگ و کامپایلرهای فایل‌های اجرایی

x64dbg (با پلاگین Scylla)  آنپک کردن فایل‌های پک‌شده

Unpacker.me  یه سرویس آنلاین برای آنپک کردن بعضی باینری‌ها

وقتی برنامه‌ای که داری بررسی می‌کنی کدش به نظر عجیب و مبهم میاد یا وقتی اجرا میشه خودش رو از حالت فشرده خارج می‌کنه
👏21