网页游戏外挂辅助AMF模拟通讯必备


这两天写一个游戏的外挂,使用AMF3的协议,使用C# 模拟客户端请求,放出源码,AMF请求 封包。

 class AMF_Post_Data
    {
        public List<byte> message;

        /// <summary>
        /// 初始化Message
        /// </summary>
        /// <param name="at"></param>
        /// <param name="headers"></param>
        /// <param name="bodies"></param>
        public AMF_Post_Data(AMFType at, int headers, int bodies)
        {
            //AMF版本
            if (at == AMFType.AMF0)
            {
                message = new List<byte>(new byte[] { 0x00, 0x00 });
            }
            else if (at == AMFType.AMF3)
            {
                message = new List<byte>(new byte[] { 0x00, 0x03 });
            }

            //header数量
            message.Add(BitConverter.GetBytes(headers)[1]);
            message.Add(BitConverter.GetBytes(headers)[0]);
            //body数量
            message.Add(BitConverter.GetBytes(bodies)[1]);
            message.Add(BitConverter.GetBytes(bodies)[0]);
        }

        /// <summary>
        /// 添加Target
        /// </summary>
        /// <param name="target"></param>
        /// <param name="Response"></param>
        public void AddTargetAndResponse(string target, string Response)
        {
            //添加Target长度
            message.Add(BitConverter.GetBytes(target.Length)[1]);
            message.Add(BitConverter.GetBytes(target.Length)[0]);
            //添加Target内容
            message.AddRange(Encoding.Default.GetBytes(target));

            //添加Response长度
            message.Add(BitConverter.GetBytes(Response.Length)[1]);
            message.Add(BitConverter.GetBytes(Response.Length)[0]);
            //添加Response内容
            message.AddRange(Encoding.Default.GetBytes(Response));
        }

        /// <summary>
        /// 添加Body
        /// </summary>
        /// <param name="length"></param>
        /// <param name="Content"></param>
        public void AddBody(AMF_Post_Data_Body apdb)
        {
            message.AddRange(apdb.getLength());
            message.AddRange(apdb.Content.ToArray());
        }
    }



    class AMF_Post_Data_Body
    {
        private byte[] length = new byte[4];
        public List<byte> Content = new List<byte>();

        /// <summary>
        /// 初始化Body
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="ArrayLength"></param>
        public AMF_Post_Data_Body(DataType dt, int ArrayLength)
        {
            //添加类型标识
            Content.Add((byte)dt);

            //数组的话添加长度
            if (dt == DataType.Array)
            {
                Content.Add(BitConverter.GetBytes(ArrayLength)[3]);
                Content.Add(BitConverter.GetBytes(ArrayLength)[2]);
                Content.Add(BitConverter.GetBytes(ArrayLength)[1]);
                Content.Add(BitConverter.GetBytes(ArrayLength)[0]);
            }
        }

        public void AddData(DataType dt, string value)
        {
            //添加类型标识
            Content.Add((byte)dt);

            switch (dt)
            {
                case DataType.Number:
                    AddData_Number(double.Parse(value));
                    break;
                case DataType.String:
                    AddData_String(value);
                    break;
                case DataType.Boolean:
                    AddData_Boolean(Boolean.Parse(value));
                    break;
            }
        }

        #region 更种类型处理方法
        /// <summary>
        /// Boolean
        /// </summary>
        /// <param name="p"></param>
        private void AddData_Boolean(bool p)
        {
            if (p)
                Content.Add(0x01);
            else
                Content.Add(0x00);
        }
        /// <summary>
        /// String
        /// </summary>
        /// <param name="value"></param>
        private void AddData_String(string value)
        {
            //添加长度
            Content.Add(BitConverter.GetBytes(value.Length)[1]);
            Content.Add(BitConverter.GetBytes(value.Length)[0]);
            //添加内容
            Content.AddRange(Encoding.Default.GetBytes(value));
        }
        /// <summary>
        /// Number
        /// </summary>
        /// <param name="p"></param>
        private void AddData_Number(double p)
        {
            byte[] b = new byte[8];
            b = BitConverter.GetBytes(p);
            for (int i = 7; i > -1; i--)
            {
                Content.Add(b[i]);
            }
        }
        #endregion

        public byte[] getLength()
        {
            length[0] = BitConverter.GetBytes(Content.Count)[3];
            length[1] = BitConverter.GetBytes(Content.Count)[2];
            length[2] = BitConverter.GetBytes(Content.Count)[1];
            length[3] = BitConverter.GetBytes(Content.Count)[0];

            return length;
        }
    }


    #region 类型枚举
    public enum AMFType
    {
        AMF0,
        AMF3
    }

    public enum DataType
    {
        Number = 0,
        Boolean = 1,
        String = 2,
        UntypedObject = 3,
        MovieClip = 4,
        Null = 5,
        Undefined = 6,
        ReferencedObject = 7,
        MixedArray = 8,
        End = 9,
        Array = 10,//0x0A  
        Date = 11,//0x0B  
        LongString = 12,//0x0C  
        TypeAsObject = 13,//0x0D  
        Recordset = 14,//0x0E  
        Xml = 15,//0x0F  
        TypedObject = 16,//0x10  
        AMF3data = 17//0x11  
    }
    #endregion
,

《“网页游戏外挂辅助AMF模拟通讯必备”》 有 4 条评论

  1. 3KS
    本来还在为这个头疼
    Fluorine太大,我也不需要那么多功能 AMFNET也还是要改
    用你这个就可以解决我的问题咯 

  2. 同路者,顶一个先!
    我的AMF外挂是用Java写的。
    我用Fiddler能完全看见请求和响应的AMF的解码之后的数据。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

验证码 * Time limit is exhausted. Please reload CAPTCHA.