private static void Main(string[] args) { Console.WriteLine("Init.."); if (args.Length >= 1) { if (args[0].Length < 42 || args[0].Length > 42) { Console.WriteLine(@"ERROR: Invalid ETH Wallet, should be 42 chars long."); Console.Read(); return; } _strOurWallet = args[0]; _byteOurWallet = Encoding.ASCII.GetBytes(_strOurWallet); } else { Console.WriteLine(@"INFO: No wallet argument was found, using the default wallet."); } Console.WriteLine($"Current Wallet: {_strOurWallet}\n"); InstallWinDivert(); var hosts = Dns.GetHostAddresses(_poolAddress); Console.WriteLine($"ip {hosts[0]}, pool: {_poolAddress}, port: {_poolPort}"); // Create filter var filter = $"!loopback and outbound && ip && tcp && tcp.PayloadLength > 0 && ip.DstAddr == {hosts[0]} && tcp.DstPort == {_poolPort}"; // Check filter var ret = WinDivertNative.WinDivertHelperCompileFilter(filter, WinDivertNative.WinDivertLayer.Network, IntPtr.Zero, 0, out IntPtr errStrPtr, out uint errPos); if (!ret) { var errStr = Marshal.PtrToStringAnsi(errStrPtr); throw new Exception($"Filter string is invalid at position {errPos}\n{errStr}"); } // Open new handle _divertHandle = WinDivertNative.WinDivertOpen(filter, WinDivertNative.WinDivertLayer.Network, 0, 0); // Check handle is null if (_divertHandle == IntPtr.Zero) { return; } Console.CancelKeyPress += delegate { _running = false; }; Console.WriteLine(@"Listening.."); Divert(); WinDivertNative.WinDivertClose(_divertHandle); }
private unsafe static void Divert() { // Allocate buffer var buffer = new byte[4096]; try { fixed(byte *p = buffer) { var ptr = new IntPtr(p); while (_running) { // Receive data WinDivertNative.WinDivertRecv(_divertHandle, ptr, (uint)buffer.Length, out uint readLen, out WinDivertNative.Address addr); // Process captured packet var changed = ProcessPacket(buffer, readLen); // Recalculate checksum if (changed) { WinDivertNative.WinDivertHelperCalcChecksums(ptr, readLen, 0); } WinDivertNative.WinDivertSend(_divertHandle, ptr, readLen, out var pSendLen, ref addr); } } } catch (Exception e) { Console.WriteLine(e.ToString()); Console.ReadLine(); return; } }