
Быстрая и расширяемая библиотека для сканирования сетей, поддерживающая многопоточность, проверку ping и сборщики сканирования.
Библиотека Forerunner представляет собой быструю, легковесную и расширяемую сетевую библиотеку, созданную для помощи в разработке надежных сетевых приложений, таких как: IP-сканеры, port knockers, клиенты, серверы и т.д. В текущем состоянии библиотека Forerunner способна как синхронно, так и асинхронно сканировать и выполнять port knocking IP-адресов для получения информации об устройстве, расположенном по этому адресу, такой как: доступен ли IP в сети, физический MAC-адрес и т.п. Библиотека полностью объектно-ориентирована и основана на событиях, что означает, что данные сканирования содержатся в специально созданных объектах «scan», предназначенных для обработки всех данных — от результатов до исключений.
| Метод | Описание | Использование |
|---|---|---|
| Scan | Сканировать один IP для получения информации | Scan("192.168.1.1"); |
| ScanRange | Сканировать диапазон IP-адресов для получения информации | ScanRange("192.168.1.1", "192.168.1.255") |
| ScanList | Сканировать список IP-адресов для получения информации | ScanList("192.168.1.1, 192.168.1.2, 192.168.1.3") |
| PortKnock | Проверить каждый порт одного IP-адреса | PortKnock("192.168.1.1"); |
| PortKnockRange | Проверить каждый порт в диапазоне IP-адресов | PortKnockRange("192.168.1.1", "192.168.1.255"); |
| PortKnockList | Проверить каждый порт по списку IP-адресов | PortKnockList("192.198.1.1, 192.168.1.2, 192.168.1.3"); |
| IsHostAlive | Пинговать хост N раз в течение X миллисекунд | IsHostAlive("192.168.1.1", 5, 1000); |
| GetAveragePingResponse | Получить среднее время отклика хоста на ping | GetAveragePingResponse("192.168.1.1", 5, 1000); |
| IsPortOpen | Проверить отдельные порты через TCP и UDP | IsPortOpen("192.168.1.1", 45000, new TimeSpan(1000), false); |
Сканирование сети — обычная задача в нашу цифровую эпоху, поэтому я взял на себя смелость сделать это максимально простым для любого будущего программиста, который пожелает сделать это простым способом. Библиотека Forerunner полностью объектно-ориентирована, что делает её идеальной для ситуаций «подключи и работай»; объект для сканирования IP называется IPScanObject, и он содержит довольно много свойств:
Учитывая этот объект, давайте попробуем создать новый объект и выполнить сканирование с его помощью. Есть несколько способов сделать это, однако самый простой способ начать — сначала создать новый объект Scanner, чтобы получить доступ к нашим методам сканирования. Затем создайте IPScanObject и присвойте его методу Scan с IP-адресом, который вы хотите перечислить; например:
using System;
using Forerunner; // Remember to import our library.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Our IP we would like to scan.
string ip = "192.168.1.1";
// Create a new scanner object.
Scanner s = new Scanner();
// Create a new scan object and perform a scan.
IPScanObject result = s.Scan(ip);
// Output that we have finished the scan.
if (result.Errors != null)
Console.WriteLine("[x] An error occurred during the scan.");
else
Console.WriteLine("[+] " + ip + " has been successfully scanned!")
// Allow the user to exit at any time.
Console.Read();
}
}
}
Другой способ, который является моим предпочтительным методом работы, — создать объект Scanner и подписаться на Обработчики событий, такие как ScanAsyncProgressChanged или ScanAsyncComplete, чтобы иметь полный контроль над моими асинхронными методами; я могу контролировать, как их состояния прогресса влияют на мое приложение и так далее; например:
using System;
using System.Threading.Tasks;
using Forerunner; // Remember to import our library.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Our IP we would like to scan.
string ip = "192.168.1.1";
// Setup our scanner object.
Scanner s = new Scanner();
s.ScanAsyncProgressChanged += new ScanAsyncProgressChangedHandler(ScanAsyncProgressChanged);
s.ScanAsyncComplete += new ScanAsyncCompleteHandler(ScanAsyncComplete);
// Start a new scan task with our ip.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.ScanAsync(ip));
// Allow the user to exit at any time.
Console.Read();
}
static void ScanAsyncProgressChanged(object sender, ScanAsyncProgressChangedEventArgs e)
{
// Do something here with e.Progress, or you could leave this event
// unsubscribed so you wouldn't have to do anything.
}
static void ScanAsyncComplete(object sender, ScanAsyncCompleteEventArgs e)
{
// Do something with the IPScanObject aka e.Result.
if (e.Result.Errors != null)
Console.WriteLine("[x] An error occurred during the scan.");
else
Console.WriteLine("[+] " + e.Result.IP + " has been successfully scanned!")
}
}
}
Я знаю, о чём вы думаете. Port knocking? И да, и нет. Этот термин означает не традиционный port knocking (подключение через заранее заданный набор портов), а скорее просто проверку, какие порты открыты. Это буквально «стук» в каждый порт путём попытки подключиться к каждому порту и отправки данных. Как и при сканировании IP, port knocking использует пользовательский объект, который называется «Port Knock Scan Object» или сокращённо PKScanObject. PKScanObject содержит список PKServiceObject, которые, в свою очередь, хранят данные о портах; сервисный объект содержит следующие свойства:
Port knocking выполняется аналогично сканированию IP. Сначала создайте объект Scanner. Затем создайте новый PKScanObject и присвойте его методу PortKnock с выбранным вами IP, после чего отобразите результаты; например:
using System;
using Forerunner; // Remember to import our library.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Our IP we would like to scan.
string ip = "192.168.1.1";
// Create a new scanner object.
Scanner s = new Scanner();
// Create a new scan object and perform a scan.
PKScanObject result = s.PortKnock(ip);
// Output that we have finished the scan.
if (result.Errors != null)
Console.WriteLine("[x] An error occurred during the scan.");
else
Console.WriteLine("[+] " + ip + " has been successfully scanned!")
// Display our results.
foreach (PKServiceObject port in result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Port: " + port.Port.ToString() + " | " +
"Protocol: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
// Allow the user to exit at any time.
Console.Read();
}
}
}
Наконец, я покажу вам простой пример асинхронного port knocking. Он практически аналогичен синхронному, за исключением того, что вы можете использовать события для своей выгоды. Вы можете получать обновления прогресса, не беспокоясь о сбоях интерфейсов или блокировках системы; например:
using System;
using System.Threading.Tasks;
using Forerunner; // Remember to import our library.
namespace Example
{
class Program
{
static void Main(string[] args)
{
// Our IP we would like to scan.
string ip = "192.168.1.1";
// Setup our scanner object.
Scanner s = new Scanner();
s.PortKnockAsyncProgressChanged += new PortKnockAsyncProgressChangedHandler(PortKnockAsyncProgressChanged);
s.PortKnockAsyncComplete += new PortKnockAsyncCompleteHandler(PortKnockAsyncComplete);
// Start a new scan task with our ip.
TaskFactory task = new TaskFactory();
task.StartNew(() => s.PortKnockAsync(ip));
// Allow the user to exit at any time.
Console.Read();
}
static void PortKnockAsyncProgressChanged(object sender, PortKnockAsyncProgressChangedEventArgs e)
{
// Display our progress so we know the ETA.
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)
{
// Tell the user that the port knock was complete.
Console.WriteLine("[+] Port Knock Complete!");
// Check if we resolved an error.
if (e.Result == null)
Console.WriteLine("[X] The port knock did not return any data!");
else
{
// Check if we have any ports recorded.
if (e.Result.Services.Count == 0)
Console.WriteLine("[!] No ports were open during the knock.");
else
{
// Display our ports and their details.
foreach (PKServiceObject port in e.Result.Services)
{
Console.WriteLine("[+] IP: " + port.IP + " | " +
"Port: " + port.Port.ToString() + " | " +
"Protocol: " + port.Protocol.ToString() + " | " +
"Status: " + port.Status.ToString());
}
}
}
}
}
}
Иконка: monkik
https://www.flaticon.com/authors/monkik
Copyright © ∞ Jason Drawdy
Все права защищены.
Лицензия MIT (MIT)
Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию данного программного обеспечения и сопутствующей документации (далее — «Программное обеспечение»), без ограничения, включая без ограничения права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешение лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:
Указанное выше уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или значительные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ В КОЕМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, УЩЕРБАМ ИЛИ ДРУГИМ ТРЕБОВАНИЯМ, ВОЗНИКАЮЩИМ ИЗ ДОГОВОРА, ДЕЛИКТА ИЛИ ИНЫХ ДЕЙСТВИЙ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ЕГО ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
За исключением случаев, предусмотренных в данном уведомлении, имя указанного выше владельца авторских прав не может использоваться в рекламе или иным образом для продвижения продажи, использования или других операций с данным Программным обеспечением без предварительного письменного разрешения.