Bugün C# Builder ve C++ Stub ile bağlantı kurmaya bakacağız.
Normalde RAT'larda C# Stub ve Builder şeklinde oluyor.
Burada biraz daha farklı bir yaklaşım ile Native EXE ile bağlantı kuracağız.
Projeye 1 adet buton ve hataları ayıklamak için 2 adet textbox ekliyoruz.
Burada Stub yolunu aldık ve değişkenimize atadık.
Hataları ayıklamak için günlük sınıfımızı yazıyoruz. (Zorunlu Değil)
Builder kodladık, mantığımız basit; belirlediğimiz ayracın sonuna veriyi yazıyoruz.
Şimdi C++ Stub kodlayalım, ayracın sonundaki veriyi okuyup yazdıracak şekilde yazacağız,
Fakat farklı bir hale getirebilirsiniz Stub kodunu.
Kodumuz hazır şimdi test edelim, Stub kodunu ve builder kodunu derleyip aynı dizine aldık.
Şeklinde mesajı belirledik.
Şimdi EXE'yi oluşturduk, bakalım verdiğimiz veriyi doğru yazdırabiliyormu;
Veri sorunsuzca yazdırıldı.
Geliştirmek isterseniz; Yazdırılan veriyi şifreleyerek yazdırabilirsiniz,
Verilerin çalınmasını engellemek için.
Normalde RAT'larda C# Stub ve Builder şeklinde oluyor.
Burada biraz daha farklı bir yaklaşım ile Native EXE ile bağlantı kuracağız.
Projeye 1 adet buton ve hataları ayıklamak için 2 adet textbox ekliyoruz.
C# Builder Kodu
C#:
public partial class MainForm : Form
{
// Stub yolunu aynı dizin olarak belirledik
// bunu belirli bir yoldan alabilirsiniz
private readonly string stub_yolu = Path.Combine(Environment.CurrentDirectory, "Stub.exe");
public MainForm()
{
InitializeComponent();
metin_kutularini_yapilandir();
}
private void metin_kutularini_yapilandir()
{
rtb_gunluk.ReadOnly = true;
txt_mesaj.Text = "";
}
Burada Stub yolunu aldık ve değişkenimize atadık.
C#:
private void btn_olustur_Click(object sender, EventArgs e)
{
string mesaj = txt_mesaj.Text.Trim();
if (string.IsNullOrWhiteSpace(mesaj))
{
// hataları burada belirliyoruz
// 2. textboxı bu yüzden ekledik
// bunu deneme kısmında örnek olarak ekledim
// hataları belirlemek için
// illaki eklemenize gerek yok
gunluk_mesaj_yaz("Lütfen bir mesaj girin.");
MessageBox.Show("Lütfen bir mesaj girin.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (!File.Exists(stub_yolu))
{
gunluk_mesaj_yaz($"Stub.exe bulunamadı: {stub_yolu}");
MessageBox.Show($"Stub.exe bulunamadı: {stub_yolu}", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
SaveFileDialog dialog = new SaveFileDialog
{
Filter = "Stub (*.exe)|*.exe",
FileName = $"Stub_{DateTime.Now.Ticks}.exe"
};
try
{
if (dialog.ShowDialog() != DialogResult.OK)
return;
// burada yeni exe oluşturmak için
// stubı kopyaladık
// yeni bir exe oluşturacağız
File.Copy(stub_yolu, dialog.FileName, true);
//burası önemli
// File.AppendAllText fonksiyonu
// veriyi sona yazdırmak için
// burada [MESAJ] isminde bir ayraç oluşturduk
// crypter mantığı o ayracın sonuna veriyi yazacağız
File.AppendAllText(dialog.FileName, $"[MESAJ]{mesaj}");
gunluk_mesaj_yaz($"EXE oluşturuldu: {dialog.FileName}");
MessageBox.Show($"EXE oluşturuldu: {dialog.FileName}", "Başarılı", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
gunluk_mesaj_yaz($"EXE oluşturulamadı: {ex.Message}");
MessageBox.Show($"EXE oluşturulamadı: {ex.Message}", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
dialog.Dispose();
}
}
Hataları ayıklamak için günlük sınıfımızı yazıyoruz. (Zorunlu Değil)
C#:
private void gunluk_mesaj_yaz(string mesaj, System.Drawing.Color renk)
{
this.Invoke((MethodInvoker)delegate
{
rtb_gunluk.SelectionColor = renk;
rtb_gunluk.AppendText($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {mesaj}\n");
rtb_gunluk.ScrollToCaret();
});
}
Builder kodladık, mantığımız basit; belirlediğimiz ayracın sonuna veriyi yazıyoruz.
Şimdi C++ Stub kodlayalım, ayracın sonundaki veriyi okuyup yazdıracak şekilde yazacağız,
Fakat farklı bir hale getirebilirsiniz Stub kodunu.
C++ Stub
C#:
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
int main(int argc, char* argv[])
{
// burada c++ kodunda
// kendi dosya yolunu alıyoruz
char dosya_yolu[MAX_PATH];
GetModuleFileNameA(NULL, dosya_yolu, MAX_PATH);
//binary formatta okuyoruz
std::ifstream dosya(dosya_yolu, std::ios::binary);
if (!dosya.is_open())
{
std::cout << "Hata: Dosya acilamadi: " << dosya_yolu << std::endl;
return 1;
}
// veriyi yazdığımız fonksiyon
// dosyanın sonuna yazdığı için
// ios::end ile sonunu okuyoruz
dosya.seekg(0, std::ios::end);
size_t dosya_boyutu = dosya.tellg();
dosya.seekg(0, std::ios::beg);
// içeriği okuyoruz
std::string icerik(dosya_boyutu, '\0');
dosya.read(&icerik[0], dosya_boyutu);
dosya.close();
// [MESAJ] ayracını belirlemiştik
// okuyacağı veriyi bu şekilde belirliyoruz
std::string ayrac = "[MESAJ]";
size_t pozisyon = icerik.rfind(ayrac);
if (pozisyon == std::string::npos)
{
std::cout << "Hata: Mesaj bulunamadi." << std::endl;
return 1;
}
//veriyi ayraçtan bölüyoruz
// yazdıracağımız kısım böyle çıkıyor
std::string mesaj = icerik.substr(pozisyon + ayrac.length());
std::cout << mesaj << std::endl;
return 0;
}
Kodumuz hazır şimdi test edelim, Stub kodunu ve builder kodunu derleyip aynı dizine aldık.
Şeklinde mesajı belirledik.
Şimdi EXE'yi oluşturduk, bakalım verdiğimiz veriyi doğru yazdırabiliyormu;
Veri sorunsuzca yazdırıldı.
Geliştirmek isterseniz; Yazdırılan veriyi şifreleyerek yazdırabilirsiniz,
Verilerin çalınmasını engellemek için.




