Прошло много времени с тех пор, как я занимался этой темой, и на самом деле не удосужился проверить, что мой знакомый, Денис Власенко , сопровождающий Busybox, предложил мне решение в течение нескольких месяцев.тому назад.Поскольку я только что проверил свою учетную запись здесь в StackOverflow и снова увидел вопрос, позвольте мне поделиться с вами его идеями.Может быть, это кому-нибудь пригодится:
Один относительно легкий взлом, который я могу предложить, заключается в следующем:
Я предполагаю, что у вас есть работающее серверное приложение, которое открыло прослушивание домена Unixсокет (скажем, /tmp/some.socket
), и клиентские программы подключаются к нему и общаются с сервером.
- переименовывает
/tmp/some.socket
-> /tmp/some.socket1
- создает новый сокет /tmp / some.socket
- прослушивать его для новых клиентских подключений
- для каждого такого подключения, открыть другое подключение к
/tmp/some.socket1
к исходному процессу сервера - pump data (client<-> сервер) над полученными парами сокетов (код для выполнения очень похож на то, что делает сервер telnetd) до EOF с любой стороны.
Пока вы перекачиваете данные, легко взглянуть наего, чтобы сохранить и даже изменить, если нужно.
Недостатком является то, что эту программу перехвата необходимо перезапускать каждый раз, когда перезапускается исходная серверная программа.
Это похоже на то, что Селада также ответил.Спасибо ему тоже!Ответ Дениса был немного более конкретным.
Я спросил:
Это звучит глупо, да, из-за необходимости перезагрузки, но выполнимо.Я не программист на C, но мне все еще интересно, знаете ли вы инструмент командной строки, который мог бы выполнять для меня сквозную передачу, протоколирование или запуск по событиям.У меня есть один парень из нашего проекта, который может взломать небольшой бинарный файл C для этого, но я не уверен, что ему нравится это делать.Если есть что-то заранее приготовленное, я бы предпочел это.Может ли это быть даже сделано с помощью (комбинации) апплетов BusyBox, может быть?
Денис снова ответил:
Вам нужно создать busybox с CONFIG_FEATURE_UNIX_LOCAL=y
.
Запустите следующее в качестве перехватывающего сервера:
busybox tcpsvd -vvvE local:/tmp/socket 0 ./script.sh
Где script.sh - это простое сквозное соединение с «исходным сервером»:
#!/bin/sh
busybox nc -o /tmp/hexdump.$$ local:/tmp/socket1 0
КакНапример, я добавил шестнадцатеричное ведение журнала в файл (опция -o FILE
).
Проверьте его, запустив эмулируемый «оригинальный сервер»:
busybox tcpsvd -vvvE local:/tmp/socket1 0 sh -c 'echo PID:$$'
и подключившись к «перехватывающему серверу»:
echo Hello world | busybox nc local:/tmp/socket 0
Вы должны увидеть сообщение «PID: 19094» и иметь новый файл /tmp/hexdump.19093
с сохраненными данными.Оба процесса tcpsvd также должны печатать некоторые журналы (они запускаются с -vvv
многословием).
Если вам нужна более сложная обработка, замените вызов nc в script.sh
пользовательской программой.