这两天写一个游戏的外挂,使用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 条评论
3KS
本来还在为这个头疼
Fluorine太大,我也不需要那么多功能 AMFNET也还是要改
用你这个就可以解决我的问题咯
同路者,顶一个先!
我的AMF外挂是用Java写的。
我用Fiddler能完全看见请求和响应的AMF的解码之后的数据。
您好楼主,您能够给一份源码吗?非常感谢!我的邮箱地址:[email protected].谢谢
不好意思啊~
这个实在是不可以啊~
自己研究研究不难~