Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Forerunner — 빠르고 확장 가능한 네트워크 스캐닝 라이브러리로, 멀티스레딩, 핑 프로빙, 스캔 페처를 제공합니다. | Kitploit
도구/GitHubGitHub/jasondrawdy/forerunner
ReconnaissanceNetwork MappingPort ScanningInformation GatheringUtilities & Frameworks
GitHubjasondrawdy/forerunner

Forerunner

빠르고 확장 가능한 네트워크 스캐닝 라이브러리로, 멀티스레딩, 핑 프로빙, 스캔 페처를 제공합니다.

저장소 보기
3914166년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Forerunner

Forerunner 라이브러리는 빠르고 가벼우며 확장 가능한 네트워킹 라이브러리로, IP 스캐너, 포트 노커, 클라이언트, 서버 등 강력한 네트워크 중심 애플리케이션 개발을 지원하기 위해 만들어졌습니다. 현재 상태에서 Forerunner 라이브러리는 동기 및 비동기 방식으로 IP 주소를 스캔하고 포트 노킹하여 해당 엔드포인트에 위치한 장치의 정보(IP 온라인 여부, 물리적 MAC 주소 등)를 얻을 수 있습니다. 이 라이브러리는 완전히 객체 지향적이고 이벤트 기반으로, 스캔 데이터는 결과부터 예외까지 모든 데이터를 처리하도록 설계된 특별히 제작된 "스캔" 객체에 포함됩니다.

요구 사항

  • .NET Framework 4.6.1

기능

메서드설명사용법
Scan단일 IP를 스캔하여 정보를 얻습니다.Scan("192.168.1.1");
ScanRangeIP 범위를 스캔하여 정보를 얻습니다.ScanRange("192.168.1.1", "192.168.1.255")
ScanListIP 목록을 스캔하여 정보를 얻습니다.ScanList("192.168.1.1, 192.168.1.2, 192.168.1.3")
PortKnock단일 IP의 모든 포트를 핑합니다.PortKnock("192.168.1.1");
PortKnockRangeIP 범위의 모든 포트를 핑합니다.PortKnockRange("192.168.1.1", "192.168.1.255");
PortKnockListIP 목록을 사용하여 모든 포트를 핑합니다.PortKnockList("192.198.1.1, 192.168.1.2, 192.168.1.3");
IsHostAlive호스트에 N번 X밀리초 동안 핑합니다.IsHostAlive("192.168.1.1", 5, 1000);
GetAveragePingResponse호스트의 평균 핑 응답을 얻습니다.GetAveragePingResponse("192.168.1.1", 5, 1000);
IsPortOpenTCP 및 UDP를 통해 개별 포트를 핑합니다.IsPortOpen("192.168.1.1", 45000, new TimeSpan(1000), false);

예제

IP 스캐닝

네트워크 스캐닝은 디지털 시대의 흔한 작업이므로, 이를 간단하게 수행하고자 하는 미래의 프로그래머를 위해 최대한 쉽게 만들었습니다. Forerunner 라이브러리는 완전히 객체 지향적이어서 플러그 앤 플레이 상황에 이상적입니다. IP 스캐닝을 위한 객체는 IPScanObject라고 하며, 실제로 몇 가지 속성을 포함합니다:

  • Address (String)
  • IP (IPAddress)
  • Ping (Long)
  • Hostname (String)
  • MAC (String)
  • isOnline (Bool)
  • Errors (Exception)

이 객체를 염두에 두고, 새 객체를 만들어 스캔을 수행해 보겠습니다. 여러 가지 방법이 있지만, 시작하는 가장 간단한 방법은 먼저 새 Scanner 객체를 생성하여 스캐닝 메서드에 접근하는 것입니다. 그 다음, IPScanObject를 생성한 후, 열거하려는 IP와 함께 Scan 메서드에 할당합니다. 예를 들어:

동기
root@kitploit:~
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와 같은 Event Handlers에 구독하는 것입니다. 이렇게 하면 비동기 메서드를 완전히 제어할 수 있으며, 진행 상태가 애플리케이션에 미치는 영향을 제어할 수 있습니다. 예를 들어:

비동기
root@kitploit:~
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 (String)
  • Port (Int)
  • Protocol (PortType)
  • Status (Bool)

포트 노킹은 IP 스캐닝과 유사한 방식입니다. 먼저 Scanner 객체를 생성합니다. 다음으로, 새 PKScanObject를 생성하고 선택한 IP와 함께 PortKnock 메서드에 할당한 후 결과를 표시합니다. 예를 들어:

동기
root@kitploit:~
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();
        }
    }
}

마지막으로, 비동기 포트 노킹의 간단한 예를 보여드리겠습니다. 이는 기본적으로 동기 포트 노킹과 동일하지만, 이벤트를 활용할 수 있다는 점이 다릅니다. UI 충돌이나 시스템 잠금 상태를 걱정하지 않고 진행 상황 업데이트를 받을 수 있습니다. 예를 들어:

비동기
root@kitploit:~
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

All rights reserved.

MIT 라이선스 (MIT)

이에 따라 본 소프트웨어 및 관련 문서 파일(이하 "소프트웨어")의 사본을 획득하는 모든 사람에게 다음과 같은 조건에 따라 소프트웨어를 제한 없이 다룰 수 있는 권한이 무료로 부여됩니다. 이 권한에는 소프트웨어의 사용, 복사, 수정, 병합, 게시, 배포, 서브라이선스 및/또는 판매할 권리와 소프트웨어를 제공받은 사람이 이를 수행하도록 허용할 권리가 포함되며, 다음 조건을 따릅니다.

위의 저작권 표시와 이 허가 표시는 소프트웨어의 모든 복사본 또는 주요 부분에 포함되어야 합니다.

소프트웨어는 "있는 그대로" 제공되며, 상품성, 특정 목적에의 적합성 및 비침해에 대한 보증을 포함하되 이에 국한되지 않는 어떠한 명시적 또는 묵시적 보증도 없이 제공됩니다. 어떠한 경우에도 저작자나 저작권 소유자는 계약, 불법 행위 또는 기타 행위로 인해 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래와 관련하여 발생하는 모든 청구, 손해 또는 기타 책임에 대해 책임을 지지 않습니다.

본 고지에 명시된 경우를 제외하고, 위 저작권 보유자의 이름은 사전 서면 승인 없이 이 소프트웨어의 판촉, 판매 또는 기타 거래에 사용될 수 없습니다.

도구 다운로드