Exemple #1
0
        public static byte[] tlv525(int flag, byte[] time, int Appid)         //1=普通登录 2=假锁登录
        {
            byte[] bytes = null;
            if (flag == 1)
            {
                bytes = new byte[] { 0, 1, 5, 0x36, 0, 2, 1, 0 };
            }
            else
            {
                bytes = new byte[] { 0, 1, 5, 0x36, 0, 0x41, 1, 3, 0, 0, 0, 0 };
                bytes = bytes.Concat(new byte[] { 0x3A, 0x4, 0x3, 0x9E }).ToArray();
                bytes = bytes.Concat(new byte[] { 4 }).ToArray();
                bytes = bytes.Concat(new byte[] { 0x65, 0x56, 0xAB, 0xB }).ToArray();               // 参数还未知,等等以后解
                bytes = bytes.Concat(time).ToArray();
                bytes = bytes.Concat(BitConverter.GetBytes(Appid).Reverse().ToArray()).ToArray();
                bytes = bytes.Concat(new byte[] { 0, 0, 0, 0 }).ToArray();
                bytes = bytes.Concat(API.GetRandByteArray(4)).ToArray();
                bytes = bytes.Concat(new byte[] { 4 }).ToArray();
                bytes = bytes.Concat(new byte[] { 0x65, 0x56, 0xAB, 0xB }).ToArray();               // 参数还未知,等等以后解
                bytes = bytes.Concat(time).ToArray();
                bytes = bytes.Concat(BitConverter.GetBytes(Appid).Reverse().ToArray()).ToArray();
                bytes = bytes.Concat(new byte[] { 0, 0, 0, 0 }).ToArray();
                bytes = bytes.Concat(new byte[] { 0x3A }).ToArray();
                bytes = bytes.Concat(API.GetRandByteArray(3)).ToArray();
                bytes = bytes.Concat(new byte[] { 4 }).ToArray();
                bytes = bytes.Concat(new byte[] { 0x65, 0x56, 0xAB, 0xB }).ToArray();
                bytes = bytes.Concat(time).ToArray();
                bytes = bytes.Concat(BitConverter.GetBytes(Appid).Reverse().ToArray()).ToArray();
            }
            byte[] bytesLen = BitConverter.GetBytes(Convert.ToInt16(bytes.Length)).Reverse().ToArray();
            var    retByte = new byte[] { 5, 0x25 }.Concat(bytesLen).Concat(bytes).ToArray();

            //Debug.Print("tlv525:" + retByte.Length.ToString + Environment.NewLine  + BitConverter.ToString(retByte).Replace("-", " "))
            return(retByte);
        }
Exemple #2
0
        //协议包结构:包头(四字节):协议号(两字节)+协议大小(两字节)  包体:协议字节

        #region tlv001 QQ号及服务器时间
        public static byte[] tlv001(byte[] user, byte[] times)
        {
            var bytes = new byte[] { 0, 1 }.Concat(API.GetRandByteArray(4)).ToArray();

            bytes = bytes.Concat(user).ToArray();
            bytes = bytes.Concat(times).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0 }).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0 }).ToArray();
            byte[] bytesLen = BitConverter.GetBytes(Convert.ToInt16(bytes.Length)).Reverse().ToArray();
            var    retByte = new byte[] { 0, 1 }.Concat(bytesLen).Concat(bytes).ToArray();

            //Debug.Print("tlv001:" + retByte.Length.ToString + Environment.NewLine  + BitConverter.ToString(retByte).Replace("-", " "))
            return(retByte);
        }
Exemple #3
0
        public static byte[] tlv544()
        {
            byte[] bytes = new byte[] { 0, 0, 7, 0xD9, 0, 0, 0, 0, 0, 0x2E, 0, 0x20 };
            bytes = bytes.Concat(API.GetRandByteArray(32)).ToArray();
            bytes = bytes.Concat(new byte[] { 0x0, 8, 0, 0, 0, 0, 0, 0, 0x50, 0xC9, 0, 3, 1, 0, 0, 0 }).ToArray();
            bytes = bytes.Concat(new byte[] { 0x4, 0, 0, 0, 1, 0, 0, 0, 1 }).ToArray();
            bytes = bytes.Concat(API.GetRandByteArray(15)).ToArray();
            bytes = bytes.Concat(new byte[] { 0x0, 0x14 }).ToArray();
            bytes = bytes.Concat(Encoding.UTF8.GetBytes("com.tencent.mobileqq")).ToArray();
            bytes = bytes.Concat(Encoding.UTF8.GetBytes("A6B745BF24A2C277527716F6F36EB68D")).ToArray();
            bytes = bytes.Concat(new byte[] { 6, 0xC, 0xAE, 0x6F, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x0, 0x10, 0xC, 0x0, 0x3F, 0x99, 0x46, 0xA5, 0xAA, 0x62, 0x43, 0xA3, 0xA8, 0xDA, 0x89, 0x53, 0x63, 0x81 }).ToArray();
            byte[] bytesLen = BitConverter.GetBytes(Convert.ToInt16(bytes.Length)).Reverse().ToArray();
            var    retByte = new byte[] { 5, 0x44 }.Concat(bytesLen).Concat(bytes).ToArray();

            //Debug.Print("tlv544:" + retByte.Length.ToString + Environment.NewLine  + BitConverter.ToString(retByte).Replace("-", " "))
            return(retByte);
        }
Exemple #4
0
        public static byte[] tlv106(byte[] user, byte[] md5pass, byte[] md5_2pass, byte[] _TGTKey, byte[] guidBytes, byte[] times, int appId, byte[] QQUTF8)
        {
            var bytes = new byte[] { 0, 4 }.Concat(API.GetRandByteArray(4)).ToArray();

            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0xD }).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0x10 }).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0 }).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0 }).ToArray();
            bytes = bytes.Concat(user).ToArray();
            bytes = bytes.Concat(times).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0 }).ToArray();
            bytes = bytes.Concat(new byte[] { 1 }).ToArray();
            bytes = bytes.Concat(md5pass).ToArray();
            bytes = bytes.Concat(_TGTKey).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 0, 1 }).ToArray();
            bytes = bytes.Concat(guidBytes).ToArray();
            if (appId < 0)
            {
                bytes = bytes.Concat(new byte[] { 0, 0, 0, 2 }).ToArray();
            }
            else
            {
                bytes = bytes.Concat(BitConverter.GetBytes(appId).Reverse().ToArray()).ToArray();
            }
            bytes = bytes.Concat(new byte[] { 0, 0, 0, 1 }).ToArray();
            bytes = bytes.Concat(BitConverter.GetBytes(Convert.ToInt16(QQUTF8.Length)).Reverse().ToArray()).ToArray();
            bytes = bytes.Concat(QQUTF8).ToArray();
            bytes = bytes.Concat(new byte[] { 0, 0 }).ToArray();
            //Debug.Print("tlv106:" + bytes.Length.ToString + Environment.NewLine  + BitConverter.ToString(bytes).Replace("-", ""))
            HashTea Hash     = new HashTea();
            var     byteHash = Hash.HashTEA(bytes, md5_2pass, 0, true);

            byte[] bytesLen = BitConverter.GetBytes(Convert.ToInt16(byteHash.Length)).Reverse().ToArray();
            var    retByte = new byte[] { 1, 6 }.Concat(bytesLen).Concat(byteHash).ToArray();

            //Debug.Print("tlv106:" + retByte.Length.ToString + Environment.NewLine  + BitConverter.ToString(retByte).Replace("-", ""))
            return(retByte);
        }
Exemple #5
0
        public static void Initialization(string Account, string Password)
        {
            API.QQ.Account = Account;
            API.QQ.LongQQ  = long.Parse(API.QQ.Account);
            API.QQ.UTF8    = Encoding.UTF8.GetBytes(API.QQ.Account);
            API.QQ.user    = API.HexStrToByteArray(API.QQ.LongQQ.ToString("X"));
            API.QQ.pass    = Password;
            API.QQ.md5_1   = API.MD5Hash(Encoding.UTF8.GetBytes(API.QQ.pass));
            byte[] md5_byte = API.QQ.md5_1.Concat(new byte[] { 0, 0, 0, 0 }).Concat(API.QQ.user).ToArray();
            API.QQ.md5_2 = API.MD5Hash(md5_byte);
            API.ECDH_Struct _ECDH = ECDH.GetECDHKeys();
            API.QQ.pub_key  = _ECDH.PublicKey;
            API.QQ.shareKey = _ECDH.Sharekey;
            API.QQ.prikey   = _ECDH.PrivateKey;

            API.QQ.mRequestID = 10000;
            API.QQ.key        = new byte[16];
            var timestampHex = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString();

            API.QQ.login_Time = API.HexStrToByteArray(int.Parse(timestampHex).ToString("X"));


            API.QQ.TGTKey        = API.MD5Hash(API.QQ.pub_key);
            API.QQ.randKey       = API.MD5Hash(API.QQ.shareKey);
            API.QQ.MsgCookies    = API.GetRandByteArray(4);
            API.QQ.Appid         = 537065990;
            API.UN_Tlv.T108_ksid = API.HexStrToByteArray("93AC689396D57E5F9496B81536AAFE91");
            var          timestamp      = long.Parse(Convert.ToInt64(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds).ToString().Substring(0, 10));
            SyncCoookies SyncTimeStruct = new SyncCoookies
            {
                timestamp1 = timestamp,
                timestamp2 = timestamp,
                timestamp3 = timestamp,
                Field3     = 805979870,
                Field4     = 3344460674,
                Field5     = 82343012,
                Field6     = 3281833389,
                Field7     = 2696570484,
                Field8     = 81,
                Field10    = 0
            };

            using (var ms = new MemoryStream())
            {
                Serializer.Serialize(ms, SyncTimeStruct);
                API.QQ.SyncCoookies = ms.ToArray();
            }

            API.Device.imei         = "865166024867445";
            API.Device.Imsi         = "460001330114682";
            API.Device.WIFIByteSSID = API.MD5Hash(Encoding.UTF8.GetBytes("5c:11:21:11:19:1f"));
            API.Device.WIFISSID     = "dlb";
            API.Device.Ver          = "|" + API.Device.imei + "|A8.5.0.4003a808";    //手机串号加QQ版本
            API.Device.Version      = Encoding.UTF8.GetBytes("A8.5.0.4003a808");
            API.Device.MacBytes     = Encoding.UTF8.GetBytes("DA-EB-D5-1C-7B-CD");
            API.Device.MacId        = "84:18:38:38:96:36";
            API.Device.GUIDBytes    = API.MD5Hash(Encoding.UTF8.GetBytes("b7981398-337d-4d2c-ab64-22b5b6f297dc"));
            API.Device.AndroidID    = API.MD5Hash(Encoding.UTF8.GetBytes("95dcc49a9434f65a"));
            API.Device.AppId        = 537042771;
            API.Device.os_type      = "android";        //'安卓版本
            API.Device.os_version   = "5.1.1";
            API.Device.network_type = "China Mobile GSM";
            API.Device.apn          = "wifi";
            API.Device.model        = "oppo r9 plustm a";                                                                                            //手机型号
            API.Device.brands       = "oppo";                                                                                                        //手机品牌
            API.Device.Apk_Id       = "com.tencent.mobileqq";
            API.Device.Apk_V        = "8.5.0";                                                                                                       //安卓版本
            API.Device.ApkSig       = new byte[] { 0xA6, 0xB7, 0x45, 0xBF, 0x24, 0xA2, 0xC2, 0x77, 0x52, 0x77, 0x16, 0xF6, 0xF3, 0x6E, 0xB6, 0x8D }; //固定app_sign
        }
Exemple #6
0
        public static byte[] PackOnlineStatus(string cmd, int LonginType)
        {
            if (API.QQ.mRequestID > 2147483647)
            {
                API.QQ.mRequestID = 10000;
            }
            else
            {
                API.QQ.mRequestID += 1;
            }
            var bytes1 = BitConverter.GetBytes(API.QQ.mRequestID).Reverse().ToArray();

            bytes1 = bytes1.Concat(BitConverter.GetBytes(API.QQ.Appid).Reverse().ToArray()).ToArray();
            bytes1 = bytes1.Concat(BitConverter.GetBytes(API.QQ.Appid).Reverse().ToArray()).ToArray();
            bytes1 = bytes1.Concat(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }).ToArray();
            bytes1 = bytes1.Concat(BitConverter.GetBytes(API.UN_Tlv.T10A_token_A4.Length + 4).Reverse().ToArray()).ToArray().Concat(API.UN_Tlv.T10A_token_A4).ToArray();
            bytes1 = bytes1.Concat(BitConverter.GetBytes(cmd.Length + 4).Reverse().ToArray()).ToArray().Concat(Encoding.UTF8.GetBytes(cmd)).ToArray();                         //命令行
            bytes1 = bytes1.Concat(BitConverter.GetBytes(API.QQ.MsgCookies.Length + 4).Reverse().ToArray()).ToArray().Concat(API.QQ.MsgCookies).ToArray();                     //MsgCookies
            bytes1 = bytes1.Concat(BitConverter.GetBytes(API.Device.imei.Length + 4).Reverse().ToArray()).ToArray().Concat(Encoding.UTF8.GetBytes(API.Device.imei)).ToArray(); //Device.imei
            if (LonginType == 0)
            {
                bytes1 = bytes1.Concat(new byte[] { 0, 0, 0, 4 }).ToArray();
            }
            else if (LonginType == 1)
            {
                bytes1 = bytes1.Concat(API.GetRandByteArray(16)).ToArray();
            }
            else if (LonginType == 2)
            {
                bytes1 = bytes1.Concat(new byte[16]).ToArray();
            }
            bytes1 = bytes1.Concat(new byte[] { 0, 0x23 }).ToArray();
            bytes1 = bytes1.Concat(Encoding.UTF8.GetBytes(API.Device.Ver)).ToArray();
            bytes1 = bytes1.Concat(new byte[] { 0, 0, 0, 0x2A }).ToArray();
            bytes1 = bytes1.Concat(Encoding.UTF8.GetBytes("b$1ebc85de7365de4d155ce40110001581471d")).ToArray();

            var bytes2 = new byte[] { 0x10, 3, 0x2C, 0x3C, 0x4C, 0x56, 0xB };

            bytes2 = bytes2.Concat(Encoding.UTF8.GetBytes("PushService")).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0x66, 0xE }).ToArray();
            bytes2 = bytes2.Concat(Encoding.UTF8.GetBytes("SvcReqRegister}")).ToArray();
            if (LonginType == 0)
            {
                bytes2 = bytes2.Concat(new byte[] { 0, 1, 0, 0xE6, 8, 0 }).ToArray();
            }
            else if (LonginType == 1)
            {
                bytes2 = bytes2.Concat(new byte[] { 0, 1, 0, 0xEA, 8, 0 }).ToArray();
            }
            else if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0, 1, 0, 0xBD, 8, 0 }).ToArray();
            }
            bytes2 = bytes2.Concat(new byte[] { 1, 6, 0xE }).ToArray();
            bytes2 = bytes2.Concat(Encoding.UTF8.GetBytes("SvcReqRegister")).ToArray();
            if (LonginType == 0)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x1D, 0, 1, 0, 0xCE, 0xA, 3, 0, 0, 0, 0 }).ToArray();
            }
            else if (LonginType == 1)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x1D, 0, 1, 0, 0xD2, 0xA, 3, 0, 0, 0, 0 }).ToArray();
            }
            else if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x1D, 0, 1, 0, 0xA5, 0xA, 3, 0, 0, 0, 0 }).ToArray();
            }
            bytes2 = bytes2.Concat(API.QQ.user).ToArray();
            if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x1C }).ToArray();
            }
            else
            {
                bytes2 = bytes2.Concat(new byte[] { 0x10, 7 }).ToArray();
            }
            bytes2 = bytes2.Concat(new byte[] { 0x2C, 0x36, 0 }).ToArray();
            if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x40, 0x15 }).ToArray();
            }
            else
            {
                bytes2 = bytes2.Concat(new byte[] { 0x40, 0xB }).ToArray();
            }
            bytes2 = bytes2.Concat(new byte[] { 0x5C, 0x6C, 0x7C, 0x8C, 0x9C, 0xA0, 0x75, 0xB0, 0x16, 0xC0, 1, 0xD6, 0, 0xEC, 0xFD, 0x10, 0, 0, 0x10 }).ToArray();
            bytes2 = bytes2.Concat(API.Device.GUIDBytes).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0xF1, 0x11, 8, 4, 0xFC, 0x12 }).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x13 }).ToArray();
            bytes2 = bytes2.Concat(BitConverter.GetBytes(Convert.ToInt16(API.Device.model.Length)).ToArray().Take(1).ToArray()).ToArray();
            bytes2 = bytes2.Concat(Encoding.UTF8.GetBytes(API.Device.model)).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x14 }).ToArray();
            bytes2 = bytes2.Concat(BitConverter.GetBytes(Convert.ToInt16(API.Device.model.Length)).ToArray().Take(1).ToArray()).ToArray();
            bytes2 = bytes2.Concat(Encoding.UTF8.GetBytes(API.Device.model)).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x15 }).ToArray();
            bytes2 = bytes2.Concat(BitConverter.GetBytes(Convert.ToInt16(API.Device.os_version.Length)).ToArray().Take(1).ToArray()).ToArray();
            bytes2 = bytes2.Concat(Encoding.UTF8.GetBytes(API.Device.os_version)).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0xF0, 0x16, 1 }).ToArray();
            if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF1, 0x17 }).ToArray();
            }
            else
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF1, 0x17, 0, 0xD7 }).ToArray();
            }
            bytes2 = bytes2.Concat(new byte[] { 0xFC, 0x18 }).ToArray();
            if (LonginType == 0)
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF3, 0x1A, 0, 0, 0, 0, 0xA6, 0x3C, 0x5E, 0x7D, 0xF2, 0x1B, 0x5F, 0xD, 0x60, 0x71 }).ToArray();
            }
            else if (LonginType == 1)
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF3, 0x1A, 0, 0, 0, 0, 0xD9, 0xC, 0x60, 0x71, 0xF3, 0x1B, 0, 0, 0, 0, 0xA6, 0x3C, 0x5E, 0x7D }).ToArray();
            }
            else if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0xFC, 0x1A, 0xFC, 0x1B }).ToArray();
            }
            bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x1C, 0, 0xFC, 0x1D }).ToArray();
            if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x1E, 0, 0xF6, 0x1F, 0 }).ToArray();
            }
            else
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x1E, 7, 0x5B, 0x75, 0x5D, 0x6F, 0x70, 0x70, 0x6F, 0xF6, 0x1F, 0x14, 0x3F, 0x4C, 0x59, 0x5A, 0x32, 0x38, 0x4E, 0x3B, 0x61, 0x6E, 0x64, 0x72, 0x6F, 0x69, 0x64, 0x5F, 0x78, 0x38, 0x36, 0x2D }).ToArray();
            }
            bytes2 = bytes2.Concat(new byte[] { 0xF6, 0x20, 0x0, 0xFD, 0x21, 0x0, 0x0, 0x11, 0xA, 0x8, 0x8, 0x2E, 0x10, 0x9A, 0xEF, 0x9C, 0xFB, 0x5, 0xA, 0x5, 0x8, 0x9B, 0x2, 0x10, 0x0, 0xFC, 0x22, 0xFC, 0x24 }).ToArray();
            if (LonginType == 2)
            {
                bytes2 = bytes2.Concat(new byte[] { 0xF0, 0x26, 0xFF }).ToArray();
            }
            else
            {
                bytes2 = bytes2.Concat(new byte[] { 0xFC, 0x26 }).ToArray();
            }

            bytes2 = bytes2.Concat(new byte[] { 0xFC, 0x27, 0xFA, 0x2A, 0x0, 0x1, 0xB, 0xB, 0x8C, 0x98, 0xC, 0xA8, 0xC }).ToArray();

            var bytes = BitConverter.GetBytes(bytes1.Length + 4).Reverse().ToArray();

            bytes = bytes.Concat(bytes1).ToArray();
            bytes = bytes.Concat(BitConverter.GetBytes(bytes2.Length + 4).Reverse().ToArray()).ToArray();
            bytes = bytes.Concat(bytes2).ToArray();
            Debug.Print("在线状态包:" + bytes.Length.ToString() + "\r\n" + BitConverter.ToString(bytes).Replace("-", " "));

            HashTea Hash = new HashTea();

            byte[] retByte = Hash.HashTEA(bytes, API.UN_Tlv.T305_SessionKey, 0, true);
            return(PackHeader(retByte, 2));
        }
Exemple #7
0
        public static byte[] PackLoginHeader(string servicecmd, byte[] bytesIn, int loginType)         //0 = 普通登录 1 = 验证码登录
        {
            var HeaderBytes = BitConverter.GetBytes(API.QQ.mRequestID).Reverse().ToArray();

            HeaderBytes = HeaderBytes.Concat(BitConverter.GetBytes(API.QQ.Appid).Reverse().ToArray()).ToArray();
            HeaderBytes = HeaderBytes.Concat(BitConverter.GetBytes(API.QQ.Appid).Reverse().ToArray()).ToArray();
            HeaderBytes = HeaderBytes.Concat(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4 }).ToArray();
            HeaderBytes = HeaderBytes.Concat(BitConverter.GetBytes(servicecmd.Length + 4).Reverse().ToArray()).ToArray();
            HeaderBytes = HeaderBytes.Concat(Encoding.UTF8.GetBytes(servicecmd)).ToArray();
            HeaderBytes = HeaderBytes.Concat(new byte[] { 0, 0, 0, 8 }).ToArray();
            if (loginType == 0)
            {
                HeaderBytes = HeaderBytes.Concat(new byte[] { 0x6C, 0x6A, 0xED, 0x65 }).ToArray();
            }
            else if (loginType == 1)
            {
                HeaderBytes = HeaderBytes.Concat(new byte[] { 0xB, 0x63, 0xE0, 0x82 }).ToArray();
            }
            HeaderBytes = HeaderBytes.Concat(BitConverter.GetBytes(API.Device.imei.Length + 4).Reverse().ToArray()).ToArray();
            HeaderBytes = HeaderBytes.Concat(Encoding.UTF8.GetBytes(API.Device.imei)).ToArray();
            HeaderBytes = HeaderBytes.Concat(new byte[] { 0, 0, 0, 4 }).ToArray();
            HeaderBytes = HeaderBytes.Concat(BitConverter.GetBytes(Convert.ToInt16(API.Device.Ver.Length + 2)).Reverse().ToArray()).ToArray();
            HeaderBytes = HeaderBytes.Concat(Encoding.UTF8.GetBytes(API.Device.Ver)).ToArray();
            HeaderBytes = HeaderBytes.Concat(new byte[] { 0, 0, 0, 0x2A }).ToArray();
            HeaderBytes = HeaderBytes.Concat(Encoding.UTF8.GetBytes("b$1ebc85de7365de4d155ce40110001581471d")).ToArray();
            var HeaderLen = BitConverter.GetBytes(Convert.ToInt16(HeaderBytes.Length + 4)).Reverse().ToArray();

            HeaderBytes = new byte[] { 0, 0 }.Concat(HeaderLen).ToArray().Concat(HeaderBytes).ToArray();


            var bytes2 = new byte[] { 0x1F, 0x41, 8, 0x10, 0, 1 };

            bytes2 = bytes2.Concat(API.QQ.user).ToArray();
            if (loginType == 0)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x3, 0x87, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1 }).ToArray();
            }
            else if (loginType == 1)
            {
                bytes2 = bytes2.Concat(new byte[] { 0x3, 0x7, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1 }).ToArray();
            }
            bytes2 = bytes2.Concat(API.GetRandByteArray(16)).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 1, 0x31, 0, 1 }).ToArray();
            bytes2 = bytes2.Concat(new byte[] { 0, 0x41 }).ToArray();
            bytes2 = bytes2.Concat(API.QQ.pub_key).ToArray();      //65字节
            bytes2 = bytes2.Concat(bytesIn).ToArray();             //1392
            var BodyLen = BitConverter.GetBytes(Convert.ToInt16(bytes2.Length + 4)).Reverse().ToArray();

            bytes2 = new byte[] { 2 }.Concat(BodyLen).ToArray().Concat(bytes2).ToArray().Concat(new byte[] { 3 }).ToArray();

            var bytes = HeaderBytes.Concat(BitConverter.GetBytes(bytes2.Length + 4).Reverse().ToArray()).ToArray().Concat(bytes2).ToArray();

            //Debug.Print("PackLoginHeader:" + bytes.Length.ToString + Environment.NewLine  + BitConverter.ToString(bytes).Replace("-", " "))
            HashTea Hash = new HashTea();

            byte[] EncodeByte = Hash.HashTEA(bytes, API.QQ.key, 0, true);
            //Debug.Print("EncodeByte:" + EncodeByte.Length.ToString + Environment.NewLine  + BitConverter.ToString(EncodeByte).Replace("-", " "))
            var retByte = PackHeader(EncodeByte, loginType);

            return(retByte);
        }