Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
 public HostUpdateClothesEventArgs(Func <Task> continuation, int step, HMessage packet)
     : base(continuation, step, packet)
 {
     Gender   = SKore.ToGender(packet.ReadString());
     FigureId = packet.ReadString();
 }
Пример #4
0
 public HSession(string Email, string Password, HHotels Hotel)
     : this(SKore.GetIPCookie(), Hotel)
 {
     this.Email    = Email;
     this.Password = Password;
 }
Пример #5
0
        /// <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);
        }
Пример #6
0
        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;
                    }
                }
            }
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
 public void Dispose()
 {
     Stop();
     SKore.Unsubscribe(ref ScheduleTriggered);
     _ticker.Dispose();
 }
Пример #9
0
        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);
            }
        }
Пример #10
0
        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));
        }
Пример #11
0
        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));
        }
Пример #12
0
        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);
        }
Пример #13
0
 private void Main_FormClosed(object sender, FormClosedEventArgs e)
 {
     SKore.ClearCache();
 }