salut a tous , alors apres avoir codé un requete dns en C en utilisant les RAW socket sur Win SP1 , je constate que je ne recois pas de reponse (vu sur wireshark) , je sniff bien l'envoi dans mon packet mais je ne recois rien .

test fait depuis un VM en NAT , ( en pont aucune reponse aussi ) .

merci de jetter un œil a mon code pour savoir ou ai je planter merci .

j'ai utilisé deja 'serv dns 8.8.8.8' et l ip de mon routeur mais rien .

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
 
 
#include <stdio.h>			 
#include <stdlib.h>			 
#include <string.h>	
#include <winsock2.h>			
#include <ws2tcpip.h>		
 
#pragma comment(lib, "ws2_32.lib")  
 
typedef struct IPHEADER IPHEADER;
typedef struct UDPHEADER UDPHEADER;
typedef struct DnsHeader DnsHeader;
 
#pragma pack(1)
struct IPHEADER
  {
	unsigned char  version;       
	unsigned char  typServ;
	unsigned short int tot_len;
	unsigned short int id;
	unsigned short int offset ; 
	unsigned char  ttl;
	unsigned char  protocol;
	unsigned short int somme;
	unsigned long  int ip_source;
	unsigned long  int ip_dest;	      
   };
#pragma pack()
 
#pragma pack(1)
struct UDPHEADER
{
	unsigned short int PortSrce;
	unsigned short int PortDest;
	unsigned short int taillePckt;
	unsigned short int SommeContr;
};
#pragma pack()					
 
#pragma pack(1)
struct DnsHeader
{
	unsigned short int IDdns;
 
	unsigned short int flag;
 
	unsigned short int QuestDNS;
	unsigned short int ReponDNS;
	unsigned short int Author;
	unsigned short int Addit;
 
	unsigned char un[13] ;
 
	unsigned short int TypeRecord;
	unsigned short int ClassRecord;	
 
};
#pragma pack()
 
WSADATA WSAData;
SOCKADDR_IN sock, recv3;
SOCKET monsock;
DWORD sockopt = TRUE; 
 
IPHEADER ip;
UDPHEADER udp;
DnsHeader dns;
 
char * buffer= NULL;
char * buffer2= NULL;
 
 
char NameDnS[13] = { 03, 0x77, 0x77, 0x77, 04, 0x6c, 0x69, 0x66, 0x6c, 02,  0x66, 0x72, 00 };  //= www.lifl.fr
unsigned short int global_size = 0, taille_udp = 0 , taille_dns_req = 0, taille_udpDns = 0;
int i , o ;
 
 
unsigned short checksum(void * lpData, size_t size);
 
 
 
int main(void)
 {
 
	global_size = sizeof(IPHEADER) + sizeof(UDPHEADER) + sizeof(DnsHeader); // + sizeof(DnsQuery) ; 
	taille_udp = sizeof(UDPHEADER);
	taille_udpDns = sizeof(UDPHEADER) + sizeof(DnsHeader);
	taille_dns_req = sizeof(DnsHeader);
 
	buffer = malloc(global_size);
 
		printf(" taille global_size = %d \n ", global_size);
 
 
	if(WSAStartup(MAKEWORD(2,0), &WSAData) != 0 )
		 {
		   printf("\n WSAstartup a echoué \n");
		   printf("l'Erreur wsa ==> : %ld \n", WSAGetLastError());
		   return -1;
		 }
 
	monsock = socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
	if(monsock == INVALID_SOCKET )
		 {
		   printf("\n Erreur de creation de la socket ! \n ");
		   printf("l'Erreur wsa ==> : %ld \n", WSAGetLastError());
		   return -1;
		 }
 
    if( setsockopt( monsock , IPPROTO_IP , IP_HDRINCL,(char *)&sockopt, sizeof(sockopt) ) == SOCKET_ERROR )
		 {
		   printf(" \n erreur detecté pour mise en place de l'option sur la socket \n ");
		   printf("l'Erreur wsa ==> : %ld \n", WSAGetLastError());
		   return -1;
		 } 
 
 
      ip.version    = 69;                     
      ip.typServ    = 0;
      ip.tot_len    = htons(global_size);     
      ip.id         = htons(0x7c42);              
      ip.offset     = 0;                        
      ip.ttl        = 228;
      ip.protocol   = IPPROTO_UDP;                                      
      ip.ip_source  = inet_addr("10.0.2.15");         // ip VM :   10.0.2.15   en nat  
      ip.ip_dest    = inet_addr("192.168.1.1");       //ou ip serv dns 8.8.8.8  (google public)
      ip.somme      = checksum(&ip, sizeof(ip));
 
 
		udp.PortSrce          = htons(2336);       
        udp.PortDest          = htons(53);    
        udp.taillePckt        = htons(taille_udpDns);        
        udp.SommeContr        = checksum(&udp, sizeof(udp));   
 
 
		dns.IDdns = htons(03); 
 
		dns.flag = htons(0x0100);
 
		dns.QuestDNS =htons(1) ;
		dns.ReponDNS =htons(0) ;
		dns.Author =htons(0);
		dns.Addit =htons(0) ;
 
		for(i=0; i<= sizeof(NameDnS); i++)
		{
			dns.un[i] =  NameDnS[i];
		}
 
		dns.TypeRecord = htons(1);
		dns.ClassRecord = htons(1);
 
 
      sock.sin_family        = AF_INET;
      sock.sin_addr.s_addr   = inet_addr("192.168.1.1"); // dest  
      sock.sin_port          = htons(2098);
 
	  memcpy(buffer, &ip, sizeof(ip));
	  memcpy(buffer + sizeof(ip), &udp , sizeof(udp) );
	  memcpy(buffer + sizeof(ip) + sizeof(udp) , &dns , sizeof(dns) );
 
	  if( sendto(monsock, buffer, global_size, 0, (SOCKADDR *)&sock, sizeof(sock)) == SOCKET_ERROR)
            printf("La fonction sendto a echoue: %ld \n", WSAGetLastError());
      else
            printf("Message envoye !\n");
 
	  Sleep(1000);
 
 
 
	free(buffer);
	closesocket(monsock);
	WSACleanup();
  return 0;
 }
 
 
unsigned short checksum(void * lpData, size_t size)     
{
		    USHORT * t = lpData;
		    DWORD somme = 0;
		    size_t i, n = size / sizeof(USHORT);
 
		    for(i = 0; i < n; i++)
		        somme += t[i];
 
		    if (size % 2)
		    {
  		        UCHAR * u = lpData;
                        somme += u[size - 1];
                    }
 
                    while (HIWORD(somme))
                        somme = HIWORD(somme) + LOWORD(somme);
 
  return LOWORD(~somme); 
}