Пример #1
0
        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);
        }
Пример #2
0
        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;
            }
        }