DxAntiFirewall
Gelişmiş Ağ Tarama ve Yasaklama
Merhabalar, bu sizlere geliştirmiş olduğum bir uygulamayı tanıtacağım. Bu projenin amacı seçtiğiniz sürücüde ki, ağları izlemeniz ve istemediğiniz IP adresinden gelen paketleri yasaklamanızı sağlar. Hadi o zaman çalışma şekline geçelim:
I Kısım
C#:
using SharpPcap // Version: 4.5.0
using PacketDotNet; // Version: 0.16.0
using NetFwTypeLib;
Pcap.Net.x86 // Version: 1.0.4.1
İlk olarak Interface adında bir WinForms oluşturuyoruz ve buraya görseldeki elementleri ekliyoruz:
List View,
Button
Ardından kodlama kısmına geçiyoruz. LibPcapLiveDevice'ı List şeklinde kullanmamız için kodumuzun üst kısmına ekliyoruz.
C#:
List<LibPcapLiveDevice> libPcapLiveDevices = new List<LibPcapLiveDevice>();
public Interface()
{
InitializeComponent();
StartWriting();
}
Sonra ListView'e sürücüleri yazması için bir fonksiyon yazıyoruz.
C#:
private void StartWriting()
{
LibPcapLiveDeviceList liveDevices = LibPcapLiveDeviceList.Instance;
foreach (LibPcapLiveDevice liveDevice in liveDevices)
{
if (!liveDevice.Interface.Addresses.Exists(before => before != null
&& before.Addr != null
&& before.Addr.ipAddress != null))
continue;
var deviceInterface = liveDevice.Interface;
var friendlyName = liveDevice.Interface?.FriendlyName ?? "Yok";
var description = liveDevice.Interface?.Description ?? "Yok";
var macAddress = liveDevice.Interface?.MacAddress?.ToString() ?? "Yok";
var ipAddress = liveDevice.Interface?.Addresses[0].Addr?.ToString() ?? "Yok";
libPcapLiveDevices.Add(liveDevice);
ListViewItem items = new ListViewItem();
items.Text = friendlyName;
items.SubItems.Add(description);
items.SubItems.Add(FormatMacAddress(macAddress));
items.SubItems.Add(ipAddress);
listView1.Items.Add(items);
}
}
Çıktımızı alırken MAC adresinin düzgün bir şekilde görünmesi için küçük bir kod parçası yazıyoruz bu isteğe bağlıdır fakat diğer türlü görüntü olarak benim hoşuma gitmediği için bu şekilde yapıyorum.
C#:
public static string FormatMacAddress(string macAddress)
{
if (macAddress.Length != 12)
{
throw new ArgumentException("ERROR");
}
var sb = new StringBuilder();
for (int i = 0; i < macAddress.Length; i += 2)
{
sb.Append($"{macAddress[i]}{macAddress[i + 1]}:");
}
sb.Remove(sb.Length - 1, 1);
return sb.ToString();
}
Son addımlarımız olarak ise ara yüzde yerleşen butona iki kere tıklayarak bizim için bir Click eventi oluşturmasını sağlıyoruz ve içerisine ise bu kodları entegre ediyoruz. Bunun amacı kullanıcının seçtiği sürücün bilgisini ana form'a göndermek ve ana menüye geçiştir.
C#:
private void button1_Click(object sender, EventArgs e)
{
foreach (ListViewItem item in listView1.SelectedItems)
{
Siniffer siniffer = new Siniffer(libPcapLiveDevices, item.Index);
Hide();
siniffer.Show();
}
}
II Kısmı
Önemli olaylarımızdan birisi, listelenen paket listesinin üzerine tıkladığımız zaman hangi protokolümüzü seçtiğimizi anlasın ve ona göre bilgileri versin. Burada kullanacağımız protokoller; TCP, UDP, ARP, ICMP ve IGMP.
C#:
string protocol = e.Item.SubItems[4].Text;
int key = Int32.Parse(e.Item.SubItems[0].Text);
Packet packet;
bool getPacket = keyValuePairs.TryGetValue(key, out packet);
switch (protocol)
{
case "TCP":
if (getPacket)
{
var pkgTCP = (TcpPacket)packet.Extract(typeof(TcpPacket));
if (pkgTCP != null)
{
int portSrc = pkgTCP.SourcePort;
int portDst = pkgTCP.SourcePort;
int checksum = pkgTCP.Checksum;
listView2.Clear();
string[] columnHeaders = {
"Packet Number",
"Type",
"Source Port",
"Destination Port",
"TCP Header Size",
"Window Size",
"Checksum",
"TCP Checksum",
"Sequence Number",
"Acknowledgment Number",
"Urgent Pointer",
"ACK Flag",
"PSH Flag",
"RST Flag",
"SYN Flag",
"FIN Flag",
"ECN Flag",
"CWR Flag",
"NS Flag"
};
listView2.Columns.Add("Attributes").Width = 125;
listView2.Columns.Add("Values").Width = 120;
for (int i = 0; i < columnHeaders.Length; i++)
{
ListViewItem item = new ListViewItem();
item.Text = columnHeaders[i];
item.SubItems.Add("");
listView2.Items.Add(item);
}
listView2.Items[0].SubItems[1].Text = key.ToString();
listView2.Items[1].SubItems[1].Text = "TCP";
listView2.Items[2].SubItems[1].Text = portSrc.ToString();
listView2.Items[3].SubItems[1].Text = portDst.ToString();
listView2.Items[4].SubItems[1].Text = pkgTCP.DataOffset.ToString();
listView2.Items[5].SubItems[1].Text = pkgTCP.WindowSize.ToString();
listView2.Items[6].SubItems[1].Text = (checksum.ToString() ?? "none") + (pkgTCP.ValidChecksum ? ", valid" : ", invalid");
listView2.Items[7].SubItems[1].Text = pkgTCP.ValidChecksum ? "valid" : "invalid";
listView2.Items[8].SubItems[1].Text = pkgTCP.SequenceNumber.ToString();
listView2.Items[9].SubItems[1].Text = (pkgTCP.AcknowledgmentNumber.ToString() ?? "none") + (pkgTCP.Ack ? ", valid" : ", invalid");
listView2.Items[10].SubItems[1].Text = pkgTCP.Urg ? "valid" : "invalid";
listView2.Items[11].SubItems[1].Text = pkgTCP.Ack ? "1" : "0";
listView2.Items[12].SubItems[1].Text = pkgTCP.Psh ? "1" : "0";
listView2.Items[13].SubItems[1].Text = pkgTCP.Rst ? "1" : "0";
listView2.Items[14].SubItems[1].Text = pkgTCP.Syn ? "1" : "0";
listView2.Items[15].SubItems[1].Text = pkgTCP.Fin ? "1" : "0";
listView2.Items[16].SubItems[1].Text = pkgTCP.ECN ? "1" : "0";
listView2.Items[17].SubItems[1].Text = pkgTCP.CWR ? "1" : "0";
listView2.Items[18].SubItems[1].Text = pkgTCP.NS ? "1" : "0";
}
}
break;
case "UDP":
if (getPacket)
{
var pkgUDP = (UdpPacket)packet.Extract(typeof(UdpPacket));
if (pkgUDP != null)
{
int portSrc = pkgUDP.SourcePort;
int portDst = pkgUDP.SourcePort;
int checksum = pkgUDP.Checksum;
listView2.Clear();
string[] columnHeaders = {
"Packet Number",
"Type",
"Source Port",
"Destination Port",
"Checksum",
"Valid UDP Checksum"
};
listView2.Columns.Add("Attributes").Width = 125;
listView2.Columns.Add("Values").Width = 120;
for (int i = 0; i < columnHeaders.Length; i++)
{
ListViewItem item = new ListViewItem();
item.Text = columnHeaders[i];
item.SubItems.Add("");
listView2.Items.Add(item);
}
listView2.Items[0].SubItems[1].Text = key.ToString();
listView2.Items[1].SubItems[1].Text = "UDP";
listView2.Items[2].SubItems[1].Text = portSrc.ToString();
listView2.Items[3].SubItems[1].Text = portDst.ToString();
listView2.Items[4].SubItems[1].Text = checksum.ToString();
listView2.Items[5].SubItems[1].Text = pkgUDP.ValidUDPChecksum.ToString();
}
}
break;
case "ARP":
if (getPacket)
{
var pkgARP = (ARPPacket)packet.Extract(typeof(ARPPacket));
if (pkgARP != null)
{
IPAddress ipAddress = pkgARP.SenderProtocolAddress;
IPAddress targetAddress = pkgARP.TargetProtocolAddress;
System.Net.NetworkInformation.PhysicalAddress ipHardwareAddress = pkgARP.SenderHardwareAddress;
System.Net.NetworkInformation.PhysicalAddress targetHardwareAddress = pkgARP.TargetHardwareAddress;
listView2.Clear();
string[] columnHeaders = {
"Packet Number",
"Type",
"Hardware Address Length",
"Protocol Address Length",
"Operation",
"Sender Protocol Address",
"Target Protocol Address",
"Sender Hardware Address",
"Target Hardware Address",
};
listView2.Columns.Add("Attributes").Width = 125;
listView2.Columns.Add("Values").Width = 120;
for (int i = 0; i < columnHeaders.Length; i++)
{
ListViewItem item = new ListViewItem();
item.Text = columnHeaders[i];
item.SubItems.Add("");
listView2.Items.Add(item);
listView2.Items[0].SubItems[1].Text = key.ToString();
listView2.Items[1].SubItems[1].Text = "ARP";
listView2.Items[2].SubItems[1].Text = pkgARP.HardwareAddressLength.ToString();
listView2.Items[3].SubItems[1].Text = pkgARP.ProtocolAddressLength.ToString();
listView2.Items[4].SubItems[1].Text = pkgARP.Operation.ToString();
listView2.Items[5].SubItems[1].Text = ipAddress.ToString();
listView2.Items[6].SubItems[1].Text = targetAddress.ToString();
listView2.Items[7].SubItems[1].Text = ipHardwareAddress.ToString();
listView2.Items[8].SubItems[1].Text = targetHardwareAddress.ToString();
}
}
}
break;
case "ICMP":
if (getPacket)
{
var pkgICMP = (ICMPv4Packet)packet.Extract(typeof(ICMPv4Packet));
if (pkgICMP != null)
{
listView2.Clear();
string[] columnHeaders = {
"Packet Number",
"Type",
"Type Code",
"Checksum",
"ID",
"Sequence Number",
};
listView2.Columns.Add("Attributes").Width = 125;
listView2.Columns.Add("Values").Width = 120;
for (int i = 0; i < columnHeaders.Length; i++)
{
ListViewItem item = new ListViewItem();
item.Text = columnHeaders[i];
item.SubItems.Add("");
listView2.Items.Add(item);
listView2.Items[0].SubItems[1].Text = key.ToString();
listView2.Items[1].SubItems[1].Text = "ICMP v4";
listView2.Items[2].SubItems[1].Text = "0x" + pkgICMP.TypeCode.ToString("x");
listView2.Items[3].SubItems[1].Text = pkgICMP.Checksum.ToString("x");
listView2.Items[4].SubItems[1].Text = pkgICMP.ID.ToString("x");
listView2.Items[5].SubItems[1].Text = pkgICMP.Sequence.ToString("x");
}
}
}
break;
case "IGMP":
if (getPacket)
{
var pkgIGMP = (IGMPv2Packet)packet.Extract(typeof(IGMPv2Packet));
if (pkgIGMP != null)
{
listView2.Clear();
string[] columnHeaders = {
"Packet Number",
"Type",
"TypeV2",
"Group Address",
"Max Response Time",
};
listView2.Columns.Add("Attributes").Width = 125;
listView2.Columns.Add("Values").Width = 120;
for (int i = 0; i < columnHeaders.Length; i++)
{
ListViewItem item = new ListViewItem();
item.Text = columnHeaders[i];
item.SubItems.Add("");
listView2.Items.Add(item);
listView2.Items[0].SubItems[1].Text = key.ToString();
listView2.Items[1].SubItems[1].Text = "IGMP v2";
listView2.Items[2].SubItems[1].Text = pkgIGMP.Type.ToString();
listView2.Items[3].SubItems[1].Text = pkgIGMP.GroupAddress.ToString();
listView2.Items[4].SubItems[1].Text = pkgIGMP.MaxResponseTime.ToString();
}
}
}
break;
default:
listView2.Clear();
break;
}
IP adresini engellemek ve bu engeli kaldırmak içinde ilk önce kendi namespace oluşturuyoruz ve main dosyamızda bunu kullanıyoruz.
C#:
private void blockStripMenuItem_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
string ipToBlock = listView1.SelectedItems[0].SubItems[2].Text;
Firewall.BlockIP(ipToBlock);
MessageBox.Show($"{ipToBlock} IP adresi engellendi.");
LoadFirewallRules();
}
}
private void unblockStripMenuItem_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
string ipToBlock = listView1.SelectedItems[0].SubItems[2].Text;
Firewall.UnblockIP(ipToBlock);
MessageBox.Show($"{ipToBlock} IP adresin engeli kaldırıldı.");
LoadFirewallRules();
}
}
Bu kısımda artık konuyu çok uzatmak ve okuyucuları yormak istemiyorum. Bu yüzden kodun açık kaynak şeklinde paylaşacağım isteyen kişiler geliştirmek veya kullanmak amaçlı kullana bilirler.
Github: DxeiZ/DxAntiFirewall