네트워크 및 보안/SharpPcap

[네트워크 보안] 3. SharpPcap 이용하여 패킷 캡쳐 맛보기

언제나휴일 2016. 5. 18. 15:51
반응형

[네트워크 보안] 3. SharpPcap 이용하여 패킷 캡쳐 맛보기




안녕하세요. 언제나 휴일, 언휴예요.


앞에서 SharpPcap 설치와 ICaptureDevcie 의 목록을 확인해 보았죠.


하지만 실질적인 네트워크 상에 흐르는 패킷을 캡쳐하는 작업을 하지 않아 밋밋한 느낌을 받으신 분들도 많았을 거예요.


이번에는 드디어 SharpPcap 라이브러리를 이용하여 캡쳐를 원하는 장치를 선택하여 해당 장치에 지나다니는 패킷을 캡쳐하는 프로그램을 만들어 볼 거예요. 다음은 이번에 작성할 프로그램의 실행 화면이예요.

SharpPcap 라이브러리를 이용하여 패킷 캡쳐 맛보기


보시는 것처럼 아직까지는 패킷의 실질적인 데이터를 분석하는 기능은 넣지 않았어요. 앞으로 다양한 프로토콜 별로 하나 하나 분석하면서 SharpPcap을 이용하는 다양한 프로그래밍을 해 볼 거예요. 와이어샤크나 TShark를 흉내내기라고 보면 적합할 거 같네요.


이번에도 C# 언어로 콘솔 응용 프로그램으로 만들거예요. 프로젝트를 생성한 후에 SharpPacp 관련 닷넷 어셈블리를 참조 추가하는 것을 잊지 마세요. 이 부분은 첫 번째 게시글 "[네트워크 보안] 1. SharpPcap 설치 및 테스트"에서 다룬 내용이죠.


다음처럼 소스를 편집하세요.



using SharpPcap;

using System;

using System.Linq;

 

namespace FirstPacketCapture

{

    class Program

    {

먼저 캡쳐한 패킷 개수와 전체 바이트 수를 기억할 멤버를 선언하세요. 아직 시작하는 단계라 별도의 클래스를 제작하는 것은 하지 않을게요. 

        static int pcnt = 0; //캡쳐한 패킷 개수

        static int total = 0; //캡쳐한 전체 패킷 바이트

        static void Main(string[] args)

        {

            Console.WriteLine("SharpPcap - 패킷 캡쳐 맛보기 소개");

 

먼저 사용자가 추적할 수 있는 네트워크 인터페이스(여기에서는 캡쳐 장치라고 부르고 있어요.)를 선택할 수 있게 목록을 출력해 주어야겠죠. 네트워크 인터페이스 목록을 출력하는 부분은 앞에서 실습했던 내용과 차이가 없어요. 

            //추적할 수 있는 네트워크 인터페이스 목록 참조

            CaptureDeviceList devices = CaptureDeviceList.Instance;

 

            //목록의 개수가 0일 때 메시지 출력 및 종료

            if (devices.Count == 0)

            {

                Console.WriteLine("추적할 수 있는 네트워크 인터페이스 장치를 찾을 수 없습니다.");

                return;

            }

 

            //네트워크 인터페이스 목록 출력

            Console.WriteLine("추적 장치 목록");

            int seq = 0;

            foreach (ICaptureDevice dev in devices)

            {

                seq++;

                Console.WriteLine("{0}th 장치 이름:{1}",seq, dev.Name);               

            }

 

사용자로부터 추적할 장치를 선택할 수 있게 하세요.

            //추적할 캡쳐 장치 선택

            Console.WriteLine("장치를 선택하세요.1~{0}", devices.Count);

            int index = 0;

            if(int.TryParse(Console.ReadLine(),out seq))

            {

                index = seq-1;

            }

 

            //선택한 장치

            ICaptureDevice icd = devices[index];

 

장치를 선택하였으면 패킷이 도착하였을 때 수행할 이벤트 핸들러를 등록해야겠죠. 만약 이벤트 핸들러가 무엇인지 모르면 C# 게시글에서 해당 내용을 학습하실 것을 권합니다.

            //패킷 도착 이벤트 핸들러 등록

            icd.OnPacketArrival += Icd_OnPacketArrival;

 

장치를 열고 캡쳐를 시작합니다.

            //캡쳐 장치 열기

            icd.Open(DeviceMode.Normal);

 

            //캡쳐 시작

            icd.StartCapture();

           


사용자가 엔터를 입력하기 전까지 캡쳐할 수 있게 합시다.

            Console.Write("엔터를 누르면 캡쳐를 멈춥니다.");

            Console.ReadLine();

 

사용자가 엔터를 입력하면 캡쳐를 멈추고 장치를 닫습니다.

            //캡쳐 멈추기 및 캡쳐 장치 닫기

            icd.StopCapture();

            icd.Close();

 

캡쳐한 정보를 출력하세요.

            //캡쳐 정보 출력

            Console.WriteLine("{0}개의 패킷 {1} bytes 캡쳐하였습니다.", pcnt, total);

 

            Console.Write("엔터를 누르면 프로그램을 종료합니다.");

            Console.ReadLine();

        }

 

 여기에서 가장 중요한 부분은 패킷을 캡쳐하였을 때 수행하는 이벤트 핸들러겠죠. 

        private static void Icd_OnPacketArrival(object sender, CaptureEventArgs e)

        {

이벤트 인자의 Packet 속성으로  RawCapture(가공하지 않은 캡쳐 정보)를 참조하세요.

            RawCapture rc = e.Packet;

수집한 패킷 개수를 1 증가하고 캡쳐 정보를 출력하세요.

            pcnt++;

            Console.WriteLine("{0}th {1}bytes",pcnt,rc.Data.Length);

수집한 바이트 수를 누적 계산합니다.

            total += rc.Data.Length;

        }

    }

}


여기에서는 단순히 몇 개의 패킷을 캡쳐하였는지와 캡쳐한 패킷의 바이트 수를 출력하는 프로그램이었죠.


앞으로 패킷의 정보를 분석하는 작업들을 진행해 나갈 거예요. 이를 위해서 네트워크 프로토콜 학습은 필수겠죠.


이번 실습은 여기서 마칠게요.


모두 행복한 하루~


실습한 결과물

FirstPacketCapture.zip


반응형