تکنیک Patch کردن API یعنی چی و چطور انجام می‌شود؟

✍️روزبه نوروزی

تکنیکPatch کردن API ؛ یعنی تغییر رفتار یک تابع در حافظه یا کد اجرایی به‌طوری که هنگام اجرای برنامه، تابع مقدار متفاوتی برگرداند یا اصلاً اجرا نشود.
این تکنیک در مهندسی معکوس، تحلیل بدافزار، و دور زدن محدودیت‌های نرم‌افزاری استفاده می‌شود.

روش‌های مختلف Patch کردن API

برای Patch کردن API می‌توان از چندین روش مختلف استفاده کرد:

ویرایش باینری (Binary Patching) در فایل اجرایی

تکنیک Patch کردن در حافظه (Runtime Patching) با دیباگر

انجام Hook کردن API با DLL Injection یا Inline Hooking

۱. ویرایش باینری (Binary Patching) در فایل اجرایی

در این روش، مستقیماً فایل اجرایی (EXE / DLL) را ویرایش می‌کنیم و کد تابع را تغییر می‌دهیم.
مثال: حذف یک شرط در Assembly

فرض کنید یک برنامه این شرط را دارد:

cmp eax, 1 ;
مقدار EAX را با 1 مقایسه می‌کند
jne Exit ;
اگر برابر نبود، به Exit می‌رود

اگر بخواهیم این شرط را حذف کنیم تا برنامه همیشه مقدار موردنظر ما را بپذیرد، می‌توانیم این دو دستور را NOP (No Operation) کنیم:

nop ; هیچ عملی انجام نده
nop ; هیچ عملی انجام نده

ابزارهای مورد نیاز برای این روش

Hiew → برای ویرایش فایل‌های باینری
IDA Pro / Ghidra → برای مشاهده و تغییر کد اسمبلی
x64dbg / OllyDbg → برای دیباگ و Patch کردن در حافظه

۲. انجامPatch کردن در حافظه (Runtime Patching) با دیباگر

در این روش، برنامه را اجرا می‌کنیم و در لحظه (runtime) کد آن را تغییر می‌دهیم.
مثال: Patch کردن NtQuerySystemInformation در x64dbg

فرض کنید یک بدافزار از این API استفاده می‌کند تا ببیند سیستم داخل VM است یا نه:

call NtQuerySystemInformation
cmp eax, 0x1 ;
اگر مقدار برگشتی ۱ باشد، یعنی سیستم مجازی است
je Exit ;
اگر مقدار ۱ بود، خروج

مراحل انجام کار در x64dbg:

برنامه را در x64dbg اجرا کنید.
به تابع NtQuerySystemInformation بروید.
روی دستور cmp eax, 0x1 Breakpoint بگذارید.
مقدار eax را به ۰ تغییر دهید تا برنامه فکر کند در سیستم واقعی اجرا می‌شود.

mov eax, 0

اجرای برنامه را ادامه دهید.

🔹 نتیجه: بدافزار نمی‌تواند تشخیص دهد که در VM اجرا شده است!
۳. انجام Hook کردن API با DLL Injection یا Inline Hooking

در این روش، یک DLL جدید می‌نویسیم و آن را به برنامه تزریق می‌کنیم تا رفتار یک API را تغییر دهد.
مثال: Hook کردن NtQuerySystemInformation با DLL Injection

کد زیر باعث می‌شود که مقدار برگشتی NtQuerySystemInformation همیشه مقدار جعلی (مثلاً ۰) باشد، بنابراین بدافزار فکر می‌کند در یک سیستم واقعی اجرا شده است.

#include <windows.h>
#include <detours.h>
#include <winternl.h>

typedef NTSTATUS (WINAPI* NtQuerySystemInformation_t)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
NtQuerySystemInformation_t OriginalNtQuerySystemInformation;

NTSTATUS WINAPI HookedNtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength) {
if (SystemInformationClass == SystemManufacturer) {
strcpy((char*)SystemInformation, "DELL");
مقدار جعلی برای سیستم فیزیکی
return 0;
}
return OriginalNtQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
}

void HookAPI() {
OriginalNtQuerySystemInformation = (NtQuerySystemInformation_t)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)OriginalNtQuerySystemInformation, HookedNtQuerySystemInformation);
DetourTransactionCommit();
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
HookAPI();
}
return TRUE;
}

مراحل اجرای Hook

این کد را کامپایل کنید و یک DLL بسازید.
این DLL را به بدافزار Inject کنید (مثلاً با Process Hacker یا DLL Injector).
حالا API NtQuerySystemInformation مقدار دلخواه شما را برمی‌گرداند.


#آکادمی_روزبه
#من_آموزش_میدهم

Comments

Be the first to add a comment