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
|
#include <resolv.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/nameser.h>
#include "dietfeatures.h"
static char dnspacket[]="\xfe\xfe\001\000\000\001\000\000\000\000\000\000";
/*
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
*/
extern void __dns_make_fd(void);
extern int __dns_fd;
extern int __dns_servers;
extern struct sockaddr __dns_server_ips[];
extern void __dns_readstartfiles(void);
int res_mkquery(int op, const char *dname, int class, int type, char* data,
int datalen, const unsigned char* newrr, char* buf, int buflen) {
unsigned char packet[512];
memmove(packet,dnspacket,12);
if ((_res.options&RES_RECURSE)==0) packet[2]=0;
*(unsigned short*)packet=rand();
{
unsigned char* x;
const char* y,* tmp;
x=packet+12; y=dname;
while (*y) {
while (*y=='.') ++y;
for (tmp=y; *tmp && *tmp!='.'; ++tmp) ;
*x=tmp-y;
if (!(tmp-y)) break;
++x;
if (x>=packet+510-(tmp-y)) { return -1; }
memmove(x,y,tmp-y);
x+=tmp-y;
if (!*tmp) {
*x=0;
break;
}
y=tmp;
}
*++x= 0; *++x= type; /* A */
*++x= 0; *++x= class; /* IN */
++x;
if (x-packet>buflen) return -1;
memmove(buf,packet,x-packet);
return x-packet;
}
}
|