Merhabalar bugün geçmiş konum olan TCP IP bağlantısını @xavier eckert yardımıyla paylaşmıştım. Kaynak kodu incelediyseniz eğer Textbox' ta bir kod dikkatinizi çekmesi lazım AppendText özelliği. Peki nedir bu Appendtext özelliği internet üzerinde de bu TCP/UDP bağlantı konularını & kaynak kodları inceleyince de hep karşınıza gelmiştir kodlama kısımlarında mutlaka görmüşsünüzdür. Kısaca anlatacak olursak bir günlüğünüz var diyelim & içerisi dolu olsun buna yeni şeyler yazmak istediğinizde ne yaparsınız üstüne yazmak yerine defterin kalan sayfalarına yani sonlarına doğru yazarsınız değil mi? C# veya Visual Basic .NET programlama dilinde, AppendText ismi bir tür işlev veya komut olarak gelir ve genellikle bir yere yeni bir yazı eklemek için kullanılır. İşte biz bu özelliği bugün satır olarak ekleyip NewLine kodunu da kullanarak hem heuristic tarama yapıp yürütülebilir derlenmiş nesneler üzerinde şüpheli dizeleri arayacağız hem de günlerdir araştırmış olduğum VirusTotal API' sının kullanımını göreceğiz. Başlığa gelecek olursak neden batan geminin malları yine eski baş imamımız 'Ranger bitmek bilmeyen ama bir türlü sonuç çıkmayan projelerine bir yenisini daha ekleyerek VirusTotal tarzı bir ortam yapabilir misiniz demişti. Bu ortamı sağlayacak ne kod bilgisi ne de maddi destek olmasa da edindiğim bilgiler ışığında bazı şeyler yaptırabiliriz demiştim. Bu bahsettiğim bazı şeyler kısmı Heuristic tarama kısmı. Aslında bunu geçmiş takım üyelerimizden @Enistein python dilinde yapmıştı. Biz de bugün C# versiyonunu göreceğiz. Bu projeyi vakit bulamadığım için parça parça paylaşmak durumundayım ilerde paylaşacağım konular ile bu konuyu birleştirip istediği sonucu hemen hemen yakalamış olmayı düşünüyorum. Virus Total API' sinin bu proje ile yakından uzaktan alakası yoktur sadece merak ettiğim & sonuca ulaştığım için size burada vermek istedim.
Heuristic Tarama İle Başlayalım.
İçerisinde barındırdığı belirli kelime grupları vardır & bu kelime grupları zararlı yazılımlarda olan kelime grupları ile aynıdır. İşte bu kelime gruplarını hedef gösterilen uygulama içerisinde arar bulursa uyarı verir bu işlemin bütününe Heuristic tarama denir.
Kodlara geçelim;
Ekleyeceğimiz kütüphaneler
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Security.Cryptography;using System.Drawing;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;Şimdi Bir Class tanımlıyoruz burası bize şüpheli kelime gruplarını barındıran yeri verecek. Burayı istediğiniz kadar genişletebilirsiniz.
C#:
public class HeuristicScanner
{
private TextBox ciktiTextBox;
private List<string> suspiciousPatterns;
public HeuristicScanner(TextBox textBox)
{
ciktiTextBox = textBox;
suspiciousPatterns = new List<string>
{
"CreateRemoteThread",
"VirtualAlloc",
"WriteProcessMemory",
"ShellExecute",
"WinExec",
"URLDownloadToFile",
"powershell -e",
"cmd.exe /c",
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
};
}
Şimdi vereceğim kod ise şüpheli dosyanın taranması ile ilgili kod dizinini barındırıyor. Aynı zamanda entropi kontrolü ile dosyanın boyut hesaplamasını da yapıyor.
C#:
public async Task tara(string filePath)
{
if (!File.Exists(filePath))
{
guncelleTextBox("Dosya bulunamadı.");
return;
}
guncelleTextBox($"Dosya taranıyor: {filePath}");
await Task.Run(() =>
{
try
{
List<string> detections = new List<string>();
// Dosya büyüklüğü kontrolü
long fileSize = new FileInfo(filePath).Length;
if (fileSize > 100 * 1024 * 1024) // 100 MB'dan büyük
{
detections.Add("Dosya boyutu şüpheli derecede büyük.");
}
// Entropy kontrolü
double entropy = CalculateEntropy(filePath);
if (entropy > 7.5) // Yüksek entropy
{
detections.Add("Dosya yüksek entropy'ye sahip, muhtemelen şifrelenmiş veya sıkıştırılmış.");
}
// İçerik kontrolü
string fileContent = File.ReadAllText(filePath, Encoding.ASCII);
foreach (var pattern in suspiciousPatterns)
{
if (fileContent.Contains(pattern))
{
detections.Add($"Şüpheli dize bulundu: {pattern}");
}
// PE dosyası kontrolü
if (IsPEFile(filePath))
{
detections.Add("Dosya bir PE (Portable Executable) dosyası.");
}
// Sonuçları göster
if (detections.Count > 0)
{
guncelleTextBox("Potansiyel tehditler tespit edildi:");
foreach (var detection in detections)
{
guncelleTextBox("- " + detection);
}
}
else
{
guncelleTextBox("Herhangi bir şüpheli özellik tespit edilmedi.");
}
}
catch (Exception ex)
{
guncelleTextBox($"Tarama sırasında hata oluştu: {ex.Message}");
}
});
}
}
Burası ise yukarıda yapılan kontrollerin harekete geçirilmesini sağlayan kod dizini aynı zamanda gelen verilerin aşağı indirilmesini sağlıyor.
C#:
private double CalculateEntropy(string filePath)
{
byte[] bytes = File.ReadAllBytes(filePath);
Dictionary<byte, int> byteCounts = new Dictionary<byte, int>();
foreach (byte b in bytes)
{
if (!byteCounts.ContainsKey(b))
byteCounts[b] = 0;
byteCounts[b]++;
}
double entropy = 0;
double fileSize = bytes.Length;
foreach (var count in byteCounts.Values)
{
double probability = count / fileSize;
entropy -= probability * Math.Log(probability, 2);
}
return entropy;
}
private bool IsPEFile(string filePath)
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
using (BinaryReader br = new BinaryReader(fs))
{
if (br.ReadUInt16() != 0x5A4D) // MZ signature
return false;
fs.Seek(0x3C, SeekOrigin.Begin);
uint peOffset = br.ReadUInt32();
fs.Seek(peOffset, SeekOrigin.Begin);
return br.ReadUInt32() == 0x00004550; // PE signature
}
}
private void guncelleTextBox(string text)
{
if (ciktiTextBox.InvokeRequired)
{
ciktiTextBox.Invoke(new Action<string>(guncelleTextBox), text);
}
else
{
ciktiTextBox.AppendText(text + Environment.NewLine);
}
}
}
Şimdi formumuza bir Textbox ekleyelim. Özelliği Multiline aktif olsun ve ScrollBars özelliği Both olsun adı ise ciktiTextbox olsun ardından bir adet buton ekleyelim. Textbox bize yukarıda verilen kodların işlenmesini sonucunda ne gibi sonuçlar verdiğini gösterecek. Buton ise klasik basma işlemi neticesinde uygulamamızın harekete geçmesini sağlayacak.
Unutmadan buton içerisine girilecek kod;
C#:
string file = @"HEDEF DİZİN VE UYGULAMA";
HeuristicScanner scanner = new HeuristicScanner(ciktiTextBox);
scanner.tara(file);
Deneyelim Bakalım Sonucumuza
Şimdi ise VirusTotal API işlemimize gelelim. Bu da diğerinden farksız aslında ama bazı eklenmesi gereken kütüphaneler mevcut. NuGet paket yöneticisinden Newtonsoft.Json paketini projeye dahil etmeniz gerekiyor zira sonuçlar JSON verisi içerisinde yer alıyor.
Not: Sonuçlar JSON formatında olduğu için bunu siz düzenleyip öyle yayınlamanızı öneririm.
Proje Başına ekleyeceğimiz kütüphaneler;
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.IO;using System.Net.Http;using System.Drawing;using System.Linq;using System.Text;using Newtonsoft.Json;using System.Threading.Tasks;using System.Windows.Forms;using System.Runtime.Remoting.Metadata.W3cXsd2001;InitializeComponent verisi altına gireceğimiz kod aşağıdadır.
C#:
public class MultiAntivirusScanner
{
private TextBoxciktiTextBox;
private const string API_KEY = "SİZİN APİ KEYİNİZ";
private const string API_URL = "https://www.virustotal.com/vtapi/v2/file/scan";
private const string REPORT_URL = "https://www.virustotal.com/vtapi/v2/file/report";
public MultiAntivirusScanner(TextBox textBox)
{
ciktiTextBox = textBox;
}
public async Task ScanFileAsync(string filePath)
{
if (!File.Exists(filePath))
{
guncelleTextBox("Dosya bulunamadı.");
return;
}
try
{
using (HttpClient client = new HttpClient())
using (MultipartFormDataContent form = new MultipartFormDataContent())
{
form.Add(new StringContent(API_KEY), "apikey");
form.Add(new ByteArrayContent(File.ReadAllBytes(filePath)), "file", Path.GetFileName(filePath));
HttpResponseMessage response = await client.PostAsync(API_URL, form);
string responseString = await response.Content.ReadAsStringAsync();
dynamic jsonResponse = JsonConvert.DeserializeObject(responseString);
string scanId = jsonResponse?.scan_id;
if (string.IsNullOrEmpty(scanId))
{
guncelleTextBox("Tarama ID alınamadı. Yanıt: " + responseString);
return;
}
guncelleTextBox($"Tarama başlatıldı. Tarama ID: {scanId}");
await CheckScanResultsAsync(scanId);
}
}
catch (Exception ex)
{
guncelleTextBox($"Hata oluştu: {ex.Message}");
}
}
private async Task CheckScanResultsAsync(string scanId)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync($"{REPORT_URL}?apikey={API_KEY}&resource={scanId}");
string responseString = await response.Content.ReadAsStringAsync();
dynamic jsonResponse = JsonConvert.DeserializeObject(responseString);
string scanResults = jsonResponse?.response_code == 1 ?
$"Tarama sonuçları: {jsonResponse}" :
"Sonuçlar henüz hazır değil.";
guncelleTextBox(scanResults);
}
}
private void guncelleTextBox(string text)
{
if (ciktiTextBox.InvokeRequired)
{
ciktiTextBox.Invoke(new Action<string>(guncelleTextBox), text);
}
else
{
ciktiTextBox.AppendText(text + Environment.NewLine);
}
}}
Yine formumuza bir buton & textbox oluşturalım. Özellikleri yukarıdaki konu ile aynıdır.
Buton içerisine gireceğimiz kod
C#:
string uzanti= @"tarayacağınız dosya ve uzantısı";
MultiAntivirusScanner scanner = new MultiAntivirusScanner(sonucTextBox);
scanner.ScanFileAsync(uzanti);
Deneyelim Bakalım Sonucumuza
- S0N -
- S0N -
Son düzenleme:



