문제

나는 튜토리얼을 읽었지만 그것을 얻지 못합니다. 패킷을 보낼 수 있지만 WinPCap을 어떻게 알 수 있습니까? 패킷에 넣어야 할 헤더가있어서 어떤 IP/포트를 전달할 수 있는지 알 수 있습니까? 내말은. 마치 내 목록에있는 누군가에게 무언가를 쓴 것처럼 데이터를 MSN에 보내고 싶다고 상상해 봅시다. SendPacket ()을 사용할 수 있지만 패킷/바이트 배열을 인수로 만 가져 가면서 앱/IP/포트를 지정하지 않습니다.

감사

도움이 되었습니까?

해결책

패킷을 보내는 곳을 WinPCap에게 말하지 않습니다. 당신은 와이어에 패킷을 넣으라고 말합니다. 네트워크 스위치는 패킷을 오른쪽 대상으로 보냅니다. 수신단의 TCP 스택은 패킷을 올바른 응용 프로그램/서비스로 보냅니다. 분명히 이것은 라우팅 정보가 패킷 자체에 있어야한다는 것을 의미합니다.

예를 들어 보려면 해당 MSN 서버의 IP 주소와 TCP 포트를 패킷에 넣어야합니다. 그렇지 않은 경우 네트워킹 하드웨어는 해당 패킷을 폐기하거나 오해합니다.

다른 팁

이것이 제가 전선을 통해 ARP 요청을 보낸 방법입니다. 1. 프로토콜의 구조 정의 IE ARP 패킷을 보내려면 데이터 링크 계층 (이더넷 헤더)과 네트워크 레이어 (ARP 헤더)가 포함 된 구조가 필요합니다. 이에 따라 IP를 통해 TCP 패킷을 보내려면 이더넷 헤더, IP 헤더 및 TCP 헤더의 데이터 구조가 필요합니다.

  1. 구조를 정의한 후에는 패킷이 네트워크의 모든 기계로 이동하려면 원하는 값으로 구조의 인스턴스를 초기화하십시오. FF 패킷을 Machine X로 보내려면 (IP 주소 192.168.0.88) IP 계층의 대상 주소를 해당 값으로 설정하십시오.

  2. 일단 완료되면 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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top