Пример #1
0
            public List <byte> MakeHeartbeat(byte[] sip, byte[] challenge_seed, bool first = false)
            {
                List <byte> data = new List <byte>();

                // DrcomDialExtProtoHeader - 5 bytes
                data.Add(0x07);                                                   // code
                data.Add(count);                                                  // id
                data.AddRange(new byte[] { 0x60, 0x00 });                         // length
                data.Add(0x03);                                                   // type
                data.Add(0x00);                                                   // uid length
                data.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); // mac
                data.AddRange(sip);                                               // AuthHostIP
                if (first)
                {
                    data.AddRange(new byte[] { 0x00, 0x62, 0x00 });
                    data.Add(pppoe_flag);
                }
                else
                {
                    data.AddRange(new byte[] { 0x00, 0x63, 0x00 });
                    data.Add(pppoe_flag);
                }
                data.AddRange(challenge_seed); // Challenge Seed

                int encrypt_mode = BitConverter.ToInt32(challenge_seed, 0) & 3;
                Tuple <List <byte>, bool> res = KA2.GenerateCRC(challenge_seed, encrypt_mode);
                List <byte> crc = res.Item1;
                bool        foo = res.Item2;

                data.AddRange(crc);
                if (foo == false)
                {
                    int crc2 = (DrcomCRC32(data.ToArray()) * 19680126) /*& 0xFFFFFFFF*/;
                    data.RemoveRange(data.Count - 8, 8);
                    data.AddRange(BitConverter.GetBytes(crc2));
                    data.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00 });
                }
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 16; j++)
                    {
                        data.Add(0x00);
                    }
                }
                return(data);
            }
Пример #2
0
            public static List <byte> KeepAlivePackageBuilder(byte number, int random, byte[] tail, byte type = 1, bool first = false)
            {
                List <byte> data = new List <byte>();

                data.Add(0x07);
                data.Add(number);
                data.AddRange(new byte[] { 0x28, 0x00, 0x0b });
                data.Add(type);
                if (first)
                {
                    data.AddRange(new byte[] { 0x0f, 0x27 });
                }
                else
                {
                    data.AddRange(new byte[] { keep_alive2_flag, 0x02 });
                }
                data.AddRange(new byte[] { 0x2f, 0x12 });
                for (int i = 0; i < 6; i++)
                {
                    data.Add(0x00);
                }
                data.AddRange(tail);
                if (type == 3)
                {
                    byte[] foo                    = new byte[] { 0x00, 0x00, 0x00, 0x00 };
                    int    encrypt_mode           = BitConverter.ToInt32(tail, 0) & 3;
                    Tuple <List <byte>, bool> res = KA2.GenerateCRC(data.ToArray(), encrypt_mode);
                    List <byte> crc               = res.Item1;
                    bool        val               = res.Item2;
                    data.AddRange(crc);
                    data.AddRange(foo);
                    for (int i = 0; i < 8; i++)
                    {
                        data.Add(0x00);
                    }
                }
                else //packet type = 1
                {
                    for (int i = 0; i < 20; i++)
                    {
                        data.Add(0x00);
                    }
                }
                return(data);
            }
Пример #3
0
        public static void BeginHeartbeat(Func <Exception, bool> OnException)
        {
            onException = OnException;
            unchecked
            {
                if (!BitConverter.IsLittleEndian)
                {
                    exit = onException(new SystemException("Unsupported system"));
                    if (exit)
                    {
                        return;
                    }
                }

                Socketx s = new Socketx(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Unspecified);
                while (!exit)
                {
                    PPPOEHeartbeat pppoe = new PPPOEHeartbeat();
                    pppoe.Send(s);
                    KA2.KeepAlive2(s, pppoe);
                }
            }
        }