Я хотел бы иметь возможность читать, используя подход MITM, сетевые пакеты, отправляемые в Inte rnet приложением, работающим на Wine.
Моим первым подходом было наивное подключение функций send
и recv
с использованием трюка LD_PRELOAD и кода, подобного этому:
#include <sys/socket.h>
#ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
#endif
#include <dlfcn.h>
#include <cstdio>
using SendFunctionType = ssize_t (*)(int, const void *, size_t, int);
SendFunctionType original_send = nullptr;
ssize_t send(int fd, void const *buf, size_t n, int flags) {
// On first call, save the original send function.
if (original_send == nullptr) {
original_send = (SendFunctionType)dlsym(RTLD_NEXT, "send");
}
// Do something with the message transmitted.
printf("I hooked my message!\n");
return original_send(fd, buf, n, flags);
}
I затем выполнил LD_PRELOAD=/path/to/hook.so wine myprogram
и ждал, пока какой-нибудь текст появится напрасно.
Я знаю, что программа, запущенная через Wine, взаимодействует с Inte rnet, потому что, во-первых, программа работает должным образом, а во-вторых, я вижу TCP-пакеты на Wireshark. Более того, я знаю, что используемый IP-адрес - это IPv4.
После небольшого поиска по архитектуре Wine я обнаружил, что Wine - это инструмент сервер / клиент, поэтому я протестировал применить тот же трюк LD_PRELOAD на сервер Wine, явно запущенный мной до моего звонка на wine my_program
. Более того, когда искал в исходном коде Wine , я обнаружил, что было несколько звонков на sendmsg
. Поэтому я добавил ловушку для функции sendmsg
(и recvmsg) (аналогичную описанной выше для send
) и снова попытался подключить клиент и сервер.
Я получил больше результатов:
- Сервер Wine использует функцию
sendmsg
с дескриптором файла, который не связан с IPv4-адресом. - Сервер Wine использует функцию
recv
с описанием файла, связанным с IPv4-адресом «192.168.0.19», то есть с локальным адресом. - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1031 с файловым дескриптором, который не связан с адресом IPv4. Я чуть не пропустил эти звонки из-за их низкой частоты появления по сравнению с
recv
и sendmsg
.
Я наконец попытался, чтобы проверить, перехватить функции read
и write
. Конечно, у меня на экране появилось несколько строк, но в файле-дескрипторе, связанном с любым IPv4-адресом, нет read
/ write
.
Вот где я застрял прямо сейчас. Мне кажется, что я перехватил все возможные способы доступа Wine к сети, но я не смог найти ни одного сообщения, направленного на внешний IPv4. Вероятно, я ищу вызовы recv
и sendmsg
, поскольку они происходят, когда я ожидаю, что сетевой запрос произойдет, но я не мог понять, как правильно восстановить данные. Более того, несимметрия между recv
и sendmsg
(почему бы не send
для симметрии с recv
?) И тот факт, что используемый дескриптор файла не связан с внешним IPv4, вызывает у меня сомнения.
У меня такой вопрос: как Wine пересылает TCP-сообщения, предназначенные для внешней сети?