|
|
|
@ -12,53 +12,10 @@ extern "C"
|
|
|
|
|
#include <windivert.h>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace llarp::win32
|
|
|
|
|
{
|
|
|
|
|
static auto logcat = log::Cat("windivert");
|
|
|
|
|
|
|
|
|
|
namespace wd
|
|
|
|
|
{
|
|
|
|
|
namespace
|
|
|
|
|
{
|
|
|
|
|
decltype(::WinDivertOpen)* open = nullptr;
|
|
|
|
|
decltype(::WinDivertClose)* close = nullptr;
|
|
|
|
|
decltype(::WinDivertShutdown)* shutdown = nullptr;
|
|
|
|
|
decltype(::WinDivertHelperCalcChecksums)* calc_checksum = nullptr;
|
|
|
|
|
decltype(::WinDivertSend)* send = nullptr;
|
|
|
|
|
decltype(::WinDivertRecv)* recv = nullptr;
|
|
|
|
|
decltype(::WinDivertHelperFormatIPv4Address)* format_ip4 = nullptr;
|
|
|
|
|
decltype(::WinDivertHelperFormatIPv6Address)* format_ip6 = nullptr;
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
Initialize()
|
|
|
|
|
{
|
|
|
|
|
if (wd::open)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
|
load_dll_functions(
|
|
|
|
|
"WinDivert.dll",
|
|
|
|
|
|
|
|
|
|
"WinDivertOpen", open,
|
|
|
|
|
"WinDivertClose", close,
|
|
|
|
|
"WinDivertShutdown", shutdown,
|
|
|
|
|
"WinDivertHelperCalcChecksums", calc_checksum,
|
|
|
|
|
"WinDivertSend", send,
|
|
|
|
|
"WinDivertRecv", recv,
|
|
|
|
|
"WinDivertHelperFormatIPv4Address", format_ip4,
|
|
|
|
|
"WinDivertHelperFormatIPv6Address", format_ip6);
|
|
|
|
|
// clang-format on
|
|
|
|
|
}
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
struct Packet
|
|
|
|
|
{
|
|
|
|
|
std::vector<byte_t> pkt;
|
|
|
|
|
WINDIVERT_ADDRESS addr;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
log_windivert_addr(const WINDIVERT_ADDRESS& addr)
|
|
|
|
|
std::string
|
|
|
|
|
windivert_addr_to_string(const WINDIVERT_ADDRESS& addr)
|
|
|
|
|
{
|
|
|
|
|
std::string layer_str{};
|
|
|
|
|
std::string ifidx_str{};
|
|
|
|
@ -122,8 +79,7 @@ namespace llarp::win32
|
|
|
|
|
event_str = "unknown";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log::trace(
|
|
|
|
|
logcat,
|
|
|
|
|
return fmt::format(
|
|
|
|
|
"Windivert WINDIVERT_ADDRESS -- Timestamp: {}, Layer: {}, Event: {}, Sniffed: {}, "
|
|
|
|
|
"Outbound: {}, Loopback: {}, Imposter: {}, IPv6: {}, IPChecksum: {}, TCPChecksum: {}, "
|
|
|
|
|
"UDPChecksum: {}, {}",
|
|
|
|
@ -140,6 +96,52 @@ namespace llarp::win32
|
|
|
|
|
addr.UDPChecksum ? "true" : "false",
|
|
|
|
|
ifidx_str);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace llarp::win32
|
|
|
|
|
{
|
|
|
|
|
static auto logcat = log::Cat("windivert");
|
|
|
|
|
|
|
|
|
|
namespace wd
|
|
|
|
|
{
|
|
|
|
|
namespace
|
|
|
|
|
{
|
|
|
|
|
decltype(::WinDivertOpen)* open = nullptr;
|
|
|
|
|
decltype(::WinDivertClose)* close = nullptr;
|
|
|
|
|
decltype(::WinDivertShutdown)* shutdown = nullptr;
|
|
|
|
|
decltype(::WinDivertHelperCalcChecksums)* calc_checksum = nullptr;
|
|
|
|
|
decltype(::WinDivertSend)* send = nullptr;
|
|
|
|
|
decltype(::WinDivertRecv)* recv = nullptr;
|
|
|
|
|
decltype(::WinDivertHelperFormatIPv4Address)* format_ip4 = nullptr;
|
|
|
|
|
decltype(::WinDivertHelperFormatIPv6Address)* format_ip6 = nullptr;
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
Initialize()
|
|
|
|
|
{
|
|
|
|
|
if (wd::open)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// clang-format off
|
|
|
|
|
load_dll_functions(
|
|
|
|
|
"WinDivert.dll",
|
|
|
|
|
|
|
|
|
|
"WinDivertOpen", open,
|
|
|
|
|
"WinDivertClose", close,
|
|
|
|
|
"WinDivertShutdown", shutdown,
|
|
|
|
|
"WinDivertHelperCalcChecksums", calc_checksum,
|
|
|
|
|
"WinDivertSend", send,
|
|
|
|
|
"WinDivertRecv", recv,
|
|
|
|
|
"WinDivertHelperFormatIPv4Address", format_ip4,
|
|
|
|
|
"WinDivertHelperFormatIPv6Address", format_ip6);
|
|
|
|
|
// clang-format on
|
|
|
|
|
}
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
struct Packet
|
|
|
|
|
{
|
|
|
|
|
std::vector<byte_t> pkt;
|
|
|
|
|
WINDIVERT_ADDRESS addr;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class IO : public llarp::vpn::I_Packet_IO
|
|
|
|
|
{
|
|
|
|
@ -195,8 +197,7 @@ namespace llarp::win32
|
|
|
|
|
pkt.resize(sz);
|
|
|
|
|
|
|
|
|
|
log::trace(logcat, "got packet of size {}B", sz);
|
|
|
|
|
log_windivert_addr(addr);
|
|
|
|
|
|
|
|
|
|
log::trace(logcat, "{}", windivert_addr_to_string(addr));
|
|
|
|
|
return Packet{std::move(pkt), std::move(addr)};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -209,7 +210,7 @@ namespace llarp::win32
|
|
|
|
|
addr->Outbound = !addr->Outbound; // re-used from recv, so invert direction
|
|
|
|
|
|
|
|
|
|
log::trace(logcat, "send dns packet of size {}B", pkt.size());
|
|
|
|
|
log_windivert_addr(w_pkt.addr);
|
|
|
|
|
log::trace(logcat, "{}", windivert_addr_to_string(w_pkt.addr));
|
|
|
|
|
|
|
|
|
|
UINT sz{};
|
|
|
|
|
// recalc IP packet checksum in case it needs it
|
|
|
|
|