Hoşgeldin Misafir

C# Builder, C++ Stub Bağlantısı | Native EXE ile Bağlantı Kurulumu

xS0N3R

23 Ağu 2020
5,427 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
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.

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.

m1psk1a.jpg



Şeklinde mesajı belirledik.
Şimdi EXE'yi oluşturduk, bakalım verdiğimiz veriyi doğru yazdırabiliyormu;

ia6jiqu.jpg



Veri sorunsuzca yazdırıldı.
Geliştirmek isterseniz; Yazdırılan veriyi şifreleyerek yazdırabilirsiniz,
Verilerin çalınmasını engellemek için.