
Быстрая и расширяемая библиотека для сканирования сетей, поддерживающая многопоточность, проверку 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);