2013-10-05 4 views
0

모두. WinDivert를 사용하여 ICMP 패킷 발신자를 개발했습니다. 192.168.1.232는 내 컴퓨터이고 192.168.1.158은 원격 컴퓨터입니다. 모든 함수는 성공을 반환하지만 Wireshark를 사용하는 원격 컴퓨터에서 ICMP 패킷을 볼 수 없습니다. 이 코드에 문제가 있습니까? 고마워.WinDivert가 자체 구성한 ICMP 패킷을 보내지 못했습니다.

#include <winsock2.h> 
#include <divert.h> 
#include <stdio.h> 

#define MAXBUF 0xFFFF 

int main() 
{ 
    HANDLE handle;   // Divert handle 
    DIVERT_ADDRESS addr; // Packet address 
    char packet[MAXBUF]; // Packet buffer 
    UINT packet_len; 
    UINT local_ip; 
    UINT remote_ip; 

    addr.IfIdx = 0; 
    addr.SubIfIdx = 0; 
    addr.Direction = DIVERT_DIRECTION_OUTBOUND; 

    DivertHelperParseIPv4Address("192.168.1.232", &local_ip); 
    DivertHelperParseIPv4Address("192.168.1.158", &remote_ip); 

    PDIVERT_IPHDR ip_header = (PDIVERT_IPHDR) packet; 
    ip_header->HdrLength = 5; 
    ip_header->Version = 4; 
    ip_header->TOS = 0; 
    ip_header->Length = htons(sizeof(DIVERT_IPHDR) + sizeof(DIVERT_ICMPHDR) + 32); 
    ip_header->Id = 0x1234; 
    DIVERT_IPHDR_SET_FRAGOFF(ip_header, 0); 
    DIVERT_IPHDR_SET_MF(ip_header, 0); 
    DIVERT_IPHDR_SET_DF(ip_header, 0); 
    DIVERT_IPHDR_SET_RESERVED(ip_header, 0); 
    ip_header->TTL = 64; 
    ip_header->Protocol = 1; //ICMP 
    ip_header->Checksum = 0; 
    ip_header->SrcAddr = local_ip; 
    ip_header->DstAddr = remote_ip; 

    PDIVERT_ICMPHDR icmp_header = (PDIVERT_ICMPHDR) ((PBYTE) ip_header + sizeof(DIVERT_IPHDR)); 
    icmp_header->Type = 8; 
    icmp_header->Code = 0; 
    icmp_header->Checksum = 0; 
    icmp_header->Body = htonl(0x00010012); 

    PBYTE icmp_data = (PBYTE) icmp_header + sizeof(DIVERT_ICMPHDR); 
    for (int i = 0; i < 32; i ++) 
    { 
     *icmp_data = 'a' + i % 23; 
     icmp_data ++; 
    } 

    packet_len = sizeof(DIVERT_IPHDR) + sizeof(DIVERT_ICMPHDR) + 32; 
    DivertHelperCalcChecksums((PVOID) packet, packet_len, 0); 

    handle = DivertOpen("true", (DIVERT_LAYER)0, 0, 0); // Open some filter 
    if (handle == INVALID_HANDLE_VALUE) 
    { 
     // Handle error 
     exit(1); 
    } 

// // Read packet. 
// if (!DivertRecv(handle, packet, sizeof(packet), &addr, &packet_len)) 
// { 
//  fprintf(stderr, "warning: failed to read packet (%d)\n", 
//   GetLastError()); 
//  DivertClose(handle); 
//  return 0; 
// } 

    // Send packet. 
    if (!DivertSend(handle, packet, packet_len, &addr, NULL)) 
    { 
     // Handle send error 
     BOOL a = DivertSend(handle, (PVOID) packet, packet_len, &addr, NULL); 
     DivertClose(handle); 
     DWORD dwError = GetLastError(); 
     printf("DivertSend Error.\n"); 
    } 
    else 
    { 
     DivertClose(handle); 
     printf("DivertSend Success.\n"); 
    } 

    return 0; 
} 

답변

1

한 가지 문제는 네트워크 바이트 순서, 예를 들어,로 DivertHelperParseIPv4Address()에 의해 반환 된 주소를 변환 할 필요가 있다는 것입니다 htonl()과 함께.

WireShark을 사용하여 아웃 바운드 패킷을 디버깅 할 수도 있습니다.

+0

네, 그게 문제입니다. – hsluoyz

관련 문제