64 lines
1.8 KiB
Python
Executable File
64 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""把宿主机仅监听 127.0.0.1 的 ADB Frida 转发暴露给 Docker。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import asyncio
|
|
import signal
|
|
|
|
|
|
async def pipe(reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None:
|
|
try:
|
|
while data := await reader.read(65536):
|
|
writer.write(data)
|
|
await writer.drain()
|
|
except (ConnectionError, asyncio.CancelledError):
|
|
pass
|
|
finally:
|
|
writer.close()
|
|
|
|
|
|
async def handle(
|
|
client_reader: asyncio.StreamReader,
|
|
client_writer: asyncio.StreamWriter,
|
|
target_host: str,
|
|
target_port: int,
|
|
) -> None:
|
|
try:
|
|
target_reader, target_writer = await asyncio.open_connection(target_host, target_port)
|
|
except OSError:
|
|
client_writer.close()
|
|
await client_writer.wait_closed()
|
|
return
|
|
await asyncio.gather(
|
|
pipe(client_reader, target_writer),
|
|
pipe(target_reader, client_writer),
|
|
return_exceptions=True,
|
|
)
|
|
|
|
|
|
async def main() -> None:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--listen-host", default="0.0.0.0")
|
|
parser.add_argument("--listen-port", type=int, default=19886)
|
|
parser.add_argument("--target-host", default="127.0.0.1")
|
|
parser.add_argument("--target-port", type=int, default=27042)
|
|
args = parser.parse_args()
|
|
server = await asyncio.start_server(
|
|
lambda r, w: handle(r, w, args.target_host, args.target_port),
|
|
args.listen_host,
|
|
args.listen_port,
|
|
)
|
|
loop = asyncio.get_running_loop()
|
|
stop = asyncio.Event()
|
|
for sig in (signal.SIGINT, signal.SIGTERM):
|
|
loop.add_signal_handler(sig, stop.set)
|
|
async with server:
|
|
await stop.wait()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|
|
|