بررسی تکنیک فراخوانی توابع DLL با Ordinal: تهدیدی پنهان در حملات مبتنی بر LOLBIN

در فضای امنیت سایبری، یکی از روش‌های زیرکانه که مهاجمان و بدافزارها برای پنهان‌کاری استفاده می‌کنند، فراخوانی توابع یک DLL با استفاده از شماره ترتیبی (Ordinal) به‌جای نام تابع است. این تکنیک عمدتاً در سوءاستفاده از LOLBINها (ابزارهای بومی سیستم‌عامل که برای اهداف مخرب به کار گرفته می‌شوند) دیده می‌شود.

برای مثال، در دستور زیر:

rundll32.exe comsvcs.dll,#24

تابع شماره ۲۴ از فایل comsvcs.dll اجرا می‌شود. اگر تحلیل‌گر نداند این شماره به چه تابعی اشاره دارد، عملاً درک دقیقی از عملکرد این دستور نخواهد داشت. در این مثال، شماره ۲۴ معمولاً به تابع MiniDumpW مربوط است که برای استخراج حافظه فرآیندهایی مانند LSASS به‌کار می‌رود و می‌تواند منجر به سرقت رمزهای عبور شود.

مهم‌ترین چالش این تکنیک، عدم شفافیت آن است. نام تابع نمایش داده نمی‌شود و ابزارهای پایش ساده یا بررسی‌های سطحی نمی‌توانند رفتار واقعی فراخوانی را تشخیص دهند. مهاجمان می‌توانند:

توابع مخرب را با ظاهری بی‌خطر فراخوانی کنند.

وDLLهای جعلی ایجاد کنند که ظاهر و نام مشابه دارند اما رفتار داخلی کاملاً متفاوت است.

از این طریق ابزارهای دفاعی مبتنی بر تشخیص مبتنی بر نام تابع را دور بزنند.

برای مقابله با این روش، اسکریپت‌های تحلیلی مانند PowerShell معرفی‌شده در این زمینه، جدول صادرات (Export Address Table) DLL را استخراج می‌کنند و با نگاشت اعداد Ordinal به نام توابع واقعی، امکان تحلیل دقیق را فراهم می‌کنند.

جمع‌بندی:
این تکنیک یک روش کلاسیک برای استتار اقدامات مخرب است که در ترکیب با LOLBINها یا DLLهای جعلی، می‌تواند امنیت سازمان‌ها را تهدید کند. بنابراین، تحلیل عمیق فراخوانی‌های DLL و داشتن ابزارهای مناسب برای ترجمه Ordinal به نام تابع، برای تیم‌های شکار تهدید و تحلیل بدافزار ضروری است.


#آکادمی_روزبه
مرکز تخصصی CISSP



نمونه کد


# مسیر DLL هدف را مشخص کنید
$dllPath = "C:\Windows\System32\comsvcs.dll"

# بارگذاری DLL با استفاده از Reflection
Add-Type @"
using System;
using System.Runtime.InteropServices;

public class NativeMethods {
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetProcAddress(IntPtr hModule, IntPtr ordinal);
}
"@

# بارگذاری DLL
$dllHandle = [NativeMethods]::LoadLibrary($dllPath)

if ($dllHandle -eq 0) {
Write-Host "خطا در بارگذاری DLL"
exit
}

# حلقه برای بررسی تعدادی Ordinal (مثلاً 1 تا 50)
1..50 | ForEach-Object {
$ordinal = $_
$ordinalPtr = [IntPtr]::op_Explicit($ordinal)

$procAddress = [NativeMethods]::GetProcAddress($dll

Comments

Be the first to add a comment