예제 #1
0
static int do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport, uint32_t *result_addr)
{
  int s;
  struct sockaddr_in socksaddr;
  char *req, *cp;
  int r, len;
  char response_buf[RESPONSE_LEN];

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

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

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

  if ((len = build_socks4a_resolve_request(&req, "", hostname))<0) {
    show_msg(MSGWARN, "do_resolve: error generating SOCKS request\n"); 
    return -1;
  }

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

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

  close(s);

  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;
}
예제 #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;
}