Advertisement
Guest User

Proxy checker

a guest
Dec 6th, 2010
1,073
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.58 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. # Escrito por kenkeiras
  4. # Bajo la WTFPL <http://sam.zoy.org/wtfpl/>
  5.  
  6. from socket import socket, AF_INET, SOCK_STREAM, inet_aton, getaddrinfo,\
  7.                    SOL_TCP
  8. from string import letters
  9. from random import choice
  10. from time import clock
  11.  
  12. import sys
  13.  
  14. clock() # Inicia el reloj (para windows)
  15.  
  16. # Lee siempre una cantidad de un socket
  17. def sock_read(sock, n):
  18.     b = "" # Inicia el buffer
  19.     i = 0  # Tamaño del buffer
  20.  
  21.     while (i < n): # Mientas no lee todo
  22.  
  23.         c = sock.recv(n - i) # Lee lo que falta
  24.  
  25.         if (len(c) < 1): # Si no se leyó nada
  26.                          # es que el socket está cerrado
  27.             raise Exception("Closed socket")
  28.  
  29.         b += c      # Añadir lo nuevo al buffer
  30.         i += len(c) # y actualizar su tamaño
  31.  
  32.     return b # Devolver el buffer
  33.    
  34.  
  35. # Convertir sockaddr a una dirección de red
  36. def str2host(addr, ipv = 4):
  37.     for i in letters: # Si hay letras
  38.         if i in addr[0]: # es un nombre de dominio
  39.             d = getaddrinfo(addr[0], addr[1], 0, 0, SOL_TCP)
  40.             # La primera dirección, el
  41.             # primer dato de la última tupla
  42.  
  43.             for j in d:
  44.                 if (len(j[-1]) == 2) and (ipv == 4): # A ipv4 tuple
  45.                     return inet_aton(j[-1][0])
  46.                 elif (len(j[-1]) == 4) and (ipv == 6): # A ipv6 tuple
  47.                     return inet_aton(j[-1][0])
  48.             raise Exception("Host not found")
  49.  
  50.     # Sino se traduce directamente
  51.     return inet_aton(addr[0])
  52.  
  53. # Pasa un número de 2 bytes a str
  54. # Suponiendo little endian
  55. def uint16str(n):
  56.     data = [] # Prepara el buffer
  57.     data.append( chr(n & 255) ) # Lee el byte menos significativo
  58.     n >>= 8 # Mueve todo un byte a la derecha
  59.  
  60.     data.append( chr(n & 255) ) # Lee el nuevo lsb
  61.  
  62.     data.reverse() # Le da la vuelta (little endian)
  63.  
  64.     return ''.join(data) # Y lo convierte en una cadeba
  65.  
  66. # Envía el código de excepción de un servidor SOCKS4
  67. def SOCKS4_ex(ans):
  68.  
  69.     # Relación código/respuesta
  70.     s4_ex = { 91 : "Request rejected or failed",
  71.               92 : "Request rejected becasue SOCKS server cannot connect to identd on the client",
  72.               93 : "Request rejected because the client program and identd report different user-ids"}
  73.     try:
  74.         raise Exception(s4_ex[ord(ans)]) # Produce la excepción
  75.     except:
  76.         raise Exception("Unknown error code #" + str(ord(ans)))
  77.  
  78. # Envía el código de excepción de un servidor SOCKS5
  79. def SOCKS5_ex(ans):
  80.  
  81.     # Relación código/respuesta
  82.     s5_ex = { 1 : "General SOCKS server failure",
  83.               2 : "Connection not allowed by ruleset",
  84.               3 : "Network unreachable",
  85.               4 : "Host unreachable",
  86.               5 : "Connection refused",
  87.               6 : "TTL expired",
  88.               7 : "Command not supported",
  89.               8 : "Address type not supported" }
  90.     try:
  91.         raise Exception(s5_ex[ord(ans)]) # Produce la excepción
  92.     except:
  93.         raise Exception("Unknown error code #" + str(ord(ans)))
  94.  
  95. # Especifica la dirección a un proxy SOCKS
  96. def SOCKS_hop(sock, addr, proto = 4, ipv = 4):
  97.     if (proto == 4): # Protocolo SOCKS4
  98.         # Mensaje de conexión
  99.         sock.send(chr(4) + chr(1) + uint16str(addr[1]) + str2host(addr) +\
  100.              chr(0))
  101.  
  102.         # Mensaje de confirmación/error
  103.         code = sock_read(sock, 8)[1]
  104.  
  105.         # Si algo falló
  106.         if (code != chr(90)):
  107.             # Mandar una excepción
  108.             SOCKS4_ex(code)
  109.  
  110.    
  111.     elif (proto == 5): # Protocolo SOCKS5
  112.         atype = None
  113.         if (ipv == 4): # Hosts ipv4
  114.             atype = chr(1)
  115.         elif (ipv == 6): # Hosts ipv6
  116.             atype = chr(4)
  117.         else:
  118.             raise Exception("Unknown IP version")
  119.  
  120.         sock.send(chr(5) + chr(1) + chr(0))
  121.  
  122.         # Mensaje de confirmación/error
  123.         code = sock_read(sock, 2)
  124.  
  125.         if (code != (chr(5) + chr(0))):
  126.             raise Exception("Requiere autenticación")
  127.  
  128.         # Mensaje de conexión
  129.         l = sock.send(chr(5) + chr(1) + chr(0) + atype + str(str2host(addr)) +\
  130.              uint16str(addr[1]))
  131.  
  132.         # Mensaje de confirmación/error
  133.         code = sock_read(sock, l)[1]
  134.  
  135.         # Si algo falló
  136.         if (code != chr(00)):
  137.             # Mandar una excepción
  138.             SOCKS5_ex(code)
  139.  
  140.     else: # Protocolo desconocido
  141.         raise Exception("Unknown SOCKS version")
  142.  
  143. global settings
  144. settings = {}
  145. if __name__=="__main__":
  146.     pass
  147.  
  148. check_host = "74.125.230.84" # La IP de www.google.com
  149. check_port = 80
  150.  
  151. timings = {}
  152. plist = []
  153. i = 1
  154. while (i < len(sys.argv)):
  155.     f = open(sys.argv[i], "rt")
  156.     while True:
  157.         txt = f.readline()
  158.         if (len(txt) < 1):
  159.             break
  160.         if (txt[-1] == "\n"):
  161.             txt = txt[:-1]
  162.         addr = txt.split(":")
  163.         s = socket()
  164.         print >>sys.stderr,txt,"...",
  165.         sys.stderr.flush()
  166.         try:
  167.             c1 = clock()
  168.             s.connect((addr[0], int(addr[1])))
  169.             c1 = clock() - c1
  170.             print >>sys.stderr,str(c1) + ",",
  171.             sys.stderr.flush()
  172.             c2 = clock()
  173.             SOCKS_hop(s,(check_host,check_port))
  174.             c2 = clock() - c2
  175.             print >>sys.stderr,str(c2)
  176.             sys.stderr.flush()
  177.             timings[txt] = c1 + c2
  178.         except:
  179.             print >>sys.stderr,"[Error]"
  180.         s.close()
  181.     f.close()
  182.     i += 1
  183.  
  184. # Se ordena todo por tiempo
  185. timed = sorted(timings, key=lambda key: timings[key])
  186.  
  187. # Y se muestra
  188. for i in timed:
  189.     print i
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement