import asyncio import threading from scapy.all import * import argparse DEBUG=False def print_dbg(s): if DEBUG: print(s) class NGServer: def __init__(self, bridge_ip='127.0.0.1', bridge_port=8000, ioip='127.0.0.1', incoming_port=8001, outgoing_port=8002): self.incoming_queue = asyncio.Queue() self.outgoing_queue = asyncio.Queue() self.client_reader = None self.client_writer = None self.server_reader = None self.server_writer = None self.server_thread = None self.bridge_ip = bridge_ip self.bridge_port = bridge_port self.ioip = ioip self.incoming_port = incoming_port self.outgoing_port = outgoing_port async def handle_client(self, reader, writer): self.client_reader = reader self.client_writer = writer while True: data = await reader.read(1024) if not data: writer.close() break await self.incoming_queue.put(data) async def handle_incoming(self, reader, writer): while True: data = await self.incoming_queue.get() writer.write(data) await writer.drain() async def handle_outgoing(self, reader, writer): self.server_reader = reader self.server_writer = writer print_dbg("handle_outgoing - ENTER") while True: print_dbg("handle_outgoing - IN LOOP") data = await reader.read(1024) print_dbg("handle_outgoing - IP(data))={}".format( IP(data))) self.client_writer.write(data) await self.client_writer.drain() async def read_from_server(self): print_dbg("read_from_server - ENTER") while True: # Switch reader to writer print_dbg("read_from_server - IN LOOP") data = await self.client_reader.read(1024) print_dbg("read_from_server - IP(data))={}".format( IP(data))) if not data: self.client_writer.close() break await self.outgoing_queue.put(data) async def start_server(self): server = await asyncio.start_server( self.handle_client, host=self.bridge_ip, port=self.bridge_port) async with server: await server.serve_forever() async def start_incoming_server(self): server = await asyncio.start_server( self.handle_incoming, host=self.ioip, port=self.incoming_port) async with server: await server.serve_forever() async def start_outgoing_server(self): server = await asyncio.start_server( self.handle_outgoing, host=self.ioip, port=self.outgoing_port) async with server: await server.serve_forever() async def start_thread(ng): """ """ await asyncio.gather( ng.start_server(), ng.start_incoming_server(), ng.start_outgoing_server(), ) await asyncio.gather( ng.read_from_server(), ng.handle_incoming(), ng.handle_outgoing(), ) def run_thread(ng): asyncio.run(start_thread(ng)) def startServerAndWait(args): ng = NGServer(bridge_ip=args.bridge_ip, bridge_port=args.bridge_port, ioip=args.ioip, incoming_port=args.incoming_port, outgoing_port=args.outgoing_port) ng.server_thread = threading.Thread( target=run_thread, args=(ng,)) ng.server_thread.start() ng.server_thread.join() def startThread(ng): ng.server_thread = threading.Thread( target=run_thread, args=(ng,)) ng.server_thread.start() def connectIO(inaddr='127.0.0.1', inport=8001, outaddr='127.0.0.1', outport=8002): insock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) insock.connect((inaddr, inport)) outsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) outsock.connect((outaddr, outport)) return insock, outsock def parseArgs(): args = argparse.ArgumentParser() # The bridge ip and port args.add_argument("-B","--bridge_ip", default='127.0.0.1', help='The IP that listens for NetGenie mobile app client connections.') args.add_argument("-b","--bridge_port", default=8000, help='The port that listens for NetGenie mobile app client connections.') # The IO ip and ports args.add_argument("-I","--ioip", default='127.0.0.1', help='The IP that listens on the server for connections from whoever is debugging the phone.') args.add_argument("-i","--incoming_port", default=8001, help='The port that the person debugging will read packets from the device.') args.add_argument("-o","--outgoing_port", default=8002, help='The port that the person debugging will write packets to the device.') return args.parse_args() def main(): """ The NGServer class implements our NetGenie debug/bridge server. """ args = parseArgs() startServerAndWait(args) if __name__ == '__main__': main()