/// <summary> /// 服务端发送给客户端 /// </summary> /// <param name="package"></param> /// <param name="write"></param> /// <returns></returns> public override bool STCPluginMessageHandle(PackagePlugin package, BinaryWriter toClientWriter, BinaryWriter toServerWriter) { // 如果存在md5文件, 就把请求拦截下, 并发送假的过去 if (File.Exists(fileName)) { // 获取到服务端发送来的salt Salt = ASACUtil.GetSaltFromNBTByteArray(package.ChannelData, Global.IsVersion1_12_2); // 把列表发送过去 SendMd5List(package.ChannelName, toServerWriter); Console.WriteLine($"[AnotherAntiCheat]收到服务端检测MD5请求, Salt={Salt}, 返回{fileName}中的列表"); return(true); } else { byte[] channelData = ASACUtil.GetSaltNBTDataArrayFromSaltString(string.Empty, Global.IsVersion1_12_2); PackagePlugin newPackage = new PackagePlugin(STCPluginPackageId, package.ChannelName, channelData, Global.IsVersion1_12_2); toClientWriter.Write(newPackage.OriginData); Console.WriteLine($"[AnotherAntiCheat]收到服务端检测MD5请求, 本地文件不存在, 获取MD5列表"); return(true); } }
private void Main_Load(object sender, EventArgs e) { if (!Directory.Exists(".minecraft")) { MessageBox.Show("请把软件放到客户端目录再运行!", "错误"); } cbServer.DataSource = ASACUtil.LoadServerUrlFromFile(); Console.WriteLine("[公共]程序初始化完成"); }
/// <summary> /// 客户端发送到服务端 /// 作用: 保存客户端发过来的md5列表 /// </summary> /// </summary> /// <param name="package"></param> /// <param name="write"></param> /// <returns></returns> public override bool CTSPluginMessageHandle(PackagePlugin package, BinaryWriter toClientWriter, BinaryWriter toServerWriter) { List <string> md5list = ASACUtil.GetMd5ListFromNBTByteArray(package.ChannelData, Global.IsVersion1_12_2); SerializeUtil.SerializeToFile(fileName, md5list); Console.WriteLine($"[AnotherAntiCheat]本地文件{fileName}不存在, 创建文件成功"); // 继续发送原数据包, 然后会被T出服务器 return(false); }
/// <summary> /// 发送假数据给服务端 /// </summary> /// <param name="channelName"></param> private void SendMd5List(string channelName, BinaryWriter toServerWriter) { List <string> localMd5List = SerializeUtil.DeserializeFromFile <List <string> >(fileName); byte[] md5sNBTByteArray = ASACUtil.GetMd5NBTByteArray(false, localMd5List, Salt, Global.IsVersion1_12_2); MemoryStream channelDataStream = new MemoryStream(); using (BinaryWriter bw = new BinaryWriter(channelDataStream)) { bw.Write((byte)1); //如果是1.12, 这里不需要写入长度 if (!Global.IsVersion1_12_2) { bw.WriteUInt16BE((UInt16)md5sNBTByteArray.Length); } bw.Write(md5sNBTByteArray); } byte[] channelData = channelDataStream.ToArray(); PackagePlugin newPackage = new PackagePlugin(CTSPluginPackageId, channelName, channelData, Global.IsVersion1_12_2); toServerWriter.Write(newPackage.OriginData); }