private async Task InterceptGameClientAsync(object sender, ResponseInterceptedEventArgs e) { if (e.ContentType != "application/x-shockwave-flash") { return; } if (!e.Uri.Query.StartsWith("?" + _randomQuery)) { return; } Eavesdropper.ResponseInterceptedAsync -= InterceptGameClientAsync; string clientPath = Path.Combine(Master.DataDirectory.FullName, $@"Modified Clients\{e.Uri.Host}\{e.Uri.LocalPath}");; string clientDirectory = Path.GetDirectoryName(clientPath); Directory.CreateDirectory(clientDirectory); _ui.SetStatusMessage(Constants.DISASSEMBLING_CLIENT); using var game = new HGame(await e.Content.ReadAsStreamAsync().ConfigureAwait(false)) { Location = clientPath }; game.Disassemble(); _ui.SetStatusMessage(Constants.GENERATING_MESSAGE_HASHES); game.GenerateMessageHashes(Path.Combine(Master.ProgramDirectory.FullName, "Hashes.ini")); //We don't need this stuff in HabboGallery foreach (HMessage message in game.Out.Concat(game.In)) { message.Class = null; message.Parser = null; message.Structure = null; message.References.Clear(); } Master.In = game.In; Master.Out = game.Out; _ui.SetStatusMessage(Constants.MODIFYING_CLIENT); game.DisableHostChecks(); game.InjectKeyShouter(4001); game.InjectEndPointShouter(4000); game.InjectEndPoint("127.0.0.1", Connection.ListenPort); CompressionKind compression = CompressionKind.ZLIB; #if DEBUG compression = CompressionKind.None; #endif _ui.SetStatusMessage(Constants.ASSEMBLING_CLIENT); byte[] payload = game.ToArray(compression); e.Headers[HttpResponseHeader.ContentLength] = payload.Length.ToString(); e.Content = new ByteArrayContent(payload); using (FileStream clientStream = File.Open(clientPath, FileMode.Create, FileAccess.Write)) { clientStream.Write(payload); } TerminateProxy(); Task interceptConnectionTask = InterceptConnectionAsync(); }