Exemplo n.º 1
0
int close(CLOSE_SIGNATURE) {
   int rc;
   struct connreq *conn;

	if (realclose == NULL) {
		show_msg(MSGERR, "Unresolved symbol: close\n");
		return(-1);
	}

   show_msg(MSGDEBUG, "Call to close(%d)\n", fd);

   rc = realclose(fd);

   /* If we have this fd in our request handling list we 
    * remove it now */
   if ((conn = find_socks_request(fd, 1))) {
      show_msg(MSGDEBUG, "Call to close() received on file descriptor "
                         "%d which is a connection request of status %d\n",
               conn->sockid, conn->state);
      kill_socks_request(conn);
   }

   return(rc);
}
Exemplo n.º 2
0
static int
do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
           uint32_t *result_addr, const void *addr,
           int version, int reverse, char **result_hostname)
{
  int s;
  struct sockaddr_in socksaddr;
  char *req, *cp=NULL;
  int r, len, hslen;
  char response_buf[RESPONSE_LEN];
  const char *handshake="\x05\x01\x00";

  show_msg(MSGDEBUG, "do_resolve: resolving %s\n", hostname);

  /* Create SOCKS connection */
  s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (s<0) {
    show_msg(MSGWARN, "do_resolve: problem creating socket\n"); 
    return -1;
  }

  /* Connect to SOCKS server */
  memset(&socksaddr, 0, sizeof(socksaddr));
  socksaddr.sin_family = AF_INET;
  socksaddr.sin_port = htons(socksport);
  socksaddr.sin_addr.s_addr = htonl(sockshost);
  if (realconnect(s, (struct sockaddr*)&socksaddr, sizeof(socksaddr))) {
    show_msg(MSGWARN, "do_resolve: error connecting to SOCKS server\n");
    realclose(s);
    return -1;
  }

  /* If a SOCKS5 connection, perform handshake */
  if (version == 5) {
    char method_buf[2];
    hslen=3;
    while (hslen) {
      r = send(s, handshake, hslen, 0);
      if (r<0) {
        show_msg(MSGWARN, "do_resolve: error sending SOCKS5 method list.\n");
        realclose(s);
        return -1;
      }
      hslen -= r;
      handshake += r;
    }

    len = 0;
    while (len < METHODRESPONSE_LEN) {
      r = recv(s, method_buf+len, METHODRESPONSE_LEN-len, 0);
      if (r==0) {
        show_msg(MSGWARN, "do_resolve: EOF while reading SOCKS response\n");
        realclose(s);
        return -1;
      }
      if (r<0) {
        show_msg(MSGWARN, "do_resolve: error reading SOCKS response\n");
        realclose(s);
        return -1;
      }
      len += r;
    }

    if (method_buf[0] != '\x05') {
      show_msg(MSGWARN, "Unrecognized socks version: %u",
              (unsigned)method_buf[0]);
      realclose(s);
      return -1;
    }
    if (method_buf[1] != '\x00') {
      show_msg(MSGWARN, "Unrecognized socks authentication method: %u",
              (unsigned)method_buf[1]);
      realclose(s);
      return -1;
    }
  }

  /* Create SOCKS request */
  if (reverse) {
    if ((len = build_socks5_resolve_ptr_request(&req, addr))<0) {
      show_msg(MSGWARN, "do_resolve: error generating reverse SOCKS request\n");
      realclose(s);
      return -1;
    }
  }else{
    if ((len = build_socks4a_resolve_request(&req, "", hostname))<0) {
      show_msg(MSGWARN, "do_resolve: error generating SOCKS request\n");
      realclose(s);
      return -1;
    }
  }

  /* Send SOCKS request */
  cp = req;
  while (len) {
    r = send(s, cp, len, 0);
    if (r<0) {
      show_msg(MSGWARN, "do_resolve: error sending SOCKS request\n"); 
      free(req);
      realclose(s);
      return -1;
    }
    len -= r;
    cp += r;
  }
  free(req);

  /* Handle SOCKS Response */
  if (reverse) {
    if (parse_socks5_resolve_ptr_response(s, response_buf, RESPONSE_LEN,
                                          result_addr, &result_hostname) < 0){
      show_msg(MSGWARN, "do_resolve: error parsing SOCKS response\n");
      realclose(s);
      return -1;
    }
  }else{
    /* Process SOCKS response */
    len = 0;
    while (len < RESPONSE_LEN) {
      r = recv(s, response_buf+len, RESPONSE_LEN-len, 0);
      if (r==0) {
        show_msg(MSGWARN, "do_resolve: EOF while reading SOCKS response\n");
        realclose(s);
        return -1;
      }
      if (r<0) {
        show_msg(MSGWARN, "do_resolve: error reading SOCKS response\n");
        realclose(s);
        return -1;
      }
      len += r;
    }
    realclose(s);

    /* Parse SOCKS response */
    if (parse_socks4a_resolve_response(response_buf, RESPONSE_LEN, result_addr) < 0){
      show_msg(MSGWARN, "do_resolve: error parsing SOCKS response\n");
      return -1;
    }
  }


  show_msg(MSGDEBUG, "do_resolve: success\n");

  return 0;
}