2009-08-14 2 views
0

자습서를 읽었으므로 이해하지 못했습니다. 그것은 당신이 패킷을 보낼 수있게 해주지 만, Winpcap에게 그 패킷을 보낼 곳을 어떻게 말할 수 있습니까? 어떤 ip/port에 전달할 것인지 알 수 있도록 패킷에 넣어야하는 헤더가 있습니까? 내말은. 내 목록에 누군가에게 뭔가를 쓴 것처럼, 내 MSN에 데이터를 보내고 싶다고 가정 해 봅시다. sendpacket()을 사용할 수는 있지만 패킷/바이트 배열을 인수로 사용하고 app/ip/port를 지정하지 않아야합니다.Winpcap 간단한 질문 - 지정된 IP/포트로 패킷을 보내는 방법?

감사합니다.

답변

1

패킷을 보낼 위치를 Winpcap에 지정하지 마십시오. 당신은 그것이 유선에 패킷을 넣으라고 말한다. 네트워크 스위치는 패킷을 올바른 대상으로 보냅니다. 수신 측의 TCP 스택은 올바른 애플리케이션/서비스로 패킷을 보냅니다. 분명히 이는 라우팅 정보가 패킷 자체에 있어야 함을 의미합니다.

예제를 보려면 적절한 MSN 서버의 IP 주소와 TCP 포트를 패킷에 넣어야합니다. 그렇게하지 않으면 네트워킹 하드웨어가 해당 패킷을 버리거나 잘못 라우팅합니다.

+0

그래, 2 분 전 나는 그것에 대해 생각 코드의 나머지 부분에 관련되지 // 않습니다 정의 구조에 의해 무슨 뜻인지를 표시합니다. 나는 패킷을 만들고, 거기에 정보를 설정하고, 그냥 보낸다. 어쨌든 고마워! –

1

이것은 전선을 통해 ARP 요청을 보낸 방법입니다. 1. 프로토콜 구조를 정의하십시오. 즉, ARP 패킷을 보내려는 경우 데이터 링크 계층 (이더넷 헤더)과 네트워크 계층 (ARP 헤더)이 포함될 구조가 필요합니다. 따라서 IP를 통해 tcp 패킷을 보내려면 이더넷 헤더, ip 헤더 및 tcp 헤더에 대한 데이터 구조가 필요합니다.

  1. 당신이 구조를 정의한 후에는 패킷이 FF에 이더넷 헤더의 목적지 맥 값을 설정 네트워크에있는 모든 컴퓨터로 이동하려는 경우, 당신은 즉, 원하는 값으로 구조의 인스턴스를 초기화 : FF : ff : ff : ff : ff (IP 주소가 192.168.0.88 인 컴퓨터 X로 패킷을 보내려면 ip 계층의 대상 주소를 해당 값으로 설정하십시오.

  2. 일단 완료되면 char * 배열을 선언하고 모든 구조체를 char * 배열에 복사하여 바이트 시퀀스를 만들고 와이어를 통해 보내야합니다.

// 그냥 내가

typedef struct IP_header 
{ 
    u_char  VersionNInternetHeaderLength;  // Version (4 bits) + Internet header length (4 bits) 
    /*u_char  version:4; 
    u_char  HeaderLength:4;*/ 
    u_char  Type;        // Type of service 
    u_short  TotalLength;      // Total length 
    u_short  Identification;      // Identification 

    u_char  rsv  : 1; 
    u_char  df  : 1; 
    u_char  mf  : 1; 

    u_char  FragmentOffset1 : 5; 
    u_char  FragmentOffset2; 
    //u_short  Flags_fo;       // Flags (3 bits) + Fragment offset (13 bits) 

    u_char  TimeToLive;       // Time to live 
    u_char  Protocol;       // Next level Protocol of the encapsulated payload 
    u_short  Checksum;       // Header checksum 
    IP_address SourceAddress;      // Source address 
    IP_address DestinationAddress;     // Destination address 
    u_int  OptionNPadding;      // Option + Padding 

    IP_header() 
    { 
     mf = 0; 
     rsv = 0; 
     df = 0; 
     FragmentOffset1 = 0; 
     FragmentOffset2 = 0; 

     TimeToLive = 128; 

     TotalLength = sizeof(IP_header); 
     Identification = 0xABCD; 
     Checksum = 0xABCD; 
     OptionNPadding = 0; 
    } 
}IP_header; 


Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header)); 
     ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header)); 

     ARPHeader.HardwareType = htons(1); 
     ARPHeader.ProtocolType = htons(0x800); 
     ARPHeader.OPCODE = htons(1); 

     ARPHeader.HeaderLength = 6; 
     ARPHeader.ProtocolLength = 4; 

     ARPHeader.SenderMAC = MY_FAKE_MAC; 
     ARPHeader.SenderIP = MY_IP; 

     ARPHeader.TargetMAC = MAC_address(); 
     ARPHeader.TargetIP = Whose; 

     EthernetHeader.DestinationMAC = BROADCASTMAC; 
     EthernetHeader.SourceMAC = MY_FAKE_MAC; 
     EthernetHeader.EtherType = htons(0x806); 

     u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader)); 

     memcpy(packet, &EthernetHeader, sizeof(EthernetHeader)); 
     memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader)); 

     SendPacket(packet); 
관련 문제