开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4201|回复: 5
收起左侧

[Android逆向] 咸鱼之王 协议分享

[复制链接]
结帖率:100% (1/1)
发表于 2023-8-5 21:10:04 | 显示全部楼层 |阅读模式   湖北省武汉市
        //用 token 登录获取对应服务器连接信息
        public async static Task<object> LoginAuthuser(string info, int serverId = 0)
        {
            Dictionary<string, object> result = new Dictionary<string, object>()
            {
                ["info"] = info,
                ["platform"] = "hortor",
                ["platformExt"] = "mix",
                ["serverId"] = serverId,
            };
            BonEncoder encoder = new BonEncoder();
            encoder.encode(result);
            Dictionary<string, string> headers = new Dictionary<string, string>();
            headers.Add("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 9; Pixel 3 Build/PQ3A.190801.002)");
            headers.Add("Content-Type", "application/octet-stream");
            HttpClient client = new HttpClient(/*new HttpClientHandler() { UseCookies = true }*/);

            foreach (var item in headers)
            {
                client.DefaultRequestHeaders.TryAddWithoutValidation(item.Key, item.Value);
            }
            //StringContent content1 = new StringContent(content, Encoding.UTF8, "application/x-www-form-urlencoded");
            StreamContent content1 = new StreamContent(new MemoryStream(lz4XorEncode(encoder.getBytes())));
            content1.Headers.Add("content-type", "application/octet-stream");
            var bt = await client.PostAsync("https://xxz-xyzw.hortorgames.com/login/authuser?_seq=1", content1);
            var ret = await bt.Content.ReadAsStreamAsync() as MemoryStream;
            //var r = lz4XorDecode(ret.ToArray());
            BonDecoder decoder = new BonDecoder(ret.ToArray());
            Dictionary<string, object> dic = decoder.decode() as Dictionary<string, object>;
            decoder.reset((byte[])dic["body"]);
            return decoder.decode();
        }

        //用 token 获取服务器列表
        public async static Task<object> LoginsSrverList(string info)
        {
            try
            {
                Dictionary<string, object> result = new Dictionary<string, object>()
                {
                    ["platform"] = "hortor",
                    ["platformExt"] = "mix",
                    ["info"] = info,
                };
                BonEncoder encoder = new BonEncoder();
                encoder.encode(result);
                Dictionary<string, string> headers = new Dictionary<string, string>();
                headers.Add("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 9; Pixel 3 Build/PQ3A.190801.002)");
                //headers.Add("content-type", "application/octet-stream");
                HttpClient client = new HttpClient(/*new HttpClientHandler() { UseCookies = true }*/);
                foreach (var item in headers)
                {
                    client.DefaultRequestHeaders.TryAddWithoutValidation(item.Key, item.Value);
                }
                //StringContent content1 = new StringContent(content, Encoding.UTF8, "application/x-www-form-urlencoded");
                StreamContent content1 = new StreamContent(new MemoryStream(lz4XorEncode(encoder.getBytes())));
                content1.Headers.Add("content-type", "application/octet-stream");
                var bt = await client.PostAsync("https://xxz-xyzw.hortorgames.com/login/serverlist?_seq=2", content1);
                var ret = await bt.Content.ReadAsStreamAsync() as MemoryStream;
                //var r = lz4XorDecode(ret.ToArray());
                BonDecoder decoder = new BonDecoder(ret.ToArray());
                Dictionary<string, object> dic = decoder.decode() as Dictionary<string, object>;
                decoder.reset((byte[])dic["body"]);
                return decoder.decode();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            return null;

        }


        //游戏发包用到的算法
        private static byte[] lz4XorDecode(byte[] e)
        {
            byte t = (byte)((e[2] >> 6 & 1) << 7 | (e[2] >> 4 & 1) << 6 | (e[2] >> 2 & 1) << 5 | (e[2] >> 0 & 1) << 4 | (e[3] >> 6 & 1) << 3 | (e[3] >> 4 & 1) << 2 | (e[3] >> 2 & 1) << 1 | (e[3] >> 0 & 1) << 0);
            for (int n = Math.Min(100, e.Length); --n >= 2;) e[n] ^= t;
            e[0] = 4;
            e[1] = 34;
            e[2] = 77;
            e[3] = 24;
            //byte[] result = new byte[e.Length * 255];
            //int len = LZ4.Decompress(e, result);
            return Lz4.decompress(e);
        }
        private static byte[] lz4XorEncode(byte[] e)
        {
            e = Lz4.compress(e);
            byte t = (byte)(2 + ~~(248 * new Random().Next()));
            for (var n = Math.Min(e.Length, 100); --n >= 0;) e[n] ^= t;
            e[0] = 112;
            e[1] = 108;
            e[2] = (byte)(170 & e[2] | (t >> 7 & 1) << 6 | (t >> 6 & 1) << 4 | (t >> 5 & 1) << 2 | (t >> 4 & 1) << 0);
            e[3] = (byte)(170 & e[3] | (t >> 3 & 1) << 6 | (t >> 2 & 1) << 4 | (t >> 1 & 1) << 2 | (t >> 0 & 1) << 0);
            return e;
        }



        public static byte[] xorEncode(byte[] data)
        {
            int n = (int)(4294967295 * new Random().Next());
            int r = data.Length + 4;
            byte[] i = new byte[r];
            i[0] = (byte)(255 & n);
            i[1] = (byte)(n >> 8 & 255);
            i[2] = (byte)(n >> 16 & 255);
            i[3] = (byte)(n >> 24 & 255);
            Array.Copy(data, 0, i, 4, data.Length);
            var o = (byte)(2 + (248 * new Random().Next()));
            for (int a = i.Length; --a >= 0;)
            {
                i[a] ^= o;
            }
            i[0] = 112;
            i[1] = 120;
            i[2] = (byte)(170 & i[2] | (o >> 7 & 1) << 6 | (o >> 6 & 1) << 4 | (o >> 5 & 1) << 2 | (o >> 4 & 1) << 0);
            i[3] = (byte)(170 & i[3] | (o >> 3 & 1) << 6 | (o >> 2 & 1) << 4 | (o >> 1 & 1) << 2 | (o >> 0 & 1) << 0);
            return i;
        }
        public static byte[] xorDecode(byte[] e)
        {
            var t = (e[2] >> 6 & 1) << 7 | (e[2] >> 4 & 1) << 6 | (e[2] >> 2 & 1) << 5 | (e[2] >> 0 & 1) << 4 | (e[3] >> 6 & 1) << 3 | (e[3] >> 4 & 1) << 2 | (e[3] >> 2 & 1) << 1 | (e[3] >> 0 & 1) << 0;
            for (int n = e.Length; --n >= 4;)
            {
                e[n] ^= (byte)t;
            }
            return e.Skip(4).ToArray();

        }
结帖率:33% (1/3)
发表于 2024-1-25 11:57:17 | 显示全部楼层   湖南省长沙市
怎么用教教
回复 支持 反对

使用道具 举报

发表于 2023-9-19 21:41:39 | 显示全部楼层   浙江省宁波市
都是假的笑死
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)
发表于 2023-8-19 19:10:27 | 显示全部楼层   四川省成都市
回复 支持 反对

使用道具 举报

结帖率:50% (2/4)
发表于 2023-8-6 01:16:18 高大上手机用户 | 显示全部楼层   河北省廊坊市
有其开源的吗?
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)

签到天数: 12 天

发表于 2023-8-5 21:26:18 | 显示全部楼层   河南省商丘市
牛啊牛啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表