public void preposli(Rozhranie rozhranie, EthernetPacket eth) { statistiky(rozhranie, eth, false); rozhranie.adapter.SendPacket(eth); Thread.Sleep(500); Thread.CurrentThread.Abort(); }
private void btn_rozhrania_Click(object sender, EventArgs e) { if (cb_rozhranie1.SelectedIndex >= 0 && cb_rozhranie2.SelectedIndex >= 0) { rozhranie1 = nastav_adapter(rozhranie1, 1); rozhranie2 = nastav_adapter(rozhranie2, 2); try { if (vlakno_rozhranie1 == null) { vlakno_rozhranie1 = new Thread(() => pocuvaj_rozhranie1(rozhranie1)); vlakno_rozhranie1.Start(); } if (vlakno_rozhranie2 == null) { vlakno_rozhranie2 = new Thread(() => pocuvaj_rozhranie2(rozhranie2)); vlakno_rozhranie2.Start(); } } catch (Exception ee) { MessageBox.Show(ee.ToString()); } } else { MessageBox.Show("zvol adatper!"); } }
public void preposli(Rozhranie rozhranie, EthernetPacket eth, Smerovaci_zaznam smerovaci_zaznam, string via, IPAddress ciel_adres) { bool naslo = false; int pokus_arp = 3; while (pokus_arp > 0) { foreach (var zaznam in arp_tabulka.ToList()) { if (zaznam.ip == via || (via == null && zaznam.ip == ciel_adres.ToString())) { naslo = true; eth.DestinationHwAddress = PhysicalAddress.Parse(zaznam.mac); eth.SourceHwAddress = rozhranie.adapter.MacAddress; rozhranie.adapter.SendPacket(eth); pokus_arp = 0; break; } } if (!naslo) { if (via != null) { arp_request(rozhranie, IPAddress.Parse(via)); } else { arp_request(rozhranie, ciel_adres); } System.Threading.Thread.Sleep(500); } } Thread.CurrentThread.Abort(); }
public void arp_reply(EthernetPacket eth, Rozhranie rozhranie, IPAddress odosielatel_address, IPAddress ciel_adres) { if (rozhranie.adapter.MacAddress != null) { EthernetPacket ethernet_packet = new EthernetPacket(rozhranie.adapter.MacAddress, eth.SourceHwAddress, EthernetPacketType.Arp); arp_packet = new ARPPacket(ARPOperation.Response, eth.SourceHwAddress, odosielatel_address, rozhranie.adapter.MacAddress, ciel_adres); ethernet_packet.PayloadPacket = arp_packet; rozhranie.adapter.SendPacket(ethernet_packet); } }
public void arp_request(Rozhranie rozhranie, IPAddress hladana_ip) { if (rozhranie.adapter.MacAddress != null) { EthernetPacket ethernet_packet = new EthernetPacket(rozhranie.adapter.MacAddress, PhysicalAddress.Parse("FF-FF-FF-FF-FF-FF"), EthernetPacketType.Arp); arp_packet = new ARPPacket(ARPOperation.Request, PhysicalAddress.Parse("00-00-00-00-00-00"), hladana_ip, rozhranie.adapter.MacAddress, IPAddress.Parse(rozhranie.ip_adresa)); ethernet_packet.PayloadPacket = arp_packet; rozhranie.adapter.SendPacket(ethernet_packet); } }
public Rozhranie nastav_adapter(Rozhranie rozhranie, int cislo_rozhrania) { if (cislo_rozhrania == 1) { rozhranie = new Rozhranie(zoznam_adapterov[cb_rozhranie1.SelectedIndex], cislo_rozhrania); } if (cislo_rozhrania == 2) { rozhranie = new Rozhranie(zoznam_adapterov[cb_rozhranie2.SelectedIndex], cislo_rozhrania); } return(rozhranie); }
public void statistiky(Rozhranie rozhranie, EthernetPacket eth, bool in_nout) { IPv4Packet ip; int riadok; lock (this) { if (rozhranie.cislo_rozhrania == 1 && in_nout) { riadok = 0; } else if (rozhranie.cislo_rozhrania == 1 && !in_nout) { riadok = 1; } else if (rozhranie.cislo_rozhrania == 2 && in_nout) { riadok = 2; } else { riadok = 3; } dg_statistiky[1, riadok].Value = (int)(dg_statistiky[1, riadok].Value) + 1; if (eth.PayloadPacket is ARPPacket) { dg_statistiky[2, riadok].Value = (int)(dg_statistiky[2, riadok].Value) + 1; } if (eth.PayloadPacket is IPv4Packet) { dg_statistiky[3, riadok].Value = (int)(dg_statistiky[3, riadok].Value) + 1; ip = (IPv4Packet)eth.PayloadPacket; if (ip.PayloadPacket is TcpPacket) { dg_statistiky[4, riadok].Value = (int)(dg_statistiky[4, riadok].Value) + 1; // if (ip.PayloadPacket.PayloadPacket. is ) dg_statistiky[7, 0].Value = (int)(dg_statistiky[7, 0].Value) + 1; } if (ip.PayloadPacket is UdpPacket) { dg_statistiky[5, riadok].Value = (int)(dg_statistiky[5, riadok].Value) + 1; } if (ip.PayloadPacket is ICMPv4Packet) { dg_statistiky[6, riadok].Value = (int)(dg_statistiky[6, riadok].Value) + 1; } } } }
public void analyzuj(Rozhranie rozhranie, int cislo_rozhrania, EthernetPacket eth, Packet paket) //2 { bool vloz = true; int vystupne_rozhranie = -1; Thread posielanie = null; Cam_zaznam novy_zaznam = new Cam_zaznam(eth.SourceHwAddress, cislo_rozhrania, timer); //2 statistiky(rozhranie, eth, true); lock (this) { foreach (var zaznam in CAM_tabulka) { if (zaznam.MAC.Equals(novy_zaznam.MAC)) { if (zaznam.rozhranie != novy_zaznam.rozhranie) { zaznam.rozhranie = novy_zaznam.rozhranie; } vloz = false; zaznam.timer = timer; } // Console.WriteLine(zaznam.MAC + " " + eth.DestinationHwAddress); if (zaznam.MAC.Equals(eth.DestinationHwAddress)) { vystupne_rozhranie = zaznam.rozhranie; //2 } } if (vloz) { try { CAM_tabulka.Add(novy_zaznam); } catch (Exception ee) { Console.WriteLine("Omg"); } } // Console.WriteLine(vystupne_rozhranie + " " + cislo_rozhrania); if (vystupne_rozhranie != cislo_rozhrania) { switch (vystupne_rozhranie) { case 1: posielanie = new Thread(() => preposli(rozhranie1, eth)); break; case 2: posielanie = new Thread(() => preposli(rozhranie2, eth)); break; default: if (cislo_rozhrania == 1) { posielanie = new Thread(() => preposli(rozhranie2, eth)); } else { posielanie = new Thread(() => preposli(rozhranie1, eth)); } break; } posielanie.Start(); } } }
public void pocuvaj_rozhranie2(Rozhranie rozhranie) { rozhranie.adapter.OnPacketArrival += new PacketArrivalEventHandler(zachytenie_rozhranie2); otvor_na_prijimanie(rozhranie.adapter); }
public void posli_ping(string ip) { if (ip.Equals(rozhranie1.ip_adresa) || ip.Equals(rozhranie2.ip_adresa)) { main_view.lbl_ping = "!!!!!"; } else { string cmdString = "abcdefghijklmnoprstu"; byte[] sendBuffer = Encoding.ASCII.GetBytes(cmdString); ICMPv4Packet ping = new ICMPv4Packet(new ByteArraySegment(sendBuffer)); string via = null; Rozhranie rozhranie = null; ping.Checksum = 0; ping.TypeCode = ICMPv4TypeCodes.EchoRequest; ping.Sequence = 1; ping.UpdateCalculatedValues(); byte[] bytes = BitConverter.GetBytes(GetCrc(ping.Bytes)); Array.Reverse(bytes); ushort result = BitConverter.ToUInt16(bytes, 0); ping.Checksum = result; Smerovaci_zaznam smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(IPAddress.Parse(ip)); if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1) { smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via); } if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X") { via = smerovaci_zaznam.next_hop; } if (smerovaci_zaznam != null) { if (smerovaci_zaznam.exit_interface == 2) { rozhranie = rozhranie2; } if (smerovaci_zaznam.exit_interface == 1) { rozhranie = rozhranie1; } IPv4Packet ip_pak = new IPv4Packet(IPAddress.Parse(rozhranie1.ip_adresa), IPAddress.Parse(ip)); ip_pak.SourceAddress = IPAddress.Parse(rozhranie.ip_adresa); ip_pak.DestinationAddress = IPAddress.Parse(ip); ip_pak.PayloadPacket = ping; ip_pak.UpdateIPChecksum(); string label = ""; EthernetPacket eth = new EthernetPacket(rozhranie.adapter.MacAddress, rozhranie.adapter.MacAddress, EthernetPacketType.IpV4); eth.PayloadPacket = ip_pak; int pokus = 5; while (pokus-- > 0) { Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, IPAddress.Parse(ip))); posielanie.Start(); zapis_ping = true; Thread.Sleep(1000); if (zapis_ping.Equals(true)) { main_view.lbl_ping += "."; // main_view.lbl_ping = label;//main_view.vypis(".", 85); } } } else { main_view.lbl_ping = "neviem smerovat"; } } Thread.CurrentThread.Abort(); }
public void posli_update(Rozhranie rozhranie, int cislo_rozhrania, IPAddress cielova_ip, PhysicalAddress cielova_mac) { IPv4Packet ip_paket; UdpPacket udp_paket; Byte[] ip; Byte[] hlava = new byte[] { 0x00, 0x02, 0x00, 0x00 }; Byte[] rip_hlava = new byte[] { 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 }; Byte[] next_hop = new byte[] { 0x00, 0x00, 0x00, 0x00 }; Byte[] metrika = new byte[] { 0x00, 0x00, 0x00, 0x00 }; bool prvy = true; EthernetPacket eth = new EthernetPacket(rozhranie.adapter.MacAddress, cielova_mac, EthernetPacketType.IpV4); ip_paket = new IPv4Packet(IPAddress.Parse(rozhranie.ip_adresa), cielova_ip); if (cielova_mac.ToString().Equals("01005E000009")) { ip_paket.TimeToLive = 2; } else { ip_paket.TimeToLive = 255; } udp_paket = new UdpPacket(520, 520); foreach (var zaznam in smerovacia_tabulka.ToList()) { if ((zaznam.typ == "D" || zaznam.typ == "R") && zaznam.exit_interface != cislo_rozhrania && zaznam.metrika != 16) { if (!prvy) { rip_hlava = rip_hlava.Concat(hlava).ToArray(); } prvy = false; rip_hlava = rip_hlava.Concat(zaznam.cielova_siet.GetAddressBytes()).ToArray(); rip_hlava = rip_hlava.Concat(zaznam.maska.GetAddressBytes()).ToArray(); rip_hlava = rip_hlava.Concat(next_hop).ToArray(); if (zaznam.metrika != 16) { metrika[3] = (byte)(zaznam.metrika + 1); } else { metrika[3] = (byte)(zaznam.metrika); } rip_hlava = rip_hlava.Concat(metrika).ToArray(); } } foreach (var zaznam in rip_databaza.ToList()) { if (zaznam.metrika == 16 && zaznam.exit_interface != cislo_rozhrania) { if (!prvy) { rip_hlava = rip_hlava.Concat(hlava).ToArray(); } prvy = false; rip_hlava = rip_hlava.Concat(zaznam.cielova_siet.GetAddressBytes()).ToArray(); rip_hlava = rip_hlava.Concat(zaznam.maska.GetAddressBytes()).ToArray(); rip_hlava = rip_hlava.Concat(next_hop).ToArray(); metrika[3] = (byte)zaznam.metrika; if (zaznam.metrika == 0) { metrika[3] = 1; } rip_hlava = rip_hlava.Concat(metrika).ToArray(); } } udp_paket.PayloadData = rip_hlava; // udp_paket.UpdateUDPChecksum(); ip_paket.PayloadPacket = udp_paket; ip_paket.UpdateIPChecksum(); eth.PayloadPacket = ip_paket; rozhranie.adapter.SendPacket(eth); }
public void spracuj_rip(EthernetPacket eth, Packet packet, Rozhranie rozhranie, IPAddress oznamovatel) { lock (this) { Smerovaci_zaznam rip_zaznam; int dlzka = eth.Bytes.Length - 46; int pocet = dlzka / 20; int cislo_rozhrania; bool pridaj_do_databazy = true; IPAddress adresa_siete_rip; IPAddress maska_rip; bool pridaj_zaznam = true; int slash_maska; int posunutie_ip = 0, posunutie_maska = 0, posunutie_metrika = 0; if (rozhranie == rozhranie1) { cislo_rozhrania = 1; } else { cislo_rozhrania = 2; } if ((cislo_rozhrania == 1 && povolene_rip1) || (cislo_rozhrania == 2 && povolene_rip2)) { if ((int)eth.Bytes[42] == 2) { while ((pocet--) > 0) { adresa_siete_rip = Praca_s_ip.adresa_siete(new IPAddress(eth.Bytes.Skip(50 + posunutie_ip).Take(4).ToArray()), new IPAddress(eth.Bytes.Skip(54 + posunutie_maska).Take(4).ToArray())); maska_rip = new IPAddress(eth.Bytes.Skip(54 + posunutie_maska).Take(4).ToArray()); pridaj_zaznam = true; slash_maska = Praca_s_ip.sprav_masku(maska_rip); rip_zaznam = new Smerovaci_zaznam("R", adresa_siete_rip, maska_rip, 120, (int)eth.Bytes[65 + posunutie_metrika], oznamovatel.ToString(), cislo_rozhrania, 0, 0, 0); foreach (var zaznam in smerovacia_tabulka.ToList()) { if (adresa_siete_rip.Equals(Praca_s_ip.adresa_siete(zaznam.cielova_siet, zaznam.maska))) { if ((slash_maska == Praca_s_ip.sprav_masku(zaznam.maska))) { if (zaznam.metrika == 16) { pridaj_zaznam = false; break; } if (rip_zaznam.metrika == 16) { if (zaznam.typ.Equals("R") && zaznam.next_hop.Equals(rip_zaznam.next_hop)) { smerovacia_tabulka.Remove(zaznam); zaznam.metrika = 16; zaznam.invalid = invalid_casovac; Smerovaci_zaznam najlepsia = najdi_najlepsiu_v_databaze(zaznam.cielova_siet, zaznam.maska); if (najlepsia != null && !najlepsia.Equals(zaznam) && !(najlepsia.metrika.Equals(16))) { smerovacia_tabulka.Add(najlepsia); smerovacia_tabulka.Remove(zaznam); rip_databaza.Remove(zaznam); } else { trigger_update(zaznam.exit_interface, zaznam); } pridaj_zaznam = false; break; } else { pridaj_zaznam = false; break; } } if (rip_zaznam.metrika >= zaznam.metrika) { pridaj_zaznam = false; break; } else { smerovacia_tabulka.Remove(zaznam); break; } } } } if (pridaj_zaznam && rip_zaznam.metrika != 16) { smerovacia_tabulka.Add(rip_zaznam); rip_databaza.Add(rip_zaznam); posunutie_ip = posunutie_maska = posunutie_metrika = posunutie_ip + 20; continue; } pridaj_zaznam = true; foreach (var zaznam in rip_databaza.ToList()) { if (adresa_siete_rip.Equals(zaznam.cielova_siet) && zaznam.maska.Equals(rip_zaznam.maska) && (zaznam.next_hop.Equals(rip_zaznam.next_hop))) { pridaj_do_databazy = false; if (zaznam.metrika == 16) { continue; } if (rip_zaznam.metrika == 16) { zaznam.metrika = 16; continue; } else if (rip_zaznam.metrika != zaznam.metrika) { zaznam.metrika = rip_zaznam.metrika; zaznam.nastav_casovace(0, 0, 0); } else if (rip_zaznam.metrika == zaznam.metrika) { zaznam.nastav_casovace(0, 0, 0); break; } } } if (rip_zaznam.metrika == 16) { pridaj_do_databazy = false; } if (pridaj_do_databazy) { rip_databaza.Add(rip_zaznam); } pridaj_do_databazy = true; posunutie_ip = posunutie_maska = posunutie_metrika = posunutie_ip + 20; } } else if ((int)eth.Bytes[42] == 1) { posli_update(rozhranie, cislo_rozhrania, oznamovatel, eth.SourceHwAddress); } } } }
public void analyzuj(Rozhranie rozhranie, EthernetPacket eth, Packet paket) { if (eth.Type.ToString().Equals("Arp")) { IPAddress odosielatel_adres = new IPAddress(paket.Bytes.Skip(28).Take(4).ToArray()); IPAddress ciel_adres = new IPAddress(paket.Bytes.Skip(38).Take(4).ToArray()); if (ciel_adres.ToString().Equals("255.255.255.255") || ciel_adres.ToString().Equals(rozhranie.ip_adresa)) { if (paket.Bytes[21] == 1) { arp_reply(eth, rozhranie, odosielatel_adres, ciel_adres); //dosla mi request tak odpovedam } else if (paket.Bytes[21] == 2 && !eth.SourceHwAddress.ToString().Equals("02004C4F4F50")) //IGNORUJEM LOOPBACK { bool pridaj_arp_zaznam = true; arp = new Arp(odosielatel_adres.ToString(), eth.SourceHwAddress.ToString(), arp_casovac); foreach (var zaznam in arp_tabulka) { if (zaznam.ip.Equals(arp.ip) && zaznam.mac.Equals(arp.mac)) { zaznam.casovac = arp_casovac; pridaj_arp_zaznam = false; } if (zaznam.ip.Equals(arp.ip)) { pridaj_arp_zaznam = false; } } if (pridaj_arp_zaznam) { arp_tabulka.Add(arp); } } } else { if (paket.Bytes[21] == 1) // PROXY ARP { Smerovaci_zaznam naslo_zaznam = null; naslo_zaznam = najdi_zaznam_v_smerovacej_tabulke(ciel_adres); if (naslo_zaznam != null && naslo_zaznam.exit_interface == -1) { string via = null; naslo_zaznam = rekurzivne_prehladanie(naslo_zaznam, ref via); } if (naslo_zaznam != null && naslo_zaznam.exit_interface != -1 && (rozhranie.cislo_rozhrania != naslo_zaznam.exit_interface)) { arp_reply(eth, rozhranie, odosielatel_adres, ciel_adres); } } } } else if (eth.Type.ToString().Equals("IpV4")) { if ((--paket.Bytes[22]) > 0) { IPAddress odosielatel_address = new IPAddress(paket.Bytes.Skip(26).Take(4).ToArray()); IPAddress ciel_adres = new IPAddress(paket.Bytes.Skip(30).Take(4).ToArray()); Smerovaci_zaznam smerovaci_zaznam = null; string via = null; IPv4Packet ip_pak = (IPv4Packet)eth.PayloadPacket; ip_pak.UpdateIPChecksum(); if ((ciel_adres.ToString() == rozhranie1.ip_adresa || ciel_adres.ToString() == rozhranie2.ip_adresa) && (int)eth.Bytes[23] == 1) { ICMPv4Packet ping = (ICMPv4Packet)ip_pak.PayloadPacket; if ((int)eth.Bytes[34] == 8) { ping.Checksum = 0; ping.TypeCode = ICMPv4TypeCodes.EchoReply; byte[] bytes = BitConverter.GetBytes(GetCrc(ping.Bytes)); Array.Reverse(bytes); ushort result = BitConverter.ToUInt16(bytes, 0); ping.Checksum = result; ip_pak.SourceAddress = ciel_adres; ip_pak.DestinationAddress = odosielatel_address; ip_pak.PayloadPacket = ping; ip_pak.UpdateIPChecksum(); eth.PayloadPacket = ip_pak; smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(odosielatel_address); if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1) { smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via); } if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X") { via = smerovaci_zaznam.next_hop; } if (smerovaci_zaznam != null) { if (smerovaci_zaznam.exit_interface == 2) { rozhranie = rozhranie2; } if (smerovaci_zaznam.exit_interface == 1) { rozhranie = rozhranie1; } Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, odosielatel_address)); posielanie.Start(); } } else if ((int)eth.Bytes[34] == 0) { if (zapis_ping) { // main_view.vypis("!", 99); main_view.lbl_ping += "!"; zapis_ping = false; } } } else if ((ciel_adres.ToString() == rozhranie.ip_adresa || ciel_adres.ToString() == "224.0.0.9") && ((int)eth.Bytes[43] == 2)) { spracuj_rip(eth, paket, rozhranie, odosielatel_address); } else { smerovaci_zaznam = najdi_zaznam_v_smerovacej_tabulke(ciel_adres); if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface == -1) { smerovaci_zaznam = rekurzivne_prehladanie(smerovaci_zaznam, ref via); } if (smerovaci_zaznam != null && smerovaci_zaznam.exit_interface != -1 && smerovaci_zaznam.next_hop != "X") { via = smerovaci_zaznam.next_hop; } if (smerovaci_zaznam != null) { if (smerovaci_zaznam.exit_interface == 1) { rozhranie = rozhranie1; } if (smerovaci_zaznam.exit_interface == 2) { rozhranie = rozhranie2; } Thread posielanie = new Thread(() => preposli(rozhranie, eth, smerovaci_zaznam, via, ciel_adres)); posielanie.Start(); } } } } if (zastav_vlakno) { rozhranie.adapter.Close(); } }
public void pocuvaj_rozhranie2(Rozhranie rozhranie) { rozhranie.adapter.OnPacketArrival += new PacketArrivalEventHandler(zachytenie_rozhranie2); rozhranie.adapter.Open(DeviceMode.Promiscuous); rozhranie.adapter.StartCapture(); }
public Rozhranie nastav_ip(Rozhranie rozhranie, int cislo_rozhrania) { rozhranie = new Rozhranie(zoznam_adapterov[main_view.adaptery_index], main_view.ip_adresa, main_view.maska, cislo_rozhrania); return(rozhranie); }