import sys
import socket
import threading
HEX_FILTER=''.join([(len(repr(chr(i)))==3) and chr(i) or '.' for i in range(256)])
def hexdump(src,length=16,show=True):
if isinstance(src,bytes):
src=src.decode()
result=list()
for i in range(0,len(src),length):
word=str(src[i:i+length])
printable=word.translate(HEX_FILTER)
hexa=' '.join([f'{ord(c):02X}' for c in word])
hexwidth=length*3
result.append(f'{i:04x} {hexa:<{hexwidth}} {printable}')
if show:
for line in result:
print(line)
else:
return result
def revicve_from(connection):
buffer=b''
connection.settimeout(5)
try:
while True:
data=connection.recv(4096)
if not data:
break
buffer+=data
except Exception as e:
pass
return buffer
def request_handler(buffer):
return bytes(buffer)
def respone_handler(buffer):
return bytes(buffer)
def proxy_handler(client_socket,remote_host,remote_port,recive_first):
remote_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
remote_socket.connect((remote_host,remote_port))
if recive_first:
remote_buffer=revicve_from(remote_socket)
hexdump(remote_buffer)
remote_buffer=respone_handler(remote_buffer)
if len(remote_buffer):
print("[<==] Send %d bytes to localhost." %len(remote_buffer))
client_socket.send(remote_buffer)
while True:
local_buffer=revicve_from(client_socket)
if len(local_buffer):
line="[==>]Recive %d bytes from localhost." %len(local_buffer)
print(line)
hexdump(local_buffer)
local_buffer=request_handler(local_buffer)
remote_socket.send(local_buffer)
print("[==>]Send to remote.")
remote_buffer=revicve_from(remote_socket)
if len(remote_buffer):
print("[==>]Recive %d bytes from remote ." %len(remote_buffer))
hexdump(remote_buffer)
remote_buffer=respone_handler(remote_buffer)
client_socket.send(remote_buffer)
if not len(local_buffer) or not len(remote_buffer):
client_socket.close()
remote_socket.close()
print("[*] no more data. Closing connection.")
break
def server_loop(local_host,local_port,remote_host,remote_port,recive_first):
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
server.bind((local_host,local_port))
except Exception as e:
print("problem on bind: %e" % e)
print("[!!]Failed to listen on %s:%d" %(local_host,local_port))
print("[!!]Check for other listening sockets or correct permissions.")
sys.exit(0)
print("[*] Listening on %s:%d" %(local_host,local_port))
server.listen(5)
while True:
client_sockt,addr=server.accept()
line=">Recived incoming connection from %s:%d" %(addr[0],addr[1])
print(line)
proxy_thread=threading.Thread(target=proxy_handler,args=(client_sockt,remote_host,remote_port,recive_first))
proxy_thread.start()
def main():
if len(sys.argv[1:])!=5:
print("usage: ./proxy.py [localhost] [localport]",end=' ')
print("[remotehost] [remoteport] [recive_first]")
print("Example:./proxy.py 127.0.0.1 8888 10.0.2.15 5555 True")
sys.exit(0)
local_host=sys.argv[1]
local_port=int(sys.argv[2])
remote_host=sys.argv[3]
remote_port=int(sys.argv[4])
recive_first=sys.argv[5]
if "True" in recive_first:
recive_first=True
else:
recive_first=False
server_loop(local_host,local_port,remote_host,remote_port,recive_first)
if __name__=="__main__":
main()
以百度为例:python 02/proxy.py 127.0.0.1 8086 www.baidu.com 80 True
在浏览器输入:https://127.0.0.1:8086
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)