tgoop.com/pythonwithmedev/433
Last Update:
تکنیکهای ضد دیباگ و ضد مهندسی معکوس در نرمافزارها
حالا که ساختار فایلهای اجرایی (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
BY 🧑💻Cyber.vision🧑💻
Share with your friend now:
tgoop.com/pythonwithmedev/433