Files
workphone-sdk/sdk/scripts/frida_host_proxy.py
2026-07-23 23:40:57 +08:00

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())