dnspr.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. 3APA3A simpliest proxy server
  3. (c) 2002-2008 by ZARAZA <3APA3A@security.nnov.ru>
  4. please read License Agreement
  5. */
  6. #include "proxy.h"
  7. #ifndef UDP
  8. #define UDP
  9. #endif
  10. #define RETURN(xxx) { param->res = xxx; goto CLEANRET; }
  11. #define BUFSIZE 16384
  12. void * dnsprchild(struct clientparam* param) {
  13. unsigned long ip = 0;
  14. unsigned char *bbuf;
  15. unsigned char *buf, *s1, *s2;
  16. char * host = NULL;
  17. unsigned char c;
  18. SASIZETYPE size;
  19. int res, i;
  20. int len;
  21. unsigned type=0;
  22. unsigned ttl;
  23. unsigned char addr[16];
  24. #ifdef _WIN32
  25. unsigned long ul = 1;
  26. #endif
  27. if(!(bbuf = myalloc(BUFSIZE+2))){
  28. param->srv->fds.events = POLLIN;
  29. RETURN (21);
  30. }
  31. buf = bbuf+2;
  32. size = sizeof(param->sincr);
  33. i = so._recvfrom(param->srv->srvsock, buf, BUFSIZE, 0, (struct sockaddr *)&param->sincr, &size);
  34. size = sizeof(param->sinsl);
  35. getsockname(param->srv->srvsock, (struct sockaddr *)&param->sincl, &size);
  36. #ifdef _WIN32
  37. if((param->clisock=so._socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {
  38. RETURN(818);
  39. }
  40. ioctlsocket(param->clisock, FIONBIO, &ul);
  41. if(so._setsockopt(param->clisock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&ul, sizeof(int))) {RETURN(820);};
  42. if(so._bind(param->clisock,(struct sockaddr *)&param->sincl,sizeof(param->sincl))) {
  43. RETURN(822);
  44. }
  45. #else
  46. param->clisock = param->srv->srvsock;
  47. #endif
  48. param->srv->fds.events = POLLIN;
  49. if(i < 0) {
  50. RETURN(813);
  51. }
  52. buf[BUFSIZE - 1] = 0;
  53. if(i<=13 || i>1000){
  54. RETURN (814);
  55. }
  56. param->operation = DNSRESOLVE;
  57. if((res = (*param->srv->authfunc)(param))) {RETURN(res);}
  58. if(buf[4]!=0 || buf[5]!=1) RETURN(816);
  59. for(len = 12; len<i; len+=(c+1)){
  60. c = buf[len];
  61. if(!c)break;
  62. buf[len] = '.';
  63. }
  64. if(len > (i-4)) {RETURN(817);}
  65. host = mystrdup((char *)buf+13);
  66. if(!host) {RETURN(21);}
  67. for(s2 = buf + 12; (s1 = (unsigned char *)strchr((char *)s2 + 1, '.')); s2 = s1)*s2 = (unsigned char)((s1 - s2) - 1);
  68. *s2 = (len - (int)(s2 - buf)) - 1;
  69. type = ((unsigned)buf[len+1])*256 + (unsigned)buf[len+2];
  70. if((type==0x01 || type==0x1c) && !param->srv->singlepacket){
  71. ip = udpresolve((type==0x1c)?AF_INET6:AF_INET, (unsigned char *)host, addr, &ttl, param, 0);
  72. }
  73. len+=5;
  74. if(ip){
  75. buf[2] = 0x85;
  76. buf[3] = 0x80;
  77. buf[6] = 0;
  78. buf[7] = 1;
  79. buf[8] = buf[9] = buf[10] = buf[11] = 0;
  80. memset(buf+len, 0, 16);
  81. buf[len] = 0xc0;
  82. buf[len+1] = 0x0c;
  83. buf[len+3] = type;
  84. buf[len+5] = 1;
  85. ttl = htonl(ttl);
  86. memcpy(buf + len + 6, &ttl, 4);
  87. buf[len+11] = type==1? 4:16;
  88. memcpy(buf+len+12,(void *)&addr,type==1? 4:16);
  89. len+=(type==1?16:28);
  90. }
  91. else if(type == 0x0c) {
  92. unsigned a, b, c, d;
  93. sscanf(host, "%u.%u.%u.%u", &a, &b, &c, &d);
  94. ip = htonl((d<<24) ^ (c<<16) ^ (b<<8) ^ a);
  95. if(*SAFAMILY(&param->sincl) == AF_INET && ip == *(unsigned long*)SAADDR(&param->sincl)){
  96. buf[2] = 0x85;
  97. buf[3] = 0x80;
  98. buf[6] = 0;
  99. buf[7] = 1;
  100. buf[8] = buf[9] = buf[10] = buf[11] = 0;
  101. memset(buf+len, 0, 20);
  102. buf[len] = 0xc0;
  103. buf[len+1] = 0x0c;
  104. buf[len+3] = 0x0c;
  105. buf[len+5] = 1;
  106. ttl = htonl(3600);
  107. memcpy(buf + len + 6, &ttl, 4);
  108. buf[len+11] = 7;
  109. buf[len+12] = 6;
  110. memcpy(buf+len+13,(void *)"3proxy",6);
  111. len+=20;
  112. }
  113. else ip = 0;
  114. }
  115. if(!ip && numservers){
  116. if((param->remsock=so._socket(SASOCK(&nservers[0].addr), nservers[0].usetcp? SOCK_STREAM:SOCK_DGRAM, nservers[0].usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {
  117. RETURN(818);
  118. }
  119. memset(&param->sinsl, 0, sizeof(param->sinsl));
  120. *SAFAMILY(&param->sinsl) = *SAFAMILY(&nservers[0].addr);
  121. if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,sizeof(param->sinsl))) {
  122. RETURN(819);
  123. }
  124. memcpy(&param->sinsr, &nservers[0].addr, sizeof(param->sinsr));
  125. if(nservers[0].usetcp) {
  126. if(so._connect(param->remsock,(struct sockaddr *)&param->sinsr,sizeof(param->sinsr))) RETURN(830);
  127. buf-=2;
  128. *(unsigned short*)buf = htons(i);
  129. i+=2;
  130. }
  131. else {
  132. #ifdef _WIN32
  133. /* ioctlsocket(param->remsock, FIONBIO, &ul); */
  134. #else
  135. /* fcntl(param->remsock,F_SETFL,O_NONBLOCK); */
  136. #endif
  137. }
  138. if(socksendto(param->remsock, (struct sockaddr *)&param->sinsr, buf, i, conf.timeouts[SINGLEBYTE_L]*1000) != i){
  139. RETURN(820);
  140. }
  141. param->statscli64 += i;
  142. param->nwrites++;
  143. len = sockrecvfrom(param->remsock, (struct sockaddr *)&param->sinsr, buf, BUFSIZE, 15000);
  144. if(len <= 13) {
  145. RETURN(821);
  146. }
  147. param->statssrv64 += len;
  148. param->nreads++;
  149. if(nservers[0].usetcp) {
  150. unsigned short us;
  151. us = ntohs(*(unsigned short *)buf);
  152. if(us > 4096) RETURN(833);
  153. buf += 2;
  154. len -= 2;
  155. if(len < us) len += sockgetlinebuf(param, SERVER, buf+len, us - len, 0, conf.timeouts[SINGLEBYTE_L]);
  156. if(len != us) RETURN(832);
  157. }
  158. if(buf[6] || buf[7]){
  159. if(socksendto(param->clisock, (struct sockaddr *)&param->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000) != len){
  160. RETURN(822);
  161. }
  162. RETURN(0);
  163. }
  164. }
  165. if(!ip) {
  166. buf[2] = 0x85;
  167. buf[3] = 0x83;
  168. }
  169. res = socksendto(param->clisock, (struct sockaddr *)&param->sincr, buf, len, conf.timeouts[SINGLEBYTE_L]*1000);
  170. if(res != len){RETURN(819);}
  171. if(!ip) {RETURN(888);}
  172. CLEANRET:
  173. if(param->res!=813){
  174. sprintf((char *)buf, "%04x/%s/",
  175. (unsigned)type,
  176. host?host:"");
  177. if(ip && type == 0x01 || type == 0x1c){
  178. myinet_ntop(type == 0x01? AF_INET:AF_INET6, addr, buf+strlen(buf), 64);
  179. }
  180. (*param->srv->logfunc)(param, buf);
  181. }
  182. if(bbuf)myfree(bbuf);
  183. if(host)myfree(host);
  184. #ifndef _WIN32
  185. param->clisock = INVALID_SOCKET;
  186. #endif
  187. freeparam(param);
  188. return (NULL);
  189. }