private void ExtractGameData(object sender, ResponseInterceptedEventArgs e) { if (e.Response.ContentType != "text/html") { return; } if (GameData != null) { return; } string responseBody = Encoding.UTF8.GetString(e.Payload); if (responseBody.Contains("swfobject.embedSWF") && responseBody.Contains("connection.info.host")) { Eavesdropper.ResponseIntercepted -= ExtractGameData; try { GameData = new HGameData(responseBody); Hotel = SKore.ToHotel(GameData.Host); Task <bool> gameClientVerifierTask = VerifyGameClientAsync($"{_modifiedClientsDir.FullName}\\{GameData.MovieName}.swf"); if (e.Response.ResponseUri.Segments.Length > 2) { GameData.UniqueId = e.Response.ResponseUri.Segments[2].TrimEnd('/'); } string embeddedSwf = responseBody.GetChild("embedSWF(", ','); string nonCachedSwf = $"{embeddedSwf} + \"?{DateTime.Now.Ticks}-Tanji\""; responseBody = responseBody.Replace( "embedSWF(" + embeddedSwf, "embedSWF(" + nonCachedSwf); e.Payload = Encoding.UTF8.GetBytes(responseBody); var resourceKeys = ResourceReplacements.Keys.ToArray(); foreach (string resourceKey in resourceKeys) { string realValue = GameData[resourceKey] .Replace("\\/", "/"); string fakeValue = ResourceReplacements[resourceKey]; ResourceReplacements.Remove(resourceKey); ResourceReplacements[realValue] = fakeValue; } if (gameClientVerifierTask.Result) { SetStatus(TanjiState.InjectingClient); Eavesdropper.RequestIntercepted += InjectClient; } else { SetStatus(TanjiState.InterceptingClient); Eavesdropper.ResponseIntercepted += ReplaceClient; } } catch (Exception ex) { WriteLog(ex); } finally { if (GameData == null) { Eavesdropper.ResponseIntercepted += ExtractGameData; } } } }
public bool Login() { Dispose(); Cookies.SetCookies(new Uri(Hotel.ToUrl()), SKore.GetIpCookie()); try { #region Authentication byte[] postData = Encoding.Default.GetBytes(string.Format("credentials.username={0}&credentials.password={1}", Email, Password)); var request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/account/submit", Hotel.ToUrl(true))); request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = SKore.ChromeAgent; request.AllowAutoRedirect = false; request.CookieContainer = Cookies; request.Method = "POST"; request.Proxy = null; using (Stream dataStream = request.GetRequestStream()) dataStream.Write(postData, 0, postData.Length); string body; using (var response = (HttpWebResponse)request.GetResponse()) { Cookies.Add(response.Cookies); using (var streamReader = new StreamReader(response.GetResponseStream())) body = streamReader.ReadToEnd(); } #endregion if (body.Contains("useOrCreateAvatar")) { #region Player Selection PlayerId = int.Parse(body.GetChild("useOrCreateAvatar/", '?')); request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/identity/useOrCreateAvatar/{1}?next=", Hotel.ToUrl(), PlayerId)); request.UserAgent = SKore.ChromeAgent; request.CookieContainer = Cookies; request.AllowAutoRedirect = false; request.Method = "GET"; string redirectingTo; using (var response = (HttpWebResponse)request.GetResponse()) { Cookies.Add(response.Cookies); redirectingTo = response.Headers["Location"]; } #endregion #region Manual Redirect request = (HttpWebRequest)WebRequest.Create(redirectingTo); request.UserAgent = SKore.ChromeAgent; request.CookieContainer = Cookies; request.AllowAutoRedirect = false; request.Method = "GET"; using (var response = (HttpWebResponse)request.GetResponse()) { Cookies.Add(response.Cookies); using (var streamReader = new StreamReader(response.GetResponseStream())) body = streamReader.ReadToEnd(); if (redirectingTo.EndsWith("/me")) { HandleResource(HPage.Me, ref body); return(true); } } #endregion if (body.Contains("/account/updateIdentityProfileTerms")) { #region Accept Terms Of Service postData = Encoding.Default.GetBytes("termsSelection=true"); request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/account/updateIdentityProfileTerms", Hotel.ToUrl(true))); request.ContentType = "application/x-www-form-urlencoded"; request.Headers["Origin"] = Hotel.ToUrl(true); request.UserAgent = SKore.ChromeAgent; request.AllowAutoRedirect = false; request.CookieContainer = Cookies; request.Referer = redirectingTo; request.Method = "POST"; using (Stream dataStream = request.GetRequestStream()) dataStream.Write(postData, 0, postData.Length); using (var response = (HttpWebResponse)request.GetResponse()) Cookies.Add(response.Cookies); #endregion } else if (body.Contains("/account/updateIdentityProfileEmail")) { #region Skip Email Verification postData = Encoding.Default.GetBytes("email=&skipEmailChange=true"); request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/account/updateIdentityProfileEmail", Hotel.ToUrl(true))); request.ContentType = "application/x-www-form-urlencoded"; request.Headers["Origin"] = Hotel.ToUrl(true); request.UserAgent = SKore.ChromeAgent; request.AllowAutoRedirect = false; request.CookieContainer = Cookies; request.Referer = redirectingTo; request.Method = "POST"; using (Stream dataStream = request.GetRequestStream()) dataStream.Write(postData, 0, postData.Length); using (var response = (HttpWebResponse)request.GetResponse()) Cookies.Add(response.Cookies); #endregion } if (body.Contains("/account/updateIdentityProfileTerms") || body.Contains("/account/updateIdentityProfileEmail")) { #region Player Selection request = (HttpWebRequest)WebRequest.Create(string.Format("{0}/identity/useOrCreateAvatar/{1}?disableFriendLinking=false&combineIdentitiesSelection=2&next=&selectedAvatarId=", Hotel.ToUrl(), PlayerId)); request.UserAgent = SKore.ChromeAgent; request.CookieContainer = Cookies; request.AllowAutoRedirect = false; request.Method = "GET"; using (var response = (HttpWebResponse)request.GetResponse()) { Cookies.Add(response.Cookies); redirectingTo = response.Headers["Location"]; } #endregion #region Manual Redirect request = (HttpWebRequest)WebRequest.Create(redirectingTo); request.UserAgent = SKore.ChromeAgent; request.CookieContainer = Cookies; request.AllowAutoRedirect = false; request.Method = "GET"; using (var response = (HttpWebResponse)request.GetResponse()) { Cookies.Add(response.Cookies); using (var streamReader = new StreamReader(response.GetResponseStream())) body = streamReader.ReadToEnd(); if (redirectingTo.EndsWith("/me")) { HandleResource(HPage.Me, ref body); return(true); } } #endregion } } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } return(false); }
public HostUpdateClothesEventArgs(Func <Task> continuation, int step, HMessage packet) : base(continuation, step, packet) { Gender = SKore.ToGender(packet.ReadString()); FigureId = packet.ReadString(); }
public HSession(string Email, string Password, HHotels Hotel) : this(SKore.GetIPCookie(), Hotel) { this.Email = Email; this.Password = Password; }
/// <summary> /// Returns a <see cref="IReadOnlyList{T}"/> of type <see cref="HEntity"/> found in the <see cref="HMessage"/>. /// </summary> /// <param name="packet">The <see cref="HMessage"/> that contains the <see cref="HEntity"/> data to parse.</param> /// <returns></returns> public static IReadOnlyList <HEntity> Parse(HMessage packet) { int entityCount = packet.ReadInteger(); var entityList = new List <HEntity>(entityCount); for (int i = 0; i < entityList.Capacity; i++) { int id = packet.ReadInteger(); string name = packet.ReadString(); string motto = packet.ReadString(); string figureId = packet.ReadString(); int index = packet.ReadInteger(); int x = packet.ReadInteger(); int y = packet.ReadInteger(); double z = double.Parse(packet.ReadString()); packet.ReadInteger(); int type = packet.ReadInteger(); HGender gender = HGender.Unknown; string favoriteGroup = string.Empty; #region Switch Statement: type switch (type) { case 1: { gender = SKore.ToGender(packet.ReadString()); packet.ReadInteger(); packet.ReadInteger(); favoriteGroup = packet.ReadString(); packet.ReadString(); packet.ReadInteger(); packet.ReadBoolean(); break; } case 2: { packet.ReadInteger(); packet.ReadInteger(); packet.ReadString(); packet.ReadInteger(); packet.ReadBoolean(); packet.ReadBoolean(); packet.ReadBoolean(); packet.ReadBoolean(); packet.ReadBoolean(); packet.ReadBoolean(); packet.ReadInteger(); packet.ReadString(); break; } case 4: { packet.ReadString(); packet.ReadInteger(); packet.ReadString(); for (int j = packet.ReadInteger(); j > 0; j--) { packet.ReadShort(); } break; } } #endregion var entity = new HEntity(id, index, name, new HPoint(x, y, z), motto, gender, figureId, favoriteGroup); entityList.Add(entity); } return(entityList); }
private void ExtractGameData(object sender, ResponseInterceptedEventArgs e) { if (e.Response.ContentType != "text/html") { return; } if (State != TanjiState.ExtractingGameData) { return; } string responseBody = Encoding.UTF8.GetString(e.Payload); if (responseBody.Contains("swfobject.embedSWF") && responseBody.Contains("connection.info.host")) { byte[] replacementData = e.Payload; Eavesdropper.ResponseIntercepted -= ExtractGameData; try { UI.GameData.Update(responseBody); UI.Hotel = SKore.ToHotel(UI.GameData.InfoHost); UI.ModulesPg.ModifyGameData(UI.GameData); responseBody = UI.GameData.Source; var clientUri = new Uri(UI.GameData["flash.client.url"]); string clientPath = clientUri.Segments[2].TrimEnd('/'); Task <bool> verifyGameClientTask = null; if (!string.IsNullOrWhiteSpace(CustomClientPath)) { verifyGameClientTask = VerifyGameClientAsync(CustomClientPath); } if (verifyGameClientTask == null || !verifyGameClientTask.Result) { verifyGameClientTask = VerifyGameClientAsync($"{_modifiedClientsDir.FullName}\\{clientPath}\\Habbo.swf"); } string embeddedSwf = responseBody.GetChild("embedSWF(", ','); string nonCachedSwf = $"{embeddedSwf} + \"?{DateTime.Now.Ticks}-Tanji\""; responseBody = responseBody.Replace( "embedSWF(" + embeddedSwf, "embedSWF(" + nonCachedSwf); responseBody = responseBody.Replace(UI.GameData.InfoHost, "127.0.0.1"); replacementData = Encoding.UTF8.GetBytes(responseBody); string[] resourceKeys = ResourceReplacements.Keys.ToArray(); foreach (string resourceKey in resourceKeys) { string realValue = UI.GameData[resourceKey] .Replace("\\/", "/"); string fakeValue = ResourceReplacements[resourceKey]; ResourceReplacements.Remove(resourceKey); ResourceReplacements[realValue] = fakeValue; } if (verifyGameClientTask.Result) { SetState(TanjiState.InjectingClient); Eavesdropper.RequestIntercepted += InjectClient; } else { SetState(TanjiState.InterceptingClient); Eavesdropper.ResponseIntercepted += ReplaceClient; } } catch (Exception ex) { MessageBox.Show("Intercepted game data is not recognized as coming from a valid Habbo Hotel site.", "Tanji ~ Alert!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); WriteLog(ex); } finally { if (State == TanjiState.ExtractingGameData) { Eavesdropper.ResponseIntercepted += ExtractGameData; } else { e.Payload = replacementData; } } } }
private void Eavesdropper_OnEavesResponse(object sender, EavesResponseEventArgs e) { if (UseCustomClient && e.IsSwf && e.ResponeData.Length > 3000000) { if (!_replaceKeys) { e.ResponeData = _flash.ToBytes(); } else { _flash = new ShockwaveFlash(e.ResponeData); ReplaceKeys(_flash); e.ResponeData = _flash.ToBytes(); string clientPath = PatchedClientsDirectory + "\\" + FlashClientRevision + ".swf"; Task.Factory.StartNew(() => _flash.Save(clientPath, true)); } Eavesdropper.Terminate(); return; } else if (TanjiMode == TanjiMode.Manual) { return; } string response = _encoding.GetString(e.ResponeData); if (response.Contains(InfoHost) && response.Contains(InfoPort)) { IsOriginal = SKore.IsOriginal(e.Host); string flashVars = response.GetChild("var flashvars", '}'); while (!flashVars.Contains(InfoHost) || !flashVars.Contains(InfoPort)) { flashVars = flashVars.GetChild("var flashvars = {", '}'); } string extractedHost = flashVars.GetChild(InfoHost, ',').Trim(); string extractedPort = flashVars.GetChild(InfoPort, ',').Trim(); #region Extract 'connection.info.host' if (string.IsNullOrEmpty(_maskHost)) { if (!extractedHost.StartsWith("\"")) { PromptEavesdropperReset(HostExtractFail, Main.TanjiError, MessageBoxIcon.Error); return; } else { _maskHost = extractedHost.Split('"')[1]; } } #endregion #region Extract 'connection.info.port' if (_maskPort == 0) { if (!extractedPort.StartsWith("\"")) { PromptEavesdropperReset(PortExtractFail, Main.TanjiError, MessageBoxIcon.Error); return; } else { _maskPort = ushort.Parse(extractedPort.Split(',')[0].Split('"')[1]); } } #endregion #region Extract 'hotelview.banner.url' if (!IsOriginal && response.Contains(HotelViewBannerUrl)) { Main.Cookies = e.RawCookies; Main.UserAgent = e.UserAgent; Main.BannerUrl = response.GetChild(HotelViewBannerUrl, ','); if (Main.BannerUrl.StartsWith("\"")) { Main.BannerUrl = Main.BannerUrl.Split('"')[1] + "?token="; } if (Main.BannerUrl.StartsWith("//")) { Main.BannerUrl = "http://" + Main.BannerUrl; } } #endregion if (!IsOriginal) { response = response.Replace(string.Format("{0}{1},", InfoHost, extractedHost), InfoHost + "\"127.0.0.1\","); e.ResponeData = _encoding.GetBytes(response); } else if (!UseCustomClient) { FlashClientRevision = ("http://" + response.GetChild(FlashClientUrl, ',').Split('"')[1].Substring(3)).Split('/')[4]; string patchedClientPath = PatchedClientsDirectory + "\\" + FlashClientRevision + ".swf"; if (!File.Exists(patchedClientPath)) { UseCustomClient = _replaceKeys = true; } else { Invoke(new MethodInvoker(() => ProcessSwf(patchedClientPath))); } } if (!UseCustomClient) { Eavesdropper.Terminate(); } SetAnimation("Connecting% | Port: " + _maskPort); Main.Game = new HConnection(_maskHost, _maskPort); Main.Game.Connected += Game_Connected; Main.Game.Connect(IsOriginal); } }
public void Dispose() { Stop(); SKore.Unsubscribe(ref ScheduleTriggered); _ticker.Dispose(); }
private void ExtractHostPort(object sender, EavesdropperResponseEventArgs e) { string responseBody = Encoding.UTF8.GetString(e.Payload); if (MainUI.GameData == null && responseBody.Contains("info.host")) { MainUI.GameData = new HGameData(responseBody); MainUI.ExtensionMngr.GameData = MainUI.GameData; MainUI.ExtensionMngr.Hotel = SKore.ToHotel(MainUI.GameData.Host); MainUI.IsRetro = (MainUI.ExtensionMngr.Hotel == HHotel.Unknown); if (MainUI.IsRetro) { if (!string.IsNullOrWhiteSpace(MainUI.GameData.MovieUrl) && !string.IsNullOrWhiteSpace(MainUI.GameData.BaseUrl)) { IsClientSourceReadable = true; MainUI.GameData.MovieUrl += "?" + DateTime.Now.Ticks; MainUI.GameData["tanji.connection.info.host"] = "127.0.0.1"; MainUI.GameData["tanji.client.starting"] = "Peeling Tangerines..."; } else { if (responseBody.Contains("embedSWF(")) { string child = responseBody.GetChild("embedSWF(", ','); responseBody = responseBody.Replace(child, child + $"+\"?{DateTime.Now.Ticks}\""); } MainUI.GameData["tanji.connection.info.host"] = "127.0.0.1"; responseBody = responseBody.Replace(MainUI.GameData.Host, MainUI.GameData.Host + "\", \"tanji.connection.info.host\":\"127.0.0.1"); } } if (!MainUI.IsRetro && MainUI.Game == null) { TryLoadModdedClientAsync().Wait(); } StatusTxt.SetDotAnimation((MainUI.Game == null ? "Intercepting" : "Injecting") + " Client"); if (!MainUI.IsRetro) { responseBody = responseBody.Replace(".swf?", ".swf") .Replace(".swf", ".swf?DoInject" + DateTime.Now.Ticks); if (MainUI.Game != null) { Eavesdropper.EavesdropperRequest += InjectClient; } } Eavesdropper.EavesdropperResponse -= ExtractHostPort; Eavesdropper.EavesdropperResponse += ReplaceClient; e.Payload = Encoding.UTF8.GetBytes( MainUI.IsRetro && IsClientSourceReadable ? MainUI.GameData.ToString() : responseBody); } }
public static void ChangeMotto(this Extension E, string PlayerName, HHotel Hotel) { string Motto = SKore.GetPlayerMotto(PlayerName, Hotel); E.Contractor.SendToServer(HMessage.Construct(Data.Default.HostChangeMotto, Motto)); }
public static void ChangeClothes(this Extension E, string PlayerName, HHotel Hotel) { string FigureID = SKore.GetPlayerFigureId(PlayerName, Hotel); E.Contractor.SendToServer(HMessage.Construct(Data.Default.HostChangeClothes, HGender.Male.ToString()[0], FigureID)); }
public static IList <IHPlayerData> Extract(HMessage packet) { int playerId, playerIndex, playerType, x, y, position = 0; string playerName, figureId, motto, gender, groupName, z; var playerDataList = new List <IHPlayerData>(packet.ReadInt(ref position)); do { playerId = playerIndex = playerType = x = y = 0; playerName = figureId = motto = gender = groupName = z = string.Empty; playerId = packet.ReadInt(ref position); playerName = packet.ReadString(ref position); motto = packet.ReadString(ref position); figureId = packet.ReadString(ref position); playerIndex = packet.ReadInt(ref position); x = packet.ReadInt(ref position); y = packet.ReadInt(ref position); z = packet.ReadString(ref position); packet.ReadInt(ref position); playerType = packet.ReadInt(ref position); if (playerType != 1) { playerDataList.Capacity--; } switch (playerType) { case 1: { gender = packet.ReadString(ref position); packet.ReadInt(ref position); packet.ReadInt(ref position); groupName = packet.ReadString(ref position); packet.ReadString(ref position); packet.ReadInt(ref position); packet.ReadBool(ref position); playerDataList.Add(new HPlayerData(playerName, playerId, playerIndex, new HPoint(x, y, z), figureId, motto, SKore.ToGender(gender), groupName)); break; } case 2: { packet.ReadInt(ref position); packet.ReadInt(ref position); packet.ReadString(ref position); packet.ReadInt(ref position); packet.ReadBool(ref position); packet.ReadBool(ref position); packet.ReadBool(ref position); packet.ReadBool(ref position); packet.ReadBool(ref position); packet.ReadBool(ref position); packet.ReadInt(ref position); packet.ReadString(ref position); break; } case 4: { packet.ReadString(ref position); packet.ReadInt(ref position); packet.ReadString(ref position); for (int i = packet.ReadInt(ref position); i > 0; i--) { packet.ReadShort(ref position); } break; } } }while (playerDataList.Count < playerDataList.Capacity); return(playerDataList); }
private void Main_FormClosed(object sender, FormClosedEventArgs e) { SKore.ClearCache(); }