public void WriteModuleHeader(Client client, AuthPacket packet, Module module, int size = 0) { packet.WriteFourCC(module.Type); packet.WriteFourCC("\0\0" + Enum.GetName(typeof(Region), client.Session.Account.Region)); packet.Write(module.Hash.ToByteArray()); packet.Write(size == 0 ? module.Size : (uint)size, 10); }
public void Write(AuthPacket packet) { packet.WriteFourCC(Data.Type); packet.WriteFourCC("\0\0" + Enum.GetName(typeof(Region), AccountRegion)); packet.Write(Data.Hash.ToByteArray()); packet.Write(Size == 0 ? Data.Size : Size, 10); WriteData(packet); }
public static void SendProofValidation(Client client, byte[] clientChallenge) { var passwordModule = client.Modules.SingleOrDefault(m => m.Name == "Password"); var selectedGameAccountModule = client.Modules.SingleOrDefault(m => m.Name == "SelectGameAccount"); var proofValidation = new AuthPacket(AuthServerMessage.ProofRequest); var moduleCount = 2; proofValidation.Write(moduleCount, 3); /// Password module Manager.ModuleMgr.WriteModuleHeader(client, proofValidation, passwordModule, 161); // State proofValidation.Flush(); proofValidation.Write(PasswordModuleState.ValidateProof, 8); // Data proofValidation.Write(client.Session.SecureRemotePassword.ServerM); proofValidation.Write(client.Session.SecureRemotePassword.S2); /// SelectGameAccount module if (client.Session.GameAccounts.Count > 1) { var gameAccountBuffer = new AuthPacket(); gameAccountBuffer.Write(0, 8); gameAccountBuffer.Write(client.Session.GameAccounts.Count, 8); client.Session.GameAccounts.ForEach(ga => { gameAccountBuffer.Write(ga.Region, 8); gameAccountBuffer.WriteString(ga.Game + ga.Index, 8, false); }); gameAccountBuffer.Finish(); Manager.ModuleMgr.WriteModuleHeader(client, proofValidation, selectedGameAccountModule, gameAccountBuffer.Data.Length); // Data proofValidation.Write(gameAccountBuffer.Data); } else { Manager.ModuleMgr.WriteRiskFingerprint(client, proofValidation); } client.SendPacket(proofValidation); }
public static void OnListSubscribeRequest(AuthPacket packet, Client client) { Log.Message(LogType.Debug, "Received ListSubscribeRequest."); // Battlenet::Client::WoWRealm::ListSubscribeResponse var listSubscribeResponse = new AuthPacket(AuthServerMessage.ListSubscribeResponse, AuthChannel.WoWRealm); listSubscribeResponse.Write(0, 1); listSubscribeResponse.Write(0, 7); var realmCounter = 0; // Battlenet::Client::WoWRealm::ListUpdate foreach (var realm in Manager.RealmMgr.RealmList) { var listUpdate = new AuthPacket(AuthServerMessage.ListUpdate, AuthChannel.WoWRealm); listUpdate.Write(true, 1); listUpdate.Write(realm.Value.Category, 32); // RealmCategory listUpdate.Write(0, 32); // RealmPopulation, float written as uint32 listUpdate.Write(realm.Value.State, 8); // RealmState listUpdate.Write(realm.Value.Id, 19); // RealmId listUpdate.Write(0x80000000 + realm.Value.Type, 32); // RealmType listUpdate.WriteString(realm.Value.Name, 10, false); // RealmName listUpdate.Write(false, 1); // Battlenet::VersionString, not used for now listUpdate.Write(realm.Value.Flags, 8); // RealmInfoFlags listUpdate.Write(0, 8); listUpdate.Write(0, 12); listUpdate.Write(0, 8); listUpdate.Write(++realmCounter, 32); listUpdate.Finish(); // Write ListUpdate data to ListSubscribeResponse listSubscribeResponse.Write(listUpdate.Data); } // Battlenet::Client::WoWRealm::ListComplete var listComplete = new AuthPacket(AuthServerMessage.ListComplete, AuthChannel.WoWRealm); listComplete.Finish(); // Write ListComplete data to ListSubscribeResponse end listSubscribeResponse.Write(listComplete.Data); client.SendPacket(listSubscribeResponse); }
void PreBuildPatchPackets() { var games = Directory.GetDirectories(AuthConfig.PatchFileDirectory); foreach (var dir in games) { var files = Directory.GetFiles(dir); foreach (var f in files) { var pkt = new AuthPacket(); var key = $"/{new DirectoryInfo(dir).Name}/{Path.GetFileNameWithoutExtension(f)}"; var value = File.ReadAllBytes(f); pkt.Write(value); patchPackets.Add(key, pkt); Log.Normal($"Loaded patch file for '{key}'."); } } Log.Message(); IsInitialized = true; }
public static void OnListSubscribeRequest(AuthPacket packet, Client client) { Log.Debug("Received ListSubscribeRequest."); // Battlenet::Client::WoWRealm::ListSubscribeResponse var listSubscribeResponse = new AuthPacket(AuthServerMessage.ListSubscribeResponse, AuthChannel.WoWRealm); listSubscribeResponse.Write(0, 1); listSubscribeResponse.Write(0, 7); var realmCounter = 0; // Battlenet::Client::WoWRealm::ListUpdate foreach (var realm in Manager.RealmMgr.RealmList) { var listUpdate = new AuthPacket(AuthServerMessage.ListUpdate, AuthChannel.WoWRealm); listUpdate.Write(true, 1); listUpdate.Write(realm.Value.Category, 32); // RealmCategory listUpdate.Write(0, 32); // RealmPopulation, float written as uint32 listUpdate.Write(realm.Value.State, 8); // RealmState listUpdate.Write(realm.Value.Id, 19); // RealmId listUpdate.Write(0x80000000 + realm.Value.Type, 32); // RealmType listUpdate.WriteString(realm.Value.Name, 10, false); // RealmName listUpdate.Write(false, 1); // Battlenet::VersionString, not used for now listUpdate.Write(realm.Value.Flags, 8); // RealmInfoFlags listUpdate.Write(0, 8); listUpdate.Write(0, 12); listUpdate.Write(0, 8); listUpdate.Write(++realmCounter, 32); listUpdate.Finish(); // Write ListUpdate data to ListSubscribeResponse listSubscribeResponse.Write(listUpdate.Data); } // Battlenet::Client::WoWRealm::ListComplete var listComplete = new AuthPacket(AuthServerMessage.ListComplete, AuthChannel.WoWRealm); listComplete.Finish(); // Write ListComplete data to ListSubscribeResponse end listSubscribeResponse.Write(listComplete.Data); client.SendPacket(listSubscribeResponse); }
public static void SendAuthComplete(bool failed, AuthResult result, AuthSession session) { var complete = new AuthPacket(AuthServerMessage.Complete); complete.Write(failed, 1); if (failed) { complete.Write(false, 1); // false - disable optional modules complete.Write(1, 2); // 1 - enable AuthResults complete.Write(result, 16); // AuthResults (Error codes) complete.Write(0x80000000, 32); // Unknown } else { complete.Write(0, 3); complete.Write(0x80005000, 32); // Ping request, ~10 secs var hasOptionalData = true; complete.Write(hasOptionalData, 1); if (hasOptionalData) { var hasConnectionInfo = true; complete.Write(hasConnectionInfo, 1); if (hasConnectionInfo) { complete.Write(25000000, 32); complete.Write(1000, 32); } } complete.Write(false, 1); complete.WriteString("", 8, false); // FirstName not implemented complete.WriteString("", 8, false); // LastName not implemented complete.Write(session.Account.Id, 32); complete.Write(0, 8); complete.Write(0, 64); complete.Write(0, 8); complete.WriteString(session.Account.Email, 5, false, -1); complete.Write(0, 64); complete.Write(0, 32); complete.Write(0, 8); } session.Send(complete); }
public static void OnJoinRequest(AuthPacket packet, Client client) { var clientSalt = BitConverter.GetBytes(packet.Read<uint>(32)); var serverSalt = new byte[0].GenerateRandomKey(4); client.Session.GenerateSessionKey(clientSalt, serverSalt); // Continue if sessionKey is not empty if (client.Session.GameAccount.SessionKey != "") { var joinResponse = new AuthPacket(AuthServerMessage.JoinResponse, AuthChannel.WoW); joinResponse.Write(Manager.RealmMgr.RealmList.Count == 0, 1); joinResponse.Write(BitConverter.ToUInt32(serverSalt, 0), 32); joinResponse.Write(Manager.RealmMgr.RealmList.Count, 5); foreach (var realm in Manager.RealmMgr.RealmList) { var ip = IPAddress.Parse(realm.Value.IP).GetAddressBytes(); var port = BitConverter.GetBytes(realm.Value.Port); Array.Reverse(port); joinResponse.Write(ip); joinResponse.Write(port); } joinResponse.Write(0, 5); client.SendPacket(joinResponse); } }
public static void OnJoinRequest(AuthPacket packet, Client client) { var clientSalt = BitConverter.GetBytes(packet.Read <uint>(32)); var serverSalt = new byte[0].GenerateRandomKey(4); client.Session.GenerateSessionKey(clientSalt, serverSalt); // Continue if sessionKey is not empty if (client.Session.GameAccount.SessionKey != "") { var joinResponse = new AuthPacket(AuthServerMessage.JoinResponse, AuthChannel.WoW); joinResponse.Write(Manager.RealmMgr.RealmList.Count == 0, 1); joinResponse.Write(BitConverter.ToUInt32(serverSalt, 0), 32); joinResponse.Write(Manager.RealmMgr.RealmList.Count, 5); foreach (var realm in Manager.RealmMgr.RealmList) { var ip = IPAddress.Parse(realm.Value.IP).GetAddressBytes(); var port = BitConverter.GetBytes(realm.Value.Port); Array.Reverse(port); joinResponse.Write(ip); joinResponse.Write(port); } joinResponse.Write(0, 5); client.SendPacket(joinResponse); } }
public static void OnRealmUpdate(AuthPacket packet, AuthSession session) { Log.Message(LogType.Debug, "Received realm update."); var complete = new AuthPacket(AuthServerMessage.Complete, AuthChannel.WoW); complete.Flush(); complete.Write(0, 8); var realmCounter = 0; foreach (var realm in Manager.Realms.RealmList) { var realmlist = new AuthPacket(AuthServerMessage.RealmUpdate, AuthChannel.WoW); realmlist.Write(true, 1); realmlist.Write(1, 32); realmlist.Write(0f, 32); realmlist.Write(realm.Value.Flags, 8); realmlist.Write(realm.Value.Id, 19); realmlist.Write(0x80000000 + realm.Value.Type, 32); realmlist.WriteString(realm.Value.Name, 10, false); realmlist.Write(false, 1); realmlist.Write(realm.Value.Status, 8); realmlist.Write(0, 12); realmlist.Write(0, 8); realmlist.Write(0, 32); realmlist.Write(++realmCounter, 8); // End realmlist.Flush(); realmlist.Write(new byte[] { 0x43, 0x02 }); realmlist.Finish(); complete.Write(realmlist.Data); } session.Send(complete); }
public static void OnRealmUpdate(AuthPacket packet, Client client) { Log.Message(LogType.Debug, "Received realm update."); var complete = new AuthPacket(AuthServerMessage.RealmComplete, AuthChannel.WoW); complete.Flush(); complete.Write(0, 8); var realmCounter = 0; foreach (var realm in Manager.RealmMgr.RealmList) { var realmlist = new AuthPacket(AuthServerMessage.RealmUpdate, AuthChannel.WoW); realmlist.Write(true, 1); realmlist.Write(1, 32); realmlist.Write(0f, 32); realmlist.Write(realm.Value.Flags, 8); realmlist.Write(realm.Value.Id, 19); realmlist.Write(0x80000000 + realm.Value.Type, 32); realmlist.WriteString(realm.Value.Name, 10, false); realmlist.Write(false, 1); realmlist.Write(realm.Value.Status, 8); realmlist.Write(0, 12); realmlist.Write(0, 8); realmlist.Write(0, 32); realmlist.Write(++realmCounter, 8); // End realmlist.Write(new byte[] { 0x43, 0x02 }); realmlist.Finish(); complete.Write(realmlist.Data); } client.SendPacket(complete); }
public static void SendProofVerification(AuthSession session, byte[] clientChallenge) { var proofVerification = new AuthPacket(AuthServerMessage.ProofRequest); proofVerification.Write(2, 3); session.Modules.ForEach(module => { var moduleStart = module.Hash.Substring(0, 2); switch (moduleStart) { case "2e": case "85": case "20": proofVerification.WriteFourCC("auth"); proofVerification.WriteFourCC("\0\0EU"); proofVerification.Write(module.Hash.ToByteArray()); proofVerification.Write(161, 10); // Flush & write the state id proofVerification.Flush(); proofVerification.Write(3, 8); proofVerification.Write(session.SecureRemotePassword.ServerM); proofVerification.Write(session.SecureRemotePassword.S2); break; case "5e": case "8c": case "1a": proofVerification.WriteFourCC("auth"); proofVerification.WriteFourCC("\0\0EU"); proofVerification.Write(module.Hash.ToByteArray()); proofVerification.Write(module.Size, 10); break; default: Log.Message(LogType.Error, "Module '{0}' not used in this state", moduleStart); break; } }); session.Send(proofVerification); }
public void Write(AuthPacket packet) { packet.WriteString(Account.GivenName, 8, false); packet.WriteString(Account.Surname, 8, false); packet.Write(Account.Id, 32); packet.Write((byte)Account.Region, 8); packet.Write((ulong)Account.Flags, 64); packet.Write((byte)GameAccount.Region, 8); packet.WriteString(GameAccount.AccountId + "#" + GameAccount.Index, 5, false, -1); packet.Write((ulong)GameAccount.Flags, 64); packet.Write(Account.LoginFailures, 32); packet.Write(0, 8); }
public override void WriteData(AuthPacket packet) { packet.Flush(); packet.Write(State, 8); if (State == PasswordModuleState.ServerChallenge) { packet.Write(SecureRemotePassword.I); packet.Write(SecureRemotePassword.S); packet.Write(SecureRemotePassword.B); packet.Write(SecureRemotePassword.S2); } else if (State == PasswordModuleState.ValidateProof) { packet.Write(SecureRemotePassword.ServerM); packet.Write(SecureRemotePassword.S2); } }
public static void SendProofRequest(Client client) { var session = client.Session; client.Modules = Manager.ModuleMgr.Modules.Where(m => m.System == client.OS); var thumbprintModule = client.Modules.SingleOrDefault(m => m.Name == "Thumbprint"); var passwordModule = client.Modules.SingleOrDefault(m => m.Name == "Password"); var proofRequest = new AuthPacket(AuthServerMessage.ProofRequest); // Send two modules (Thumbprint & Password). proofRequest.Write(2, 3); /// Thumbprint module Manager.ModuleMgr.WriteModuleHeader(client, proofRequest, thumbprintModule); // Data proofRequest.Write(thumbprintModule.Data.ToByteArray()); session.SecureRemotePassword = new SRP6a(session.Account.Salt, session.Account.Email, session.Account.PasswordVerifier); session.SecureRemotePassword.CalculateB(); /// Password module Manager.ModuleMgr.WriteModuleHeader(client, proofRequest, passwordModule); // State proofRequest.Flush(); proofRequest.Write(PasswordModuleState.ServerChallenge, 8); // Data proofRequest.Write(session.SecureRemotePassword.I); proofRequest.Write(session.SecureRemotePassword.S); proofRequest.Write(session.SecureRemotePassword.B); proofRequest.Write(session.SecureRemotePassword.S2); client.SendPacket(proofRequest); }
public static async Task SendProofValidation(AuthSession session, byte[] clientChallenge) { var proofRequest = new ProofRequest { AccountRegion = session.Account.Region }; proofRequest.Modules.Add(new PasswordModule { Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "Password" && m.System == session.Platform), State = PasswordModuleState.ValidateProof, AccountRegion = proofRequest.AccountRegion, SecureRemotePassword = session.SecureRemotePassword, Size = 161 }); /// SelectGameAccount module if (session.GameAccounts?.Count > 1) { var gameAccountBuffer = new AuthPacket(); gameAccountBuffer.Write(0, 8); gameAccountBuffer.Write(session.GameAccounts.Count, 8); session.GameAccounts.ForEach(ga => { gameAccountBuffer.Write(ga.Region, 8); gameAccountBuffer.WriteString(ga.Game + ga.Index, 8, false); }); gameAccountBuffer.Finish(); proofRequest.Modules.Add(new SelectGameAccountModule { Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "SelectGameAccount" && m.System == session.Platform), AccountRegion = proofRequest.AccountRegion, GameAccountData = gameAccountBuffer.Data, Size = (uint)gameAccountBuffer.Data.Length }); } else proofRequest.Modules.Add(new RiskFingerprintModule { Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "RiskFingerprint" && m.System == session.Platform) }); await session.Send(proofRequest); }
public static void OnProofResponse(AuthPacket packet, Client client) { var session = client.Session; var moduleCount = packet.Read <byte>(3); for (int i = 0; i < moduleCount; i++) { var dataSize = packet.Read <int>(10); var state = packet.Read <PasswordModuleState>(8); switch (state) { case PasswordModuleState.ClientChallenge: if (session.GameAccount == null && session.GameAccounts.Count >= 1) { if (session.GameAccounts.Count > 1) { var region = packet.Read <Regions>(8); var gameLength = packet.Read <byte>(8); var game = packet.ReadString(gameLength); session.GameAccount = session.GameAccounts.SingleOrDefault(ga => ga.Game + ga.Index == game && ga.Region == region); var riskFingerprint = new AuthPacket(AuthServerMessage.ProofRequest); riskFingerprint.Write(1, 3); Manager.ModuleMgr.WriteRiskFingerprint(client, riskFingerprint); client.SendPacket(riskFingerprint); return; } else { session.GameAccount = session.GameAccounts[0]; } } if (session.GameAccount == null) { SendAuthComplete(true, AuthResult.NoGameAccount, client); } else if (!session.GameAccount.IsOnline) { SendAuthComplete(false, AuthResult.GlobalSuccess, client); client.Session.GameAccount.IsOnline = true; } break; case PasswordModuleState.ClientProof: // Wrong password module data size if (dataSize != 0x121) { return; } var a = packet.Read(0x80); var m1 = packet.Read(0x20); var clientChallenge = packet.Read(0x80); session.SecureRemotePassword.CalculateU(a); session.SecureRemotePassword.CalculateClientM(a); if (session.SecureRemotePassword.ClientM.Compare(m1)) { session.SecureRemotePassword.CalculateServerM(m1); // Assign valid game accounts for the account if (session.Account.GameAccounts != null) { session.GameAccounts = session.Account.GameAccounts.Where(ga => ga.Game == client.Game && ga.Region == session.Account.Region).ToList(); } SendProofValidation(client, clientChallenge); } else { SendAuthComplete(true, AuthResult.BadLoginInformation, client); } break; default: break; } } }
public static void OnProofResponse(AuthPacket packet, Client client) { var session = client.Session; var moduleCount = packet.Read<byte>(3); for (int i = 0; i < moduleCount; i++) { var dataSize = packet.Read<int>(10); var state = packet.Read<PasswordModuleState>(8); switch (state) { case PasswordModuleState.ClientChallenge: if (session.GameAccount == null && session.GameAccounts.Count >= 1) { if (session.GameAccounts.Count > 1) { var region = packet.Read<Regions>(8); var gameLength = packet.Read<byte>(8); var game = packet.ReadString(gameLength); session.GameAccount = session.GameAccounts.SingleOrDefault(ga => ga.Game + ga.Index == game && ga.Region == region); var riskFingerprint = new AuthPacket(AuthServerMessage.ProofRequest); riskFingerprint.Write(1, 3); Manager.ModuleMgr.WriteRiskFingerprint(client, riskFingerprint); client.SendPacket(riskFingerprint); return; } else session.GameAccount = session.GameAccounts[0]; } if (!session.GameAccount.IsOnline) { if (session.GameAccount == null) SendAuthComplete(true, AuthResult.NoGameAccount, client); else SendAuthComplete(false, AuthResult.GlobalSuccess, client); } break; case PasswordModuleState.ClientProof: // Wrong password module data size if (dataSize != 0x121) return; var a = packet.Read(0x80); var m1 = packet.Read(0x20); var clientChallenge = packet.Read(0x80); session.SecureRemotePassword.CalculateU(a); session.SecureRemotePassword.CalculateClientM(a); if (session.SecureRemotePassword.ClientM.Compare(m1)) { session.SecureRemotePassword.CalculateServerM(m1); // Assign valid game accounts for the account if (session.Account.GameAccounts != null) session.GameAccounts = session.Account.GameAccounts.Where(ga => ga.Game == client.Game && ga.Region == session.Account.Region).ToList(); SendProofValidation(client, clientChallenge); } else SendAuthComplete(true, AuthResult.BadLoginInformation, client); break; default: break; } } }
public override void WriteData(AuthPacket packet) { packet.Write(ModuleData); }
public override void WriteData(AuthPacket packet) { packet.Write(GameAccountData); }
public static void SendProofRequest(AuthSession session) { // Default modules are Win64 session.Modules = Manager.Modules.Module64List; // Switch module list for different systems if (session.Account.OS == "Win") { session.Modules = Manager.Modules.ModuleList; } else if (session.Account.OS == "Mc64") { session.Modules = Manager.Modules.ModuleMacList; } var proofRequest = new AuthPacket(AuthServerMessage.ProofRequest); proofRequest.Write(2, 3); session.Modules.ForEach(module => { var moduleStart = module.Hash.Substring(0, 2); switch (moduleStart) { case "36": case "c3": case "b3": proofRequest.WriteFourCC("auth"); proofRequest.WriteFourCC("\0\0EU"); proofRequest.Write(module.Hash.ToByteArray()); proofRequest.Write(module.Size, 10); proofRequest.Write(module.Data.ToByteArray()); break; case "2e": case "85": case "20": session.SecureRemotePassword = new SRP6a(session.Account.Salt, session.Account.Email, session.Account.PasswordVerifier); session.SecureRemotePassword.CalculateB(); proofRequest.WriteFourCC("auth"); proofRequest.WriteFourCC("\0\0EU"); proofRequest.Write(module.Hash.ToByteArray()); proofRequest.Write(module.Size, 10); // Flush & write the state id proofRequest.Flush(); proofRequest.Write(0, 8); proofRequest.Write(session.SecureRemotePassword.I); proofRequest.Write(session.SecureRemotePassword.S); proofRequest.Write(session.SecureRemotePassword.B); proofRequest.Write(session.SecureRemotePassword.S2); break; default: Log.Message(LogType.Error, "Module '{0}' not used in this state", moduleStart); break; } }); session.Send(proofRequest); }
public static void SendAuthComplete(bool failed, AuthResult result, Client client) { client.Session.GameAccount.IsOnline = true; var complete = new AuthPacket(AuthServerMessage.Complete); complete.Write(failed, 1); if (failed) { complete.Write(false, 1); // false - disable optional modules complete.Write(1, 2); // 1 - enable AuthResults complete.Write(result, 16); // AuthResults (Error codes) complete.Write(0x80000000, 32); // Unknown } else { // No modules supported here. complete.Write(0, 3); var pingTimeout = 0x80005000; var hasRegulatorRules = true; complete.Write(pingTimeout, 32); complete.Write(hasRegulatorRules, 1); if (hasRegulatorRules) { var hasRegulatorInfo = true; complete.Write(hasRegulatorInfo, 1); if (hasRegulatorInfo) { var threshold = 25000000; var rate = 1000; complete.Write(threshold, 32); complete.Write(rate, 32); } } var haslogonInfo = true; var account = client.Session.Account; var gameAccount = client.Session.GameAccount; complete.Write(!haslogonInfo, 1); complete.WriteString(account.GivenName, 8, false); complete.WriteString(account.Surname, 8, false); complete.Write(account.Id, 32); complete.Write((byte)account.Region, 8); complete.Write((ulong)account.Flags, 64); complete.Write((byte)gameAccount.Region, 8); complete.WriteString(gameAccount.AccountId + "#" + gameAccount.Index, 5, false, -1); complete.Write((ulong)gameAccount.Flags, 64); complete.Write(account.LoginFailures, 32); complete.Write(0, 8); } client.SendPacket(complete); }
public static void SendProofValidation(Client client, byte[] clientChallenge) { var passwordModule = client.Modules.SingleOrDefault(m => m.Name == "Password"); var selectedGameAccountModule = client.Modules.SingleOrDefault(m => m.Name == "SelectGameAccount"); var proofValidation = new AuthPacket(AuthServerMessage.ProofRequest); var moduleCount = 2; proofValidation.Write(moduleCount, 3); /// Password module Manager.ModuleMgr.WriteModuleHeader(client, proofValidation, passwordModule, 161); // State proofValidation.Flush(); proofValidation.Write(PasswordModuleState.ValidateProof, 8); // Data proofValidation.Write(client.Session.SecureRemotePassword.ServerM); proofValidation.Write(client.Session.SecureRemotePassword.S2); /// SelectGameAccount module if (client.Session.GameAccounts.Count > 1) { var gameAccountBuffer = new AuthPacket(); gameAccountBuffer.Write(0, 8); gameAccountBuffer.Write(client.Session.GameAccounts.Count, 8); client.Session.GameAccounts.ForEach(ga => { gameAccountBuffer.Write(ga.Region, 8); gameAccountBuffer.WriteString(ga.Game + ga.Index, 8, false); }); gameAccountBuffer.Finish(); Manager.ModuleMgr.WriteModuleHeader(client, proofValidation, selectedGameAccountModule, gameAccountBuffer.Data.Length); // Data proofValidation.Write(gameAccountBuffer.Data); } else Manager.ModuleMgr.WriteRiskFingerprint(client, proofValidation); client.SendPacket(proofValidation); }
public static void SendAuthComplete(bool failed, AuthResult result, Client client) { var complete = new AuthPacket(AuthServerMessage.Complete); complete.Write(failed, 1); if (failed) { complete.Write(false, 1); // false - disable optional modules complete.Write(1, 2); // 1 - enable AuthResults complete.Write(result, 16); // AuthResults (Error codes) complete.Write(0x80000000, 32); // Unknown } else { // No modules supported here. complete.Write(0, 3); var pingTimeout = 0x80005000; var hasRegulatorRules = true; complete.Write(pingTimeout, 32); complete.Write(hasRegulatorRules, 1); if (hasRegulatorRules) { var hasRegulatorInfo = true; complete.Write(hasRegulatorInfo, 1); if (hasRegulatorInfo) { var threshold = 25000000; var rate = 1000; complete.Write(threshold, 32); complete.Write(rate, 32); } } var haslogonInfo = true; var account = client.Session.Account; var gameAccount = client.Session.GameAccount; complete.Write(!haslogonInfo, 1); complete.WriteString(account.GivenName, 8, false); complete.WriteString(account.Surname, 8, false); complete.Write(account.Id, 32); complete.Write((byte)account.Region, 8); complete.Write((ulong)account.Flags, 64); complete.Write((byte)gameAccount.Region, 8); complete.WriteString(gameAccount.AccountId + "#" + gameAccount.Index, 5, false, -1); complete.Write((ulong)gameAccount.Flags, 64); complete.Write(account.LoginFailures, 32); complete.Write(0, 8); } client.SendPacket(complete); }
public static void SendProofValidation(AuthSession session, byte[] clientChallenge) { var passwordModule = session.Modules.SingleOrDefault(m => m.Name == "Password"); var riskFingerprintModule = session.Modules.SingleOrDefault(m => m.Name == "RiskFingerprint"); var proofValidation = new AuthPacket(AuthServerMessage.ProofRequest); // Send two modules (Password & RiskFingerprint). proofValidation.Write(2, 3); /// Password module Manager.Module.WriteModuleHeader(session, proofValidation, passwordModule, 161); // State proofValidation.Flush(); proofValidation.Write(PasswordModuleState.ValidateProof, 8); // Data proofValidation.Write(session.SecureRemotePassword.ServerM); proofValidation.Write(session.SecureRemotePassword.S2); /// RiskFingerprint module Manager.Module.WriteModuleHeader(session, proofValidation, riskFingerprintModule); session.Send(proofValidation); }
public void Write(AuthPacket packet) { packet.Write(Threshold, 32); packet.Write(Rate, 32); }