
Schnelle und erweiterbare Netzwerkscan-Bibliothek mit Multithreading, Ping-Probing und Scan-Fetcher.
Die Forerunner-Bibliothek ist eine schnelle, leichte und erweiterbare Netzwerkbibliothek, die zur Entwicklung robuster netzwerkzentrierter Anwendungen wie IP-Scanner, Port-Knocker, Clients, Server usw. entwickelt wurde. In ihrem aktuellen Zustand kann die Forerunner-Bibliothek sowohl synchron als auch asynchron IP-Adressen scannen und Port-Knocking durchführen, um Informationen über das Gerät an diesem Endpunkt zu erhalten, z. B. ob die IP online ist, die physische MAC-Adresse usw. Die Bibliothek ist vollständig objektorientiert und ereignisbasiert aufgebaut, was bedeutet, dass Scandaten in speziell entwickelten "Scan"-Objekten enthalten sind, die alle Daten von Ergebnissen bis hin zu Ausnahmen verarbeiten sollen.
| Methode | Beschreibung | Verwendung |
|---|---|---|
| Scan | Scannt eine einzelne IP nach Informationen | Scan("192.168.1.1"); |
| ScanRange | Scannt einen IP-Bereich nach Informationen | ScanRange("192.168.1.1", "192.168.1.255") |
| ScanList | Scannt eine Liste von IPs nach Informationen | ScanList("192.168.1.1, 192.168.1.2, 192.168.1.3") |
| PortKnock | Pingt jeden Port einer einzelnen IP | PortKnock("192.168.1.1"); |
| PortKnockRange | Pingt jeden Port in einem IP-Bereich | PortKnockRange("192.168.1.1", "192.168.1.255"); |
| PortKnockList | Pingt jeden Port unter Verwendung einer Liste von IPs | PortKnockList("192.198.1.1, 192.168.1.2, 192.168.1.3"); |
| IsHostAlive | Pingt einen Host N-mal für X Millisekunden | IsHostAlive("192.168.1.1", 5, 1000); |
| GetAveragePingResponse | Ermittelt die durchschnittliche Ping-Antwortzeit für einen Host | GetAveragePingResponse("192.168.1.1", 5, 1000); |
| IsPortOpen | Pingt einzelne Ports über TCP und UDP | IsPortOpen("192.168.1.1", 45000, new TimeSpan(1000), false); |
Das Scannen eines Netzwerks ist eine alltägliche Aufgabe in diesem digitalen Zeitalter, und ich habe mir die Freiheit genommen, dies für jeden zukünftigen Programmierer, der so etwas auf einfache Weise tun möchte, so einfach wie möglich zu gestalten. Die Forerunner-Bibliothek ist vollständig objektorientiert und daher ideal für Plug-and-Play-Situationen; das Objekt für das IP-Scanning heißt IPScanObject und enthält tatsächlich einige Eigenschaften:
Mit diesem Objekt im Hinterkopf wollen wir nun ein neues Objekt erstellen und damit einen Scan durchführen. Es gibt mehrere Möglichkeiten, dies anzugehen, aber der einfachste Weg, um loszulegen, besteht darin, zuerst ein neues Scanner-Objekt zu erstellen, um auf unsere Scan-Methoden zugreifen zu können. Erstellen Sie als Nächstes ein IPScanObject und setzen Sie es auf die Scan-Methode mit der IP, die Sie auflisten möchten; zum Beispiel:
using System;
using Forerunner; // Denken Sie daran, unsere Bibliothek zu importieren.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Unsere IP, die wir scannen möchten.
string ip = "192.168.1.1";
// Ein neues Scanner-Objekt erstellen.
Scanner s = new Scanner();
// Ein neues Scan-Objekt erstellen und einen Scan durchführen.
IPScanObject result = s.Scan(ip);
// Ausgabe, dass der Scan abgeschlossen ist.
if (result.Errors != null)
Console.WriteLine("[x] Während des Scans ist ein Fehler aufgetreten.");
else
Console.WriteLine("[+] " + ip + " wurde erfolgreich gescannt!")
// Dem Benutzer erlauben, jederzeit zu beenden.
Console.Read();
}
}
}
Eine andere Möglichkeit, die meine bevorzugte Vorgehensweise ist, besteht darin, ein Scanner-Objekt zu erstellen und die Event Handler von Dingen wie ScanAsyncProgressChanged oder ScanAsyncComplete zu abonnieren, sodass ich die volle Kontrolle über meine asynchronen Methoden habe; ich kann steuern, wie sich ihre Fortschrittszustände auf meine Anwendung auswirken usw.; zum Beispiel:
using System;
using System.Threading.Tasks;
using Forerunner; // Denken Sie daran, unsere Bibliothek zu importieren.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Unsere IP, die wir scannen möchten.
string ip = "192.168.1.1";
// Unser Scanner-Objekt einrichten.
Scanner s = new Scanner();
s.ScanAsyncProgressChanged += new ScanAsyncProgressChangedHandler(ScanAsyncProgressChanged);
s.ScanAsyncComplete += new ScanAsyncCompleteHandler(ScanAsyncComplete);
// Eine neue Scan-Aufgabe mit unserer IP starten.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.ScanAsync(ip));
// Dem Benutzer erlauben, jederzeit zu beenden.
Console.Read();
}
static void ScanAsyncProgressChanged(object sender, ScanAsyncProgressChangedEventArgs e)
{
// Hier etwas mit e.Progress tun, oder Sie könnten dieses Ereignis
// abbestellen, sodass Sie nichts tun müssten.
}
static void ScanAsyncComplete(object sender, ScanAsyncCompleteEventArgs e)
{
// Etwas mit dem IPScanObject, auch bekannt als e.Result, tun.
if (e.Result.Errors != null)
Console.WriteLine("[x] Während des Scans ist ein Fehler aufgetreten.");
else
Console.WriteLine("[+] " + e.Result.IP + " wurde erfolgreich gescannt!")
}
}
}
Ich weiß, was Sie denken. Port-Knocking? Ja und nein. Der Begriff bedeutet nicht Port-Knocking im herkömmlichen Sinne des Verbindens über eine vordefinierte Reihe von Ports, sondern vielmehr nur das Überprüfen, ob überhaupt Ports geöffnet sind. Es ist buchstäblich ein "Anklopfen" an einem Port in jeder Hinsicht, indem versucht wird, eine Verbindung zu jedem Port herzustellen und Daten zu senden. Genau wie beim IP-Scanning verwendet das Port-Knocking ein benutzerdefiniertes Objekt, das "Port Knock Scan Object" oder kurz PKScanObject genannt wird. Das PKScanObject enthält tatsächlich eine Liste von PKServiceObjects, die wiederum unsere Portdaten enthalten; das Serviceobjekt enthält die folgenden Eigenschaften:
Das Port-Knocking erfolgt auf ähnliche Weise wie das IP-Scanning. Erstellen Sie zuerst ein Scanner-Objekt. Erstellen Sie als Nächstes ein neues PKScanObject und setzen Sie es auf die PortKnock-Methode mit der IP Ihrer Wahl, und zeigen Sie dann Ihre Ergebnisse an; zum Beispiel:
using System;
using Forerunner; // Denken Sie daran, unsere Bibliothek zu importieren.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Unsere IP, die wir scannen möchten.
string ip = "192.168.1.1";
// Ein neues Scanner-Objekt erstellen.
Scanner s = new Scanner();
// Ein neues Scan-Objekt erstellen und einen Scan durchführen.
PKScanObject result = s.PortKnock(ip);
// Ausgabe, dass der Scan abgeschlossen ist.
if (result.Errors != null)
Console.WriteLine("[x] Während des Scans ist ein Fehler aufgetreten.");
else
Console.WriteLine("[+] " + ip + " wurde erfolgreich gescannt!")
// Ergebnisse anzeigen.
foreach (PKServiceObject port in result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Port: " + port.Port.ToString() + " | " +
"Protocol: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
// Dem Benutzer erlauben, jederzeit zu beenden.
Console.Read();
}
}
}
Abschließend zeige ich Ihnen ein einfaches Beispiel für asynchrones Port-Knocking. Es ist im Wesentlichen dasselbe wie synchrones Port-Knocking, außer dass Sie Ereignisse zu Ihrem Vorteil nutzen können. Sie können Fortschrittsaktualisierungen erhalten, ohne sich um abstürzende Benutzeroberflächen oder gesperrte Systeme sorgen zu müssen; zum Beispiel:
using System;
using System.Threading.Tasks;
using Forerunner; // Denken Sie daran, unsere Bibliothek zu importieren.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Unsere IP, die wir scannen möchten.
string ip = "192.168.1.1";
// Unser Scanner-Objekt einrichten.
Scanner s = new Scanner();
s.PortKnockAsyncProgressChanged += new PortKnockAsyncProgressChangedHandler(PortKnockAsyncProgressChanged);
s.PortKnockAsyncComplete += new PortKnockAsyncCompleteHandler(PortKnockAsyncComplete);
// Eine neue Scan-Aufgabe mit unserer IP starten.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.PortKnockAsync(ip));
// Dem Benutzer erlauben, jederzeit zu beenden.
Console.Read();
}
static void PortKnockAsyncProgressChanged(object sender, PortKnockAsyncProgressChangedEventArgs e)
{
// Fortschritt anzeigen, damit wir die voraussichtliche Restzeit kennen.
if (e.Progress == 99)
{
Console.Write(e.Progress.ToString() + "%...");
Console.WriteLine("100%!");
}
else
Console.Write(e.Progress.ToString() + "%...");
}
static void PortKnockAsyncComplete(object sender, PortKnockAsyncCompleteEventArgs e)
{
// Dem Benutzer mitteilen, dass das Port-Knocking abgeschlossen ist.
Console.WriteLine("[+] Port-Knocking abgeschlossen!");
// Prüfen, ob ein Fehler aufgetreten ist.
if (e.Result == null)
Console.WriteLine("[X] Das Port-Knocking hat keine Daten zurückgegeben!");
else
{
// Prüfen, ob Ports aufgezeichnet wurden.
if (e.Result.Services.Count == 0)
Console.WriteLine("[!] Während des Knockings waren keine Ports offen.");
else
{
// Ports und ihre Details anzeigen.
foreach (PKServiceObject port in e.Result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Port: " + port.Port.ToString() + " | " +
"Protocol: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
}
}
}
}
}
Icon: monkik
https://www.flaticon.com/authors/monkik
Copyright © ∞ Jason Drawdy
Alle Rechte vorbehalten.
Die MIT-Lizenz (MIT)
Hiermit wird jeder Person, die eine Kopie dieser Software und der zugehörigen Dokumentationsdateien (die "Software") erhält, kostenlos die Erlaubnis erteilt, die Software ohne Einschränkung zu nutzen, einschließlich und ohne Einschränkung der Rechte zur Nutzung, Vervielfältigung, Änderung, Zusammenführung, Veröffentlichung, Verteilung, Unterlizenzierung und/oder zum Verkauf von Kopien der Software, und Personen, denen die Software zur Verfügung gestellt wird, dies unter den folgenden Bedingungen zu gestatten:
Der obige Urheberrechtshinweis und dieser Genehmigungshinweis müssen in allen Kopien oder wesentlichen Teilen der Software enthalten sein.
DIE SOFTWARE WIRD "WIE BESEHEN" ZUR VERFÜGUNG GESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN DRITTER. IN KEINEM FALL SIND DIE AUTOREN ODER URHEBERRECHTSINHABER HAFTBAR FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER ANDERE VERPFLICHTUNGEN, OB AUS VERTRAG, UNERLAUBTER HANDLUNG ODER ANDERWEITIG, DIE AUS ODER IM ZUSAMMENHANG MIT DER SOFTWARE ODER DER NUTZUNG ODER ANDEREN GESCHÄFTEN MIT DER SOFTWARE ENTSTEHEN.
Sofern nicht in diesem Hinweis enthalten, darf der Name des obigen Urheberrechtsinhabers nicht für Werbung oder zur Förderung des Verkaufs, der Nutzung oder anderer Geschäfte mit dieser Software ohne vorherige schriftliche Genehmigung verwendet werden.