
مكتبة مسح شبكات سريعة وقابلة للتوسع تتميز بتعدد الخيوط، واستقصاء ping، وجلبات المسح.
مكتبة الرائد هي مكتبة شبكات سريعة وخفيفة وقابلة للتوسع، أُنشئت للمساعدة في تطوير تطبيقات مركزة على الشبكات مثل: ماسحات IP، وأدوات طرق المنافذ (Port Knockers)، والعملاء، والخوادم، وغيرها. في حالتها الحالية، تستطيع مكتبة الرائد مسح IP وعمل طرق منافذ بشكل متزامن وغير متزامن للحصول على معلومات حول الجهاز الموجود في تلك النقطة الطرفية مثل: معرفة ما إذا كان IP متصلاً بالإنترنت، وعنوان MAC الفعلي، وغيرها. المكتبة موجهة بالكامل للكائنات ومبنية على الأحداث، مما يعني أن بيانات المسح محفوظة ضمن كائنات "مسح" مصممة خصيصاً للتعامل مع جميع البيانات بدءاً من النتائج وصولاً إلى الاستثناءات.
| الطريقة | الوصف | الاستخدام |
|---|---|---|
| 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 | إرسال طلب ping لكل منفذ في IP واحد | PortKnock("192.168.1.1"); |
| PortKnockRange | إرسال طلب ping لكل منفذ في نطاق من عناوين IP | PortKnockRange("192.168.1.1", "192.168.1.255"); |
| PortKnockList | إرسال طلب ping لكل منفذ باستخدام قائمة عناوين IP | PortKnockList("192.198.1.1, 192.168.1.2, 192.168.1.3"); |
| IsHostAlive | إرسال ping إلى مضيف N مرة لمدة X مللي ثانية | IsHostAlive("192.168.1.1", 5, 1000); |
| GetAveragePingResponse | الحصول على متوسط زمن الاستجابة للـ ping لمضيف | GetAveragePingResponse("192.168.1.1", 5, 1000); |
| IsPortOpen | إرسال ping إلى منافذ فردية عبر TCP و UDP | IsPortOpen("192.168.1.1", 45000, new TimeSpan(1000), false); |
يعد مسح الشبكة مهمة شائعة في هذا العصر الرقمي، ولذا فقد أخذت على عاتقي جعل هذا الأمر بسيطاً قدر الإمكان لأي مبرمج مستقبلي قد يرغب في فعل شيء كهذا بطريقة سهلة. مكتبة الرائد موجهة بالكامل للكائنات، مما يجعلها مثالية لمواقف التوصيل والتشغيل؛ الكائن الخاص بمسح 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، وبهذه الطريقة يكون لدي التحكم الكامل في طرق non المتزامنة الخاصة بي؛ يمكنني التحكم في كيفية تأثير حالات التقدم في تطبيقاتي وهكذا؛ على سبيل المثال:
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!")
}
}
}
أعرف ما تفكر فيه. طرق المنافذ؟ نعم، ولا. لا يعني المصطلح طرق المنافذ بالمعنى التقليدي للاتصال من خلال مجموعة محددة مسبقاً من المنافذ، بل يعني فقط التحقق مما إذا كانت أي منافذ مفتوحة بالفعل. إنه حرفياً "طرق" على منفذ بكل معنى الكلمة عن طريق محاولة الاتصال بكل منفذ وإرسال البيانات. كما هو الحال مع مسح IP، يستخدم طرق المنافذ كائنًا مخصصًا يسمى "Port Knock Scan Object" أو PKScanObject باختصار. يحتوي PKScanObject في الواقع على قائمة من PKServiceObject والتي تحمل بدورها بيانات المنفذ الخاصة بنا؛ يحتوي كائن الخدمة على الخصائص التالية:
طرق المنافذ مشابه لمسح 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());
}