2010년 10월 1일 금요일

윈도우 기반의 네트워크 패킷 생성 도구 - NPG

오랜만에 윈도우 환경에서 사용할 수 있는 네트워크 패킷 생성 도구 하나를 소개하고자 한다.
이름은 Network Packet Generator 이며 약자로 NPG 이다. GNU GPL 라이센스로
자유롭게 사용가능하다. NPG 는 WinPcap 을 이용하여 패킷을 생성하며, 주요한 것을 요약해 보면 다음과 같다

- 오픈소스
- 윈도우 환경에서 동작
- Libpcap 기반의 패킷 생성기
- PCAP 호환 패킷 파일 또는 NPG 포맷의 파일을 이용하여 패킷 생성
- 패킷 바이트 스트림 전송

기능은 아주 다양하지는 않지만, 기존에 보아오던 것과 좀 다른 특징은 NPG 라 정의되어 있는
포맷 형태이다. 이 포맷 형태에 맞춰서 생성될 패킷의 HEX 값을 나열해 주면 된다.
이런 기능이 유용한 경우가 있기 때문에 특정 작업에서는 요긴할 것이다.

NPG 는 다음의 경로에서 받을 수 있다.


일단 아무 옵션없이 실행하면, 인터렉티브 모드로 동작하여 사용자가 선택하여 작업을 결정할 수 있는데,
처음 접하는 분들에겐 유용할 수도 있다.

C:\Npg1.3.0\bin>npg
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/

No arguments detected, using interactive mode. Use npg -h for arugments.

Output information level:

[1] None
[2] Verbose
[3] Very Verbose
[4] Very Very Verbose

Selection [3]:


이외 몇 가지 옵션을 알아보면 다음과 같다.

-h 도움말
-d 패킷을 인젝트할 네트워크 디바이스를 선택
-f NPG 패킷파일의 이름 지정
-F Libpcap 호환 패킷파일 이름 지정
-l 사용가능한 네트워크 디바이스 나열
-p <packet byte stream>
인젝트할 패킷 바이트를 HEX 값으로 나열해주면 됨
-r <repeat count>  
패킷을 몇번 반복할지 카운트를 지정
-t <interval>
패킷을 인젝트 하기 전 시간 간격을 지정 (시간 기준은 밀리세컨드)
-v, -vv, -vvv
동작 상태를 표시 v 가 많을 수록 세부정보를 표시함

옵션을 대충 봐도 무슨 기능인지 추측이 가능할 정도로 복잡하지는 않다. 예를 들어,
다음과 같이 -F 를 통해 pcap 파일을 지정해 본다면

C:\Npg1.3.0\bin>npg -vvv -F packets.cap
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/


Successfully opened file packets.cap as read only

Successfully processed 7 packets in packets.cap
599 bytes allocated in packet queue to be sent
Elapsed time : 0.000

시간 간격을 둘것인지 물어본다.

Use time intervals defined in packets.cap:

[1] Yes
[2] No

Selection [2]:
An output device must be selected for injecting the packets

기본설정은 No 이며 엔터를 치면 다음 사용가능한 디바이스를 나열해 준다.
여기서 패킷을 전송할 인터페이스 번호를 골라주면 된다.

Available devices:

[1] Network adapter 'Sun' on local host
[2] Network adapter 'NVIDIA nForce MCP Networking Adapter Driver' on local host

Select default device (1-2):2

인터페이스를 선택하면 아래와 같이 패킷을 인젝트 하여 전송한다.

Elapsed time : 0.001
7 packets successfully injected
599 bytes sent
Releasing 599 bytes used for LibpcapQueue

인터페이스를 지정하지 않으면 알아서 인터페이스를 나열해 주고, 시간간격을 지정해 주지 않아도
물어봐 준다. 그만큼 쉽게 사용 가능하다.

앞서 말한것과 같이 NPG 는 자체의 포맷 형태를 이용해 패킷을 만들어 전송할 수 있다. 이 형태를
알아보면 다음과 같다:

NPG 패킷파일은 {    } 로 둘러 쌓인 블럭으로 이뤄진다. 물론 값은 00-FF 사이의 HEX 값으로 표현되며
공백이나, 탭, 주석은 무시된다. 전송할 패킷 구성은 아래와 같은 형태 블럭으로 이뤄진다.

예제>
1. { 01 02 03 04 05 06 06 05 04 03 02 01 08 00 }
2. { 01 02 03 04 05 06
  06 05 04 03 02 01
  08 00 }
3. {0102030405060605040302010800}
4. {
0
1
0
2
0
3
}

그리고, 각 패킷 블럭이 시작되기 전 [  ] 로 묶어 표현해 주는 부분은 반복할 카운트와 시간간격을 지정하게 된다. 예를 들면 아래와 같다

[0,1000]
[3,0]

자, 그럼 NPG 파일안에 들어있는 예제파일을 한번 들여다 보자. 패킷 블럭 시작전에 [3,1000] 으로
3번 반복하고 1000 밀리세컨드 간격이 있다는 것을 뜻한다.
그리고 < > 로 묶인 부분은 이것이 어떤 형태인지 말해주는 태그이다.  그 다음 시작되는 {  } 는
실제 발송될 패킷이 기술되는 것으로 보기좋게 라인별로 기술되어 있다.
앞서 말했듯이 주석과, 공백등은 무시되므로 아래 예제와 같이 사람이 보기 좋게 나열하여
사용하는 것이 좋다.

# TCP/IP ICMP Echo Request
[3,1000]
<ICMP Echo Request>
{
# Ethernet HEADER -----

  01 02 03 04 05 06  # Destination MAC
  06 05 04 03 02 01  # Source MAC
  08 00              # Protocol

# IP HEADER -----------

  45                 # Version / Header Length
  00                 # Type of service
  00 3c              # Total length
  00 a5              # Identification
  00 00              # Flags / Fragment offset
  80                 # Time to live
  01                 # Protocol
  b8 c8              # Checksum
  c0 a8 00 02        # Source address
  c0 a8 00 01        # Destination address

# ICMP HEADER ---------

  08                 # Type
  00                 # Code
  4a 5c              # Checksum
  02 00              # Identification
  01 00              # Sequence number
  61 62 63 64 65 66  # Data (Windows ping)
  67 68 69 6a 6b 6c
  6d 6e 6f 70 71 72
  73 74 75 76 77 61
  62 63 64 65 66 67
  68 69
}

만들어진 포맷 파일을 이용하여 -f 옵션으로 전송할 수 있다.

C:\Npg1.3.0\bin>npg -vv -f packets.txt -d rpcap://\Device\NPF_{E849DA
84-A444-4334-BD12-157CFC55BD8B}
Network Packet Generator 1.3.0
Copyright (C) 2006 Jason Todd
WikiSTC - http://www.wikistc.org/


Successfully processed 3 packets in packets.txt
Elapsed time : 0.000
Injecting packet queue obeying time intervals

Waiting approximately 1000 milliseconds
Injecting Packet #1
Device: rpcap://\Device\NPF_{E849DA84-A444-4334-BD12-15XXX55BD8B}
Packet ID: ICMP Echo Request
Repeat count: 0

그리고 아래와 같이 -p 옵션을 통해 전송할 데이터를 바로 지정할 수도 있다.

C:\Npg1.3.0\bin>npg -vv -p 0001020304 -d rpcap://\Device\NPF_{E849DA8
4-A444-4334-BD12-15XXX55BD8B}

하지만 위에서 사용한 예에서는 임의로 지정한 것이기 때문에 패킷이 알 수없는 형태로 전송된다.
어떤 프로토콜 형태에 맞춰서 작성된 것이 아니기 때문이다. -p 옵션등은 명령어 옵션을 통해
바로 패킷을 전달하고자 할때 사용하면 된다.

[참고]
1. NPG
http://www.wikistc.org/wiki/Network_packet_generator
2. NPG 파일 다운로드 (요청에 의해 해당 소스 파일을 첨부해 놓습니다)

댓글 4개:

  1. 관리자님.

    부탁드립니다..

    제가 게임서버 하나를 복구할려고하는데요

    서버까지는 열엇는데 패킷에서 막힙니다..

    exe를 어셈블리로 분석하면 어떻게 될거같은데요..

    도움을 주시고싶으시면 wnsrn3436@naver.com 으로 연락주시면 감사하겟습니다^^



    참. 복구할려는게임은 쥬라기원시전2 라고합니다..

    답글삭제
  2. 혹시 NPG받아 놓으신게 있으시면 메일로 보내주시면 감사하겠습니다. 예전에 썼었는데, 다시 다운로드를 받으려고 하니, 링크에 없네요. -_-;; raptor94@naver.com
    그럼 수고하세요

    답글삭제
    답글
    1. 링크가 연결이 안되는군요. 받아 놓은게 있었던 거 같은데, 주말에 집에서 찾아보고 있으면 댓글 달아 놓을께요

      삭제
    2. 예전에 받아놓았던걸 찾았습니다. :-) 해당 파일을 본문 '참고' 에 링크를 걸어 놓았으니 다운로드 받으시면 됩니다.

      삭제