Как Wine отправляет пакеты на inte rnet? - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы иметь возможность читать, используя подход 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-сообщения, предназначенные для внешней сети?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...