1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
import sys import socket import threading import argparse import textwrap
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.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 receive_from(connection): buffer = b"" connection.settimeout(40) try: while True: res = connection.recv(4096) if not res: break else: buffer += res except Exception as err: print("recv err: ", err) return buffer
def req_handler(buffer): return buffer
def res_handler(buffer): return buffer
def proxy_handler(client_socket, remote_host, remote_port, receive_first): address = (remote_host, remote_port) remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) remote_socket.connect(address)
if receive_first: remote_buffer = receive_from(remote_socket) hexdump(remote_buffer)
remote_buffer = req_handler(remote_buffer)
while True: local_buffer = receive_from(client_socket)
if len(local_buffer): line = "[==>]Received {} bytes from localhost.".format(len(local_buffer)) print(line) hexdump(local_buffer)
remote_buffer = receive_from(remote_socket) if len(remote_buffer): line = "[==>]Received {} bytes from remote_host.".format(len(remote_buffer)) print(line) hexdump(remote_buffer)
remote_buffer = res_handler(remote_buffer) client_socket.send(remote_buffer) print("[==>]Send to localhost.")
if not len(remote_buffer) or not len(local_buffer): client_socket.close() remote_socket.close() print("[==>]No more data, Closing connect!!!.") break
def server_loop(local_host, local_port, remote_host, remote_port, receive_first): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try: server.bind((local_host, local_port)) except Exception as err: print("[==>]Can't bind on {0}:{1} {2}".format(local_host, local_port, err)) sys.exit(0)
server.listen(5)
while True: client_socket, addr = server.accept()
line = "[==>]Received from {}:{}".format(addr[0], addr[1]) print(line)
threading.Thread(target=proxy_handler, args=(client_socket, remote_host, remote_port, receive_first)).start()
def main(): parse = argparse.ArgumentParser(description="TCP_PROXY!!!", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=textwrap.dedent('''Example: tcp_proxy.py -lh local_host -rh remote_host -lp 21 -rp 21 -s #需要先接收消息 '''))
parse.add_argument('-s', action='store_true', help='first receive') parse.add_argument('-lh', help='local host') parse.add_argument('-rh', help='remote host')
parse.add_argument('-lp', type=int, help='local port') parse.add_argument('-rp', type=int, help='remote port') args = parse.parse_args() server_loop(args.lh, args.lp, args.rh, args.rp, args.s)
if __name__ == "__main__": main()
|