🧑‍💻Cyber.vision🧑‍💻
566 subscribers
203 photos
13 videos
20 files
151 links
Python tips and tricks
The Good, Bad and the Ugly
متخصص امنیت شبکه های کنترل صنعتی
👨‍💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)
https://t.iss.one/Hacker0x01
Download Telegram
تکنیک‌های ضد دیباگ و ضد مهندسی معکوس در نرم‌افزارها


حالا که ساختار فایل‌های اجرایی (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