├── BraveHaxvius ├── README.md ├── packages.config ├── Data │ ├── Expedition.cs │ ├── News.cs │ ├── Mail.cs │ ├── Ticket.cs │ └── ImportantItem.cs ├── Properties │ └── AssemblyInfo.cs ├── Logger.cs ├── Crypto.cs ├── BraveHaxvius.csproj ├── Facebook.cs └── Networking.cs ├── DataExtractor ├── README.md ├── packages.config ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── DataExtractor.csproj ├── response.json ├── variables.json ├── files.json └── network.json ├── .gitattributes ├── IDAScripts ├── README.md ├── GetResponseKeys.py ├── GetNetworkKeys.py └── GetDataKeys.py ├── PacketDecoder ├── README.md ├── Program.cs ├── packages.config ├── App.xaml.cs ├── Properties │ ├── Settings.settings │ ├── Settings.Designer.cs │ └── AssemblyInfo.cs ├── Packet.cs ├── App.config ├── App.xaml ├── MainWindow.xaml ├── PacketDecoder.csproj └── MainWindow.xaml.cs ├── Testing ├── README.md ├── packages.config ├── App.config ├── Program.cs ├── Properties │ └── AssemblyInfo.cs └── Testing.csproj ├── Client ├── packages.config ├── Properties │ ├── Settings.settings │ ├── AssemblyInfo.cs │ └── Settings.Designer.cs ├── App.config ├── Program.cs ├── Client.csproj ├── MainWindow.resx └── MainWindow.cs ├── LICENSE ├── BraveHaxvius.sln ├── README.md └── .gitignore /BraveHaxvius/README.md: -------------------------------------------------------------------------------- 1 | This project is the core of the game. 2 | -------------------------------------------------------------------------------- /DataExtractor/README.md: -------------------------------------------------------------------------------- 1 | This project is to dump out game data files. 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto -------------------------------------------------------------------------------- /IDAScripts/README.md: -------------------------------------------------------------------------------- 1 | These files are to dump out keys from the app executable. 2 | -------------------------------------------------------------------------------- /PacketDecoder/README.md: -------------------------------------------------------------------------------- 1 | This project uses Fiddler to inspect packets from your iPhone, proxy'd to your PC. 2 | -------------------------------------------------------------------------------- /Testing/README.md: -------------------------------------------------------------------------------- 1 | This is a sample project to use the core dll. To actually login, and communicate with the server. 2 | -------------------------------------------------------------------------------- /Client/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Testing/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /BraveHaxvius/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /DataExtractor/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /BraveHaxvius/Data/Expedition.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace BraveHaxvius.Data 4 | { 5 | public class Expedition 6 | { 7 | public String Id { get; set; } 8 | } 9 | } -------------------------------------------------------------------------------- /Testing/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /BraveHaxvius/Data/News.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace BraveHaxvius.Data 4 | { 5 | public class News 6 | { 7 | public String Id { get; set; } 8 | public String Type { get; set; } 9 | public String Translation { get; set; } 10 | public String Link { get; set; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /PacketDecoder/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.IO.Compression; 4 | using System.Linq; 5 | using System.Reflection; 6 | 7 | namespace PacketDecoder 8 | { 9 | public class Program 10 | { 11 | [STAThread] 12 | public static void Main() 13 | { 14 | App.Main(); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /BraveHaxvius/Data/Mail.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace BraveHaxvius.Data 4 | { 5 | public class Mail 6 | { 7 | public String Id { get; set; } 8 | public String Title { get; set; } 9 | public String Message { get; set; } 10 | public String Type { get; set; } 11 | public String Items { get; set; } 12 | public String Status { get; set; } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /PacketDecoder/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /PacketDecoder/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace PacketDecoder 10 | { 11 | /// 12 | /// Interaction logic for App.xaml 13 | /// 14 | public partial class App : Application 15 | { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /BraveHaxvius/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | [assembly: AssemblyTitle("BraveHaxvius")] 4 | [assembly: AssemblyDescription("")] 5 | [assembly: AssemblyConfiguration("")] 6 | [assembly: AssemblyCompany("Shalzuth")] 7 | [assembly: AssemblyProduct("BraveHaxvius")] 8 | [assembly: AssemblyCopyright("Copyright © 2017 Shalzuth")] 9 | [assembly: AssemblyTrademark("")] 10 | [assembly: AssemblyCulture("")] 11 | [assembly: ComVisible(false)] 12 | [assembly: AssemblyVersion("1.0.0.0")] 13 | [assembly: AssemblyFileVersion("1.0.0.0")] 14 | -------------------------------------------------------------------------------- /PacketDecoder/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /PacketDecoder/Packet.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace PacketDecoder 8 | { 9 | class Packet 10 | { 11 | public Int32 Time { get; set; } 12 | public Int32 Num { get; set; } 13 | public String Direction { get; set; } 14 | public String Url { get; set; } 15 | public String Type { get; set; } 16 | public String EncryptedJson { get; set; } 17 | public String DecryptedJson { get; set; } 18 | public String GameObject { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /BraveHaxvius/Logger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace BraveHaxvius 8 | { 9 | public static class Logger 10 | { 11 | public static StringBuilder LogString = new StringBuilder(); 12 | public delegate void LogHookDelegate(String x); 13 | public static LogHookDelegate LogHook; 14 | public static void Out(string str) 15 | { 16 | Console.WriteLine(str); 17 | LogString.Append(str).Append(Environment.NewLine); 18 | LogHook?.Invoke(str); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Client/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Testing/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using Newtonsoft.Json; 7 | using Newtonsoft.Json.Linq; 8 | using BraveHaxvius; 9 | using BraveHaxvius.Data; 10 | 11 | namespace Testing 12 | { 13 | class Program 14 | { 15 | static void Main(string[] args) 16 | { 17 | var fb = new Facebook(); 18 | fb.Login("email@gmail.com", "password"); 19 | if (fb.TwoFactorAuth) 20 | fb.FinishTwoFactorAuth("1234 5678"); 21 | fb.AllowFFBE(); 22 | var b = new BraveExvius 23 | { 24 | FacebookUserId = fb.Id, 25 | FacebookToken = fb.AccessToken, 26 | }; 27 | b.Login(); 28 | b.DoMission(Mission.AirshipDeck, false, null, null, null, false, false, false, false, false, null, 0); 29 | b.DoMission(Mission.AirshipDeck); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /PacketDecoder/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 shalzuth 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Client/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /PacketDecoder/App.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /BraveHaxvius/Crypto.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Security.Cryptography; 4 | using System.Text; 5 | 6 | namespace BraveHaxvius 7 | { 8 | public class Crypto 9 | { 10 | public static String Decrypt(String data, String key) 11 | { 12 | return Crypt(data, key, false); 13 | } 14 | public static String Encrypt(String data, String key) 15 | { 16 | return Crypt(data, key, true); 17 | } 18 | public static String Crypt(String data, String key, Boolean encrypt) 19 | { 20 | var keyBytes = new Byte[16]; 21 | Array.Copy(Encoding.UTF8.GetBytes(key), keyBytes, key.Length); 22 | var aes = new AesManaged { Mode = CipherMode.ECB, Key = keyBytes, Padding = PaddingMode.PKCS7 }; 23 | Byte[] uncryptedBytes = encrypt ? Encoding.UTF8.GetBytes(data) : Convert.FromBase64String(data); 24 | ICryptoTransform transform = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor(); 25 | using (MemoryStream memoryStream = new MemoryStream()) 26 | { 27 | using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write)) 28 | cryptoStream.Write(uncryptedBytes, 0, uncryptedBytes.Length); 29 | return encrypt ? Convert.ToBase64String(memoryStream.ToArray()) : Encoding.UTF8.GetString(memoryStream.ToArray()); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Testing/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Testing")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Testing")] 13 | [assembly: AssemblyCopyright("Copyright © 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("9fb9b59b-47fe-4bb6-994d-2b3d12aeed48")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Client/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Brave Haxvius")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Brave Haxvius")] 13 | [assembly: AssemblyCopyright("Copyright © 2017 Shalzuth")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("512497b1-e79c-4ded-9b30-a9525f047b9b")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /DataExtractor/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("DataExtractor")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("DataExtractor")] 13 | [assembly: AssemblyCopyright("Copyright © 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("cf7334f3-b59b-4dca-8c80-883c23a653c0")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /IDAScripts/GetResponseKeys.py: -------------------------------------------------------------------------------- 1 | from idautils import * 2 | from idaapi import * 3 | 4 | def get_string(addr): 5 | out = "" 6 | while True: 7 | if Byte(addr) != 0: 8 | out += chr(Byte(addr)) 9 | else: 10 | break 11 | addr += 1 12 | return out 13 | 14 | def get_string_from_head(head): 15 | refs = DataRefsFrom(head) 16 | for ref in refs: 17 | refs2 = DataRefsFrom(ref) 18 | for ref2 in refs2: 19 | stringval = get_string(ref2) 20 | return stringval 21 | requests = {} 22 | 23 | for addr in Functions(0x100000, 0x13ea010): 24 | functionName = GetFunctionName(addr) 25 | if 'GameResponseFactory18createResponseDataEPKc' in functionName: 26 | #if 'getResponseObject' in functionName: 27 | stringval = "" 28 | for (startea, endea) in Chunks(addr): 29 | for head in Heads(startea, endea): 30 | operand = GetDisasm(head) 31 | #if 'mov' in operand and 'ds:(off' in operand: 32 | if 'LDR' in operand and 'R1, [PC,R0]' in operand: 33 | stringval = get_string_from_head(head) 34 | print stringval 35 | if 'Resp' in operand and 'se' in operand and 'C2' in operand: 36 | reqname = operand[11:] 37 | reqname = reqname[:reqname.index('Resp')] 38 | reqname = ''.join([i for i in reqname if not i.isdigit()]) 39 | reqname = reqname[8:] 40 | #reqnamealt = 1 41 | #origreqname = reqname 42 | #while reqname in requests: 43 | # reqname = origreqname + str(reqnamealt) 44 | # reqnamealt = reqnamealt + 1 45 | requests[stringval] = reqname 46 | #print requests 47 | import json 48 | filename = os.path.expanduser("~/OneDrive/Documents/GitHub/BraveHaxvius/DataExtractor/response2.json") 49 | with open(filename, 'w') as fp: 50 | json.dump(requests, fp) -------------------------------------------------------------------------------- /BraveHaxvius/Data/Ticket.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace BraveHaxvius.Data 5 | { 6 | public class Ticket 7 | { 8 | public String Id { get; set; } 9 | public String SubId { get; set; } 10 | public String Other { get; set; } 11 | public String Count { get; set; } 12 | public String Name { get; set; } 13 | 14 | public static readonly Ticket Rare3 = new Ticket { Id = "1", SubId = "10001", Count = "1", Other = "50", Name = "3*" }; 15 | public static readonly Ticket Rare4 = new Ticket { Id = "2", SubId = "10001", Count = "1", Other = "70", Name = "4*" }; 16 | public static readonly Ticket RareUnknown = new Ticket { Id = "3", SubId = "10001", Count = "1", Other = "80", Name = "??" }; 17 | public static readonly Ticket EX3 = new Ticket { Id = "10", SubId = "10010", Count = "1", Other = "160", Name = "3* EX" }; 18 | public static readonly Ticket EX4 = new Ticket { Id = "11", SubId = "10010", Count = "1", Other = "170", Name = "4* EX" }; 19 | public static readonly Ticket EX5 = new Ticket { Id = "12", SubId = "10010", Count = "1", Other = "180", Name = "5* EX" }; 20 | public static readonly Ticket Rare10 = new Ticket { Id = "22", SubId = "10001", Count = "1", Other = "260", Name = "10%" }; 21 | public static readonly Ticket Rare30 = new Ticket { Id = "23", SubId = "10001", Count = "1", Other = "270", Name = "30%" }; 22 | public static readonly Ticket Rare50 = new Ticket { Id = "24", SubId = "10001", Count = "1", Other = "280", Name = "50%" }; 23 | 24 | public static readonly List Tickets = new List 25 | { 26 | Rare3, 27 | Rare4, 28 | RareUnknown, 29 | EX3, 30 | EX4, 31 | EX5, 32 | Rare10, 33 | Rare30, 34 | Rare50 35 | }; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /PacketDecoder/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace PacketDecoder.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("")] 29 | public string Cert { 30 | get { 31 | return ((string)(this["Cert"])); 32 | } 33 | set { 34 | this["Cert"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("")] 41 | public string Key { 42 | get { 43 | return ((string)(this["Key"])); 44 | } 45 | set { 46 | this["Key"] = value; 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /PacketDecoder/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Windows; 6 | 7 | // General Information about an assembly is controlled through the following 8 | // set of attributes. Change these attribute values to modify the information 9 | // associated with an assembly. 10 | [assembly: AssemblyTitle("PacketDecoder")] 11 | [assembly: AssemblyDescription("")] 12 | [assembly: AssemblyConfiguration("")] 13 | [assembly: AssemblyCompany("")] 14 | [assembly: AssemblyProduct("PacketDecoder")] 15 | [assembly: AssemblyCopyright("Copyright © 2017")] 16 | [assembly: AssemblyTrademark("")] 17 | [assembly: AssemblyCulture("")] 18 | 19 | // Setting ComVisible to false makes the types in this assembly not visible 20 | // to COM components. If you need to access a type in this assembly from 21 | // COM, set the ComVisible attribute to true on that type. 22 | [assembly: ComVisible(false)] 23 | 24 | //In order to begin building localizable applications, set 25 | //CultureYouAreCodingWith in your .csproj file 26 | //inside a . For example, if you are using US english 27 | //in your source files, set the to en-US. Then uncomment 28 | //the NeutralResourceLanguage attribute below. Update the "en-US" in 29 | //the line below to match the UICulture setting in the project file. 30 | 31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 32 | 33 | 34 | [assembly: ThemeInfo( 35 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 36 | //(used if a resource is not found in the page, 37 | // or application resource dictionaries) 38 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 39 | //(used if a resource is not found in the page, 40 | // app, or any theme specific resource dictionaries) 41 | )] 42 | 43 | 44 | // Version information for an assembly consists of the following four values: 45 | // 46 | // Major Version 47 | // Minor Version 48 | // Build Number 49 | // Revision 50 | // 51 | // You can specify all the values or you can default the Build and Revision Numbers 52 | // by using the '*' as shown below: 53 | // [assembly: AssemblyVersion("1.0.*")] 54 | [assembly: AssemblyVersion("1.0.0.0")] 55 | [assembly: AssemblyFileVersion("1.0.0.0")] 56 | -------------------------------------------------------------------------------- /PacketDecoder/MainWindow.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Client/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.IO.Compression; 5 | using System.Linq; 6 | using System.Reflection; 7 | using System.Threading.Tasks; 8 | using System.Windows.Forms; 9 | 10 | namespace Client 11 | { 12 | static class Program 13 | { 14 | /// 15 | /// The main entry point for the application. 16 | /// 17 | [STAThread] 18 | static void Main() 19 | { 20 | /*var dlls = Directory.GetFiles(@".\", "*.dll"); 21 | var files = dlls.ToList().Concat(dlls.ToList()); 22 | foreach (var file in files) 23 | { 24 | var bytes = CompressEncrypt(File.ReadAllBytes(file)); 25 | File.WriteAllBytes(@"..\Client\lib\" + file.Replace(".dll","") + ".gz", bytes); 26 | }*/ 27 | AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 28 | { 29 | var bytes = GetEmbeddedBytes("Client.lib." + new AssemblyName(args.Name).Name + ".gz"); 30 | if (bytes != null) 31 | return Assembly.Load(bytes); 32 | return null; 33 | }; 34 | Application.EnableVisualStyles(); 35 | Application.SetCompatibleTextRenderingDefault(false); 36 | Application.Run(new MainWindow()); 37 | } 38 | 39 | public static byte[] GetEmbeddedBytes(String file) 40 | { 41 | using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(file)) 42 | { 43 | if (stream != null) 44 | { 45 | var assemblyData = new Byte[stream.Length]; 46 | stream.Read(assemblyData, 0, assemblyData.Length); 47 | using (var compressedStream = new MemoryStream(assemblyData)) 48 | using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) 49 | using (var resultStream = new MemoryStream()) 50 | { 51 | zipStream.CopyTo(resultStream); 52 | return resultStream.ToArray(); 53 | } 54 | } 55 | } 56 | return null; 57 | } 58 | public static byte[] CompressEncrypt(byte[] raw) 59 | { 60 | byte[] zippedBytes; 61 | using (var memory = new MemoryStream()) 62 | { 63 | using (var gzip = new GZipStream(memory, CompressionMode.Compress, true)) 64 | gzip.Write(raw, 0, raw.Length); 65 | zippedBytes = memory.ToArray(); 66 | return zippedBytes; 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /Testing/Testing.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {9FB9B59B-47FE-4BB6-994D-2B3D12AEED48} 8 | Exe 9 | Testing 10 | Testing 11 | v4.5.2 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | ..\bin\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | ..\bin\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | {bdcf492d-5bad-43f0-9056-a24647cbe948} 58 | BraveHaxvius 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Client/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Client.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("")] 29 | public string fbidInput { 30 | get { 31 | return ((string)(this["fbidInput"])); 32 | } 33 | set { 34 | this["fbidInput"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("")] 41 | public string fbtokenInput { 42 | get { 43 | return ((string)(this["fbtokenInput"])); 44 | } 45 | set { 46 | this["fbtokenInput"] = value; 47 | } 48 | } 49 | 50 | [global::System.Configuration.UserScopedSettingAttribute()] 51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 52 | [global::System.Configuration.DefaultSettingValueAttribute("")] 53 | public string ProxyIP { 54 | get { 55 | return ((string)(this["ProxyIP"])); 56 | } 57 | set { 58 | this["ProxyIP"] = value; 59 | } 60 | } 61 | 62 | [global::System.Configuration.UserScopedSettingAttribute()] 63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 64 | [global::System.Configuration.DefaultSettingValueAttribute("")] 65 | public string ProxyPort { 66 | get { 67 | return ((string)(this["ProxyPort"])); 68 | } 69 | set { 70 | this["ProxyPort"] = value; 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /BraveHaxvius/Data/ImportantItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace BraveHaxvius.Data 5 | { 6 | public class ImportantItem 7 | { 8 | public String Name { get; set; } 9 | public String Description { get; set; } 10 | public String CountId { get; set; } 11 | public String ItemStack { get; set; } 12 | public String ItemIdClone { get; set; } 13 | public String SublimationUnitId { get; set; } 14 | 15 | public static readonly ImportantItem Crest = new ImportantItem { Name = "Crest"}; 16 | public static readonly ImportantItem EXPKey = new ImportantItem { Name = "EXP Key"}; 17 | public static readonly ImportantItem JeweledKey = new ImportantItem { Name = "Jeweled Key"}; 18 | public static readonly ImportantItem RareSummonTicket = new ImportantItem { Name = "Rare Summon Ticket"}; 19 | public static readonly ImportantItem ArenaSummonTicket = new ImportantItem { Name = "Arena Summon Ticket"}; 20 | public static readonly ImportantItem GuaranteedTicket = new ImportantItem { Name = "4★+ Guaranteed Ticket"}; 21 | public static readonly ImportantItem NRGRestore_100 = new ImportantItem { Name = "NRG Restore 10"}; 22 | public static readonly ImportantItem NRGRestore_110 = new ImportantItem { Name = "NRG Restore 30"}; 23 | public static readonly ImportantItem NRGRestore_120 = new ImportantItem { Name = "NRG Restore 50"}; 24 | public static readonly ImportantItem EXSummonTicket = new ImportantItem { Name = "EX Summon Ticket"}; 25 | public static readonly ImportantItem GuaranteedEXTicket_170 = new ImportantItem { Name = "4★+ Guaranteed EX Ticket"}; 26 | public static readonly ImportantItem GuaranteedEXTicket_180 = new ImportantItem { Name = "5★+ Guaranteed EX Ticket"}; 27 | public static readonly ImportantItem SpecialPass = new ImportantItem { Name = "Special Pass"}; 28 | public static readonly ImportantItem ArenaRestore = new ImportantItem { Name = "Arena Restore"}; 29 | public static readonly ImportantItem RaidRestore = new ImportantItem { Name = "Raid Restore"}; 30 | public static readonly ImportantItem ExpansionVoucher = new ImportantItem { Name = "Expansion Voucher"}; 31 | public static readonly ImportantItem AncientCoin = new ImportantItem { Name = "Ancient Coin"}; 32 | public static readonly ImportantItem AdvanceToken = new ImportantItem { Name = "Advance Token"}; 33 | 34 | public static readonly List ImportantItems = new List 35 | { 36 | Crest, 37 | EXPKey, 38 | JeweledKey, 39 | RareSummonTicket, 40 | ArenaSummonTicket, 41 | GuaranteedTicket, 42 | NRGRestore_100, 43 | NRGRestore_110, 44 | NRGRestore_120, 45 | EXSummonTicket, 46 | GuaranteedEXTicket_170, 47 | GuaranteedEXTicket_180, 48 | SpecialPass, 49 | ArenaRestore, 50 | RaidRestore, 51 | ExpansionVoucher, 52 | AncientCoin, 53 | AdvanceToken, 54 | }; 55 | } 56 | } -------------------------------------------------------------------------------- /IDAScripts/GetNetworkKeys.py: -------------------------------------------------------------------------------- 1 | from idautils import * 2 | from idaapi import * 3 | 4 | def get_string(addr): 5 | out = "" 6 | while True: 7 | if Byte(addr) != 0: 8 | out += chr(Byte(addr)) 9 | else: 10 | break 11 | addr += 1 12 | return out 13 | 14 | def get_string_from_head(head): 15 | refs = DataRefsFrom(head) 16 | for ref in refs: 17 | refs2 = DataRefsFrom(ref) 18 | for ref2 in refs2: 19 | stringval = get_string(ref2) 20 | return stringval 21 | 22 | def dumpkvp(functionName, addr, key): 23 | if key in functionName and 'Request' in functionName: 24 | functionName = functionName[3:] 25 | functionName = functionName[:functionName.index(key)] 26 | functionName = ''.join([i for i in functionName if not i.isdigit()]) 27 | functionName = functionName[:len(functionName)-7] 28 | for (startea, endea) in Chunks(addr): 29 | for head in Heads(startea, endea): 30 | operand = GetDisasm(head) 31 | if 'R0, [PC,R0]' in operand: 32 | #if ', =(' in operand: 33 | stringval = get_string_from_head(head) 34 | if key is 'getUrl': 35 | stringval = stringval[14:22] 36 | if 'action' in stringval: 37 | stringval = 'action' 38 | if not (functionName in requests): 39 | requests[functionName] = {} 40 | requests[functionName][key[3:]] = stringval 41 | if 'aActionsymbol' in operand: 42 | stringval = get_string_from_head(head) 43 | if key is 'getUrl': 44 | stringval = stringval[14:22] 45 | if 'action' in stringval: 46 | stringval = 'action' 47 | if not (functionName in requests): 48 | requests[functionName] = {} 49 | requests[functionName][key[3:]] = stringval 50 | 51 | 52 | def dumpbody(functionName, addr, key): 53 | if key in functionName and 'Request' in functionName: 54 | functionName = functionName[3:] 55 | functionName = functionName[:functionName.index(key)] 56 | functionName = ''.join([i for i in functionName if not i.isdigit()]) 57 | functionName = functionName[:len(functionName)-7] 58 | stringval = "" 59 | basenode = "" 60 | for (startea, endea) in Chunks(addr): 61 | for head in Heads(startea, endea): 62 | operand = GetDisasm(head) 63 | if 'mov' in operand and 'ds:(off' in operand: 64 | stringval = get_string_from_head(head) 65 | if '_ZN9JsonGroup7addNodeEv' in operand: 66 | if not (functionName in requests): 67 | requests[functionName] = {} 68 | if not ("Parameters" in requests[functionName]): 69 | requests[functionName]["Parameters"] = {} 70 | basenode = stringval 71 | requests[functionName]["Parameters"][basenode] = {} 72 | if '_ZN8JsonNode8addParamEPK' in operand: 73 | requests[functionName]["Parameters"][basenode] = stringval 74 | 75 | 76 | requests = {} 77 | 78 | for funcea in Functions(0x100000, 0x14ea010): 79 | functionName = GetFunctionName(funcea) 80 | dumpkvp(functionName, funcea, 'getUrl') 81 | dumpkvp(functionName, funcea, 'getRequestID') 82 | dumpkvp(functionName, funcea, 'getEncodeKey') 83 | #dumpbody(functionName, funcea, 'createBody') 84 | print requests 85 | import json 86 | filename = os.path.expanduser("~/OneDrive/Documents/GitHub/BraveHaxvius/DataExtractor/network2.json") 87 | with open(filename, 'w') as fp: 88 | json.dump(requests, fp) -------------------------------------------------------------------------------- /BraveHaxvius.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26730.12 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BraveHaxvius", "BraveHaxvius\BraveHaxvius.csproj", "{BDCF492D-5BAD-43F0-9056-A24647CBE948}" 7 | EndProject 8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IDAScripts", "IDAScripts", "{8F77CCB5-DF0D-485C-B2E5-88E726F9F094}" 9 | ProjectSection(SolutionItems) = preProject 10 | IDAScripts\GetDataKeys.py = IDAScripts\GetDataKeys.py 11 | IDAScripts\GetNetworkKeys.py = IDAScripts\GetNetworkKeys.py 12 | IDAScripts\GetResponseKeys.py = IDAScripts\GetResponseKeys.py 13 | EndProjectSection 14 | EndProject 15 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataExtractor", "DataExtractor\DataExtractor.csproj", "{CF7334F3-B59B-4DCA-8C80-883C23A653C0}" 16 | EndProject 17 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PacketDecoder", "PacketDecoder\PacketDecoder.csproj", "{9B176963-698E-451F-821D-908620E17702}" 18 | EndProject 19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Testing", "Testing\Testing.csproj", "{9FB9B59B-47FE-4BB6-994D-2B3D12AEED48}" 20 | EndProject 21 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Client\Client.csproj", "{512497B1-E79C-4DED-9B30-A9525F047B9B}" 22 | EndProject 23 | Global 24 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 25 | Debug|Any CPU = Debug|Any CPU 26 | Release|Any CPU = Release|Any CPU 27 | EndGlobalSection 28 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 29 | {BDCF492D-5BAD-43F0-9056-A24647CBE948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 30 | {BDCF492D-5BAD-43F0-9056-A24647CBE948}.Debug|Any CPU.Build.0 = Debug|Any CPU 31 | {BDCF492D-5BAD-43F0-9056-A24647CBE948}.Release|Any CPU.ActiveCfg = Release|Any CPU 32 | {BDCF492D-5BAD-43F0-9056-A24647CBE948}.Release|Any CPU.Build.0 = Release|Any CPU 33 | {CF7334F3-B59B-4DCA-8C80-883C23A653C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 34 | {CF7334F3-B59B-4DCA-8C80-883C23A653C0}.Debug|Any CPU.Build.0 = Debug|Any CPU 35 | {CF7334F3-B59B-4DCA-8C80-883C23A653C0}.Release|Any CPU.ActiveCfg = Release|Any CPU 36 | {CF7334F3-B59B-4DCA-8C80-883C23A653C0}.Release|Any CPU.Build.0 = Release|Any CPU 37 | {9B176963-698E-451F-821D-908620E17702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 38 | {9B176963-698E-451F-821D-908620E17702}.Debug|Any CPU.Build.0 = Debug|Any CPU 39 | {9B176963-698E-451F-821D-908620E17702}.Release|Any CPU.ActiveCfg = Release|Any CPU 40 | {9B176963-698E-451F-821D-908620E17702}.Release|Any CPU.Build.0 = Release|Any CPU 41 | {9FB9B59B-47FE-4BB6-994D-2B3D12AEED48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 42 | {9FB9B59B-47FE-4BB6-994D-2B3D12AEED48}.Debug|Any CPU.Build.0 = Debug|Any CPU 43 | {9FB9B59B-47FE-4BB6-994D-2B3D12AEED48}.Release|Any CPU.ActiveCfg = Release|Any CPU 44 | {9FB9B59B-47FE-4BB6-994D-2B3D12AEED48}.Release|Any CPU.Build.0 = Release|Any CPU 45 | {512497B1-E79C-4DED-9B30-A9525F047B9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 46 | {512497B1-E79C-4DED-9B30-A9525F047B9B}.Debug|Any CPU.Build.0 = Debug|Any CPU 47 | {512497B1-E79C-4DED-9B30-A9525F047B9B}.Release|Any CPU.ActiveCfg = Release|Any CPU 48 | {512497B1-E79C-4DED-9B30-A9525F047B9B}.Release|Any CPU.Build.0 = Release|Any CPU 49 | EndGlobalSection 50 | GlobalSection(SolutionProperties) = preSolution 51 | HideSolutionNode = FALSE 52 | EndGlobalSection 53 | GlobalSection(ExtensibilityGlobals) = postSolution 54 | SolutionGuid = {64360A0E-085E-440A-A028-8BC1892332BF} 55 | EndGlobalSection 56 | EndGlobal 57 | -------------------------------------------------------------------------------- /DataExtractor/DataExtractor.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {CF7334F3-B59B-4DCA-8C80-883C23A653C0} 8 | Exe 9 | DataExtractor 10 | DataExtractor 11 | v4.5.2 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | ..\bin\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | ..\bin\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | True 52 | True 53 | Resources.resx 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | {bdcf492d-5bad-43f0-9056-a24647cbe948} 66 | BraveHaxvius 67 | 68 | 69 | 70 | 71 | ResXFileCodeGenerator 72 | Resources.Designer.cs 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BraveHaxvius 2 | 3 | Brave Haxvius is an educational repository for teaching the network internals of an example mobile app. 4 | 5 | # High Level Overview 6 | 7 | To learn how the app functions, you need to understand the client-server communication. For every action, the client sends a single data object to the server, and the server replies with a single data object. In this example, the server will not talk to the client randomly - it only replies when the client talks to it. The app on your phone is the client, and the server is sitting somewhere hosted by the game company. 8 | 9 | # Network sniffing 10 | 11 | The first step to reverse engineering any network protocol is to sniff packets. This can be done with a myriad of tools, such as Wireshark, Fiddler, mitm, etc. Wireshark is generally the best at capturing all data, and supports plugins you can write to help streamline the decode process. In this case, the mobile app we are looking at is doing primarily HTTPS - I prefer Fiddler for HTTP sniffing. There are plenty of guides on how to use these tools online. 12 | 13 | One note - to deter these tools, many app developers are using HTTPS certificate pinning, effectively to prevent your Fiddler certificate from being able to decode the packets correctly. That's a guide for another time - as this example app doesn't use it on iPhone. 14 | 15 | # Encryption and Compression 16 | 17 | So, assuming you've fired up Fiddler and found a sample data packet that this app uses, you'll notice you cannot understand the data. As a means to thwart reverse engineering, developers encrypt+compress packets over the wire. Decoding this is generally the most technically challenging part of this series. I'm going to cheat and provide you the methods upfront though. 18 | The packet strings often end in an "=", that's generally a surefire identification method for BASE64 encoding. Decoding that is trivial. 19 | Now, you have a bunch of random bytes - this app uses AES ECB encryption with PKCS7 padding. It requires a key, which can be found in the app binary file. TBD on how to dump these. Python IDA scripts are helpful for scaling, and app updates. Knowing the encryption method, and the key, makes decryption trivial. After decrypting these bytes, you should get a JSON string. 20 | 21 | # Injection 22 | 23 | Injection is extremely simple. Once you have figured out how to watch and decode packets, you can see all the data makes up a MissionStart and a MissionEnd request. During MissionEnd, injection is possible. One might quickly assume, "oh, add an item as a regular drop!" This method doesn't work as the server validates dropped loot. After further investigation, you can find all the other options to acquire items after battle - such as stealing an item, finding items in those shiny areas during explorations, or even finding items in chests. All of these are validated though. So where else can you get items? Items trusted! You know those extra low-tier items you get after battle occasional? If you tell the server you get something from trust mastery, the server blindly accepts them! 24 | 25 | # Lots more to come. 26 | 27 | # Feel like buying me a cup of coffee? 28 | 29 | [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RZCNSSMSHTCE6) 30 | 31 | # Legal stuff 32 | 33 | MIT License 34 | 35 | *BraveHaxvius and Shalzuth aren't endorsed by SQUARE ENIX CO., LTD. or gumi Inc. and doesn’t reflect the views or opinions of SQUARE ENIX CO., LTD. or gumi Inc. or anyone officially involved in producing or managing SQUARE ENIX CO., LTD. or gumi Inc. Game content and materials are trademarks and copyrights of SQUARE ENIX CO., LTD. or gumi Inc.* 36 | 37 | -------------------------------------------------------------------------------- /Client/Client.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {512497B1-E79C-4DED-9B30-A9525F047B9B} 8 | WinExe 9 | Client 10 | Brave Haxvius 11 | v4.6.1 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | ..\bin\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | ..\bin\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 37 | False 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | Form 55 | 56 | 57 | MainWindow.cs 58 | 59 | 60 | 61 | 62 | True 63 | True 64 | Settings.settings 65 | 66 | 67 | MainWindow.cs 68 | 69 | 70 | 71 | SettingsSingleFileGenerator 72 | Settings.Designer.cs 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | {bdcf492d-5bad-43f0-9056-a24647cbe948} 81 | BraveHaxvius 82 | False 83 | True 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /BraveHaxvius/BraveHaxvius.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {BDCF492D-5BAD-43F0-9056-A24647CBE948} 8 | Library 9 | BraveHaxvius 10 | BraveHaxvius 11 | v4.5 12 | 512 13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 14 | 4 15 | true 16 | 17 | 18 | 19 | AnyCPU 20 | true 21 | full 22 | false 23 | ..\bin\ 24 | DEBUG;TRACE 25 | prompt 26 | 4 27 | 28 | 29 | AnyCPU 30 | pdbonly 31 | true 32 | ..\bin\ 33 | TRACE 34 | prompt 35 | 4 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 44 | False 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Code 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /DataExtractor/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace DataExtractor.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DataExtractor.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Byte[]. 65 | /// 66 | internal static byte[] files { 67 | get { 68 | object obj = ResourceManager.GetObject("files", resourceCulture); 69 | return ((byte[])(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Byte[]. 75 | /// 76 | internal static byte[] network { 77 | get { 78 | object obj = ResourceManager.GetObject("network", resourceCulture); 79 | return ((byte[])(obj)); 80 | } 81 | } 82 | 83 | /// 84 | /// Looks up a localized resource of type System.Byte[]. 85 | /// 86 | internal static byte[] response { 87 | get { 88 | object obj = ResourceManager.GetObject("response", resourceCulture); 89 | return ((byte[])(obj)); 90 | } 91 | } 92 | 93 | /// 94 | /// Looks up a localized resource of type System.Byte[]. 95 | /// 96 | internal static byte[] variables { 97 | get { 98 | object obj = ResourceManager.GetObject("variables", resourceCulture); 99 | return ((byte[])(obj)); 100 | } 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /IDAScripts/GetDataKeys.py: -------------------------------------------------------------------------------- 1 | from idautils import * 2 | from idaapi import * 3 | 4 | def get_string(addr): 5 | out = "" 6 | while True: 7 | if Byte(addr) != 0: 8 | out += chr(Byte(addr)) 9 | else: 10 | break 11 | addr += 1 12 | return out 13 | 14 | def get_string_from_head(head): 15 | refs = DataRefsFrom(head) 16 | for ref in refs: 17 | refs2 = DataRefsFrom(ref) 18 | for ref2 in refs2: 19 | stringval = get_string(ref2) 20 | return stringval 21 | 22 | def get_string_from_babyhead(head): 23 | refs = DataRefsFrom(head) 24 | for ref in refs: 25 | stringval = get_string(ref) 26 | return stringval 27 | map = {} 28 | def dumpkvp(functionName, addr, key): 29 | if 'getMissionPlateFileName' in functionName: 30 | return 31 | if functionName.count('_') == 1 and key in functionName: 32 | for (startea, endea) in Chunks(addr): 33 | for head in Heads(startea, endea): 34 | if 'mov' in GetDisasm(head): 35 | operand = GetDisasm(head) 36 | if operand.count(':') == 0: 37 | continue 38 | functionName = functionName[3:] 39 | if functionName.count('Mst') == 0: 40 | continue 41 | functionName = functionName[:functionName.index('Mst') + 3] 42 | functionName = ''.join([i for i in functionName if not i.isdigit()]) 43 | stringval = get_string_from_head(head) 44 | if not (functionName in map): 45 | if not stringval: 46 | stringval = 'F_BATTLE_SCRIPT_MST' 47 | map[functionName] = stringval 48 | files[map[functionName]] = {} 49 | else: 50 | files[map[functionName]][key[4:]] = stringval 51 | 52 | files = {} 53 | for funcea in Functions(0xb00000, 0x13ea010): 54 | functionName = GetFunctionName(funcea) 55 | dumpkvp(functionName, funcea, 'MstName') 56 | for funcea in Functions(0xb00000, 0x13ea010): 57 | functionName = GetFunctionName(funcea) 58 | dumpkvp(functionName, funcea, 'FileName') 59 | dumpkvp(functionName, funcea, 'FileKey') 60 | 61 | for addr in Functions(0xb00000, 0x13ea010): 62 | functionName = GetFunctionName(addr) 63 | if 'sub_FE51E0' in functionName: 64 | stringval = "" 65 | name = "" 66 | key = "" 67 | for (startea, endea) in Chunks(addr): 68 | for head in Heads(startea, endea): 69 | operand = GetDisasm(head) 70 | if 'mov' in operand and 'ds:(off' in operand: 71 | stringval = get_string_from_head(head) 72 | if 'lea' in operand and not (stringval is ''): 73 | if key is '': 74 | key = get_string_from_babyhead(head) 75 | else: 76 | name = get_string_from_babyhead(head) 77 | files[stringval] = {} 78 | files[stringval]['Name'] = name 79 | files[stringval]['Key'] = key 80 | key = '' 81 | stringval = '' 82 | 83 | sc = string_info_t() 84 | for addr in Functions(0xb00000, 0x2000000): 85 | functionName = GetFunctionName(addr) 86 | if '_ZN15VersionInfoListC2Ev' in functionName: 87 | stringval = "" 88 | name = "" 89 | key = "" 90 | for (startea, endea) in Chunks(addr): 91 | for head in Heads(startea, endea): 92 | operand = GetDisasm(head) 93 | if 'mov' in operand and 'ds:(off' in operand: 94 | if 'eax' in operand: 95 | stringval = get_string_from_head(head) 96 | if 'ecx' in operand: 97 | name = get_string_from_head(head) 98 | if stringval in files: 99 | continue 100 | files[stringval] = {} 101 | files[stringval]['Name'] = name 102 | 103 | 104 | 105 | def dumpkey(addr): 106 | for (startea, endea) in Chunks(addr): 107 | i = 0 108 | for head in Heads(startea, endea): 109 | i = i + 1 110 | if i > 0x10: 111 | continue 112 | operand = GetDisasm(head) 113 | if 'mov' in operand and 'ds:(off' in operand: 114 | return get_string_from_head(head) 115 | return '' 116 | 117 | start = idaapi.get_segm_by_name(".data.rel.ro.local").startEA 118 | end = idaapi.get_segm_by_name(".data.rel.ro").endEA 119 | print hex(start) 120 | print hex(end) 121 | a = 0x024548B4 122 | print hex(a), ' ', hex(idc.Dword(a)), ' ', idc.Name(idc.Dword(a)), ' : ', dumpkey(idc.Dword(a)) 123 | for addr in range(start, end): 124 | pointeraddr = idc.Dword(addr) 125 | pointername = idc.Name(pointeraddr) 126 | if not ('sub_' in pointername or 'loc_' in pointername): 127 | continue 128 | stringval = dumpkey(pointeraddr) 129 | if '_MST' in stringval or 'F_TEXT' in stringval: 130 | if stringval in files: 131 | if 'Key' in files[stringval]: 132 | continue 133 | #name = files[stringval]['Name'] 134 | name = dumpkey(idc.Dword(addr + 4)) 135 | key = dumpkey(idc.Dword(addr + 8)) 136 | #if name == nextstringval: 137 | files[stringval] = {} 138 | if not ('Name' in files[stringval]): 139 | files[stringval]['Name'] = name 140 | files[stringval]['Key'] = key 141 | 142 | #print files 143 | import json 144 | filename = os.path.expanduser("~/OneDrive/Documents/GitHub/BraveHaxvius/DataExtractor/files2.json") 145 | with open(filename, 'w') as fp: 146 | json.dump(files, fp) -------------------------------------------------------------------------------- /Client/MainWindow.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # MSTest test Results 33 | [Tt]est[Rr]esult*/ 34 | [Bb]uild[Ll]og.* 35 | 36 | # NUNIT 37 | *.VisualState.xml 38 | TestResult.xml 39 | 40 | # Build Results of an ATL Project 41 | [Dd]ebugPS/ 42 | [Rr]eleasePS/ 43 | dlldata.c 44 | 45 | # Benchmark Results 46 | BenchmarkDotNet.Artifacts/ 47 | 48 | # .NET Core 49 | project.lock.json 50 | project.fragment.lock.json 51 | artifacts/ 52 | **/Properties/launchSettings.json 53 | 54 | *_i.c 55 | *_p.c 56 | *_i.h 57 | *.ilk 58 | *.meta 59 | *.obj 60 | *.pch 61 | *.pdb 62 | *.pgc 63 | *.pgd 64 | *.rsp 65 | *.sbr 66 | *.tlb 67 | *.tli 68 | *.tlh 69 | *.tmp 70 | *.tmp_proj 71 | *.log 72 | *.vspscc 73 | *.vssscc 74 | .builds 75 | *.pidb 76 | *.svclog 77 | *.scc 78 | 79 | # Chutzpah Test files 80 | _Chutzpah* 81 | 82 | # Visual C++ cache files 83 | ipch/ 84 | *.aps 85 | *.ncb 86 | *.opendb 87 | *.opensdf 88 | *.sdf 89 | *.cachefile 90 | *.VC.db 91 | *.VC.VC.opendb 92 | 93 | # Visual Studio profiler 94 | *.psess 95 | *.vsp 96 | *.vspx 97 | *.sap 98 | 99 | # TFS 2012 Local Workspace 100 | $tf/ 101 | 102 | # Guidance Automation Toolkit 103 | *.gpState 104 | 105 | # ReSharper is a .NET coding add-in 106 | _ReSharper*/ 107 | *.[Rr]e[Ss]harper 108 | *.DotSettings.user 109 | 110 | # JustCode is a .NET coding add-in 111 | .JustCode 112 | 113 | # TeamCity is a build add-in 114 | _TeamCity* 115 | 116 | # DotCover is a Code Coverage Tool 117 | *.dotCover 118 | 119 | # AxoCover is a Code Coverage Tool 120 | .axoCover/* 121 | !.axoCover/settings.json 122 | 123 | # Visual Studio code coverage results 124 | *.coverage 125 | *.coveragexml 126 | 127 | # NCrunch 128 | _NCrunch_* 129 | .*crunch*.local.xml 130 | nCrunchTemp_* 131 | 132 | # MightyMoose 133 | *.mm.* 134 | AutoTest.Net/ 135 | 136 | # Web workbench (sass) 137 | .sass-cache/ 138 | 139 | # Installshield output folder 140 | [Ee]xpress/ 141 | 142 | # DocProject is a documentation generator add-in 143 | DocProject/buildhelp/ 144 | DocProject/Help/*.HxT 145 | DocProject/Help/*.HxC 146 | DocProject/Help/*.hhc 147 | DocProject/Help/*.hhk 148 | DocProject/Help/*.hhp 149 | DocProject/Help/Html2 150 | DocProject/Help/html 151 | 152 | # Click-Once directory 153 | publish/ 154 | 155 | # Publish Web Output 156 | *.[Pp]ublish.xml 157 | *.azurePubxml 158 | # Note: Comment the next line if you want to checkin your web deploy settings, 159 | # but database connection strings (with potential passwords) will be unencrypted 160 | *.pubxml 161 | *.publishproj 162 | 163 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 164 | # checkin your Azure Web App publish settings, but sensitive information contained 165 | # in these scripts will be unencrypted 166 | PublishScripts/ 167 | 168 | # NuGet Packages 169 | *.nupkg 170 | # The packages folder can be ignored because of Package Restore 171 | **/packages/* 172 | # except build/, which is used as an MSBuild target. 173 | !**/packages/build/ 174 | # Uncomment if necessary however generally it will be regenerated when needed 175 | #!**/packages/repositories.config 176 | # NuGet v3's project.json files produces more ignorable files 177 | *.nuget.props 178 | *.nuget.targets 179 | 180 | # Microsoft Azure Build Output 181 | csx/ 182 | *.build.csdef 183 | 184 | # Microsoft Azure Emulator 185 | ecf/ 186 | rcf/ 187 | 188 | # Windows Store app package directories and files 189 | AppPackages/ 190 | BundleArtifacts/ 191 | Package.StoreAssociation.xml 192 | _pkginfo.txt 193 | *.appx 194 | 195 | # Visual Studio cache files 196 | # files ending in .cache can be ignored 197 | *.[Cc]ache 198 | # but keep track of directories ending in .cache 199 | !*.[Cc]ache/ 200 | 201 | # Others 202 | ClientBin/ 203 | ~$* 204 | *~ 205 | *.dbmdl 206 | *.dbproj.schemaview 207 | *.jfm 208 | *.pfx 209 | *.publishsettings 210 | orleans.codegen.cs 211 | 212 | # Since there are multiple workflows, uncomment next line to ignore bower_components 213 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 214 | #bower_components/ 215 | 216 | # RIA/Silverlight projects 217 | Generated_Code/ 218 | 219 | # Backup & report files from converting an old project file 220 | # to a newer Visual Studio version. Backup files are not needed, 221 | # because we have git ;-) 222 | _UpgradeReport_Files/ 223 | Backup*/ 224 | UpgradeLog*.XML 225 | UpgradeLog*.htm 226 | 227 | # SQL Server files 228 | *.mdf 229 | *.ldf 230 | *.ndf 231 | 232 | # Business Intelligence projects 233 | *.rdl.data 234 | *.bim.layout 235 | *.bim_*.settings 236 | 237 | # Microsoft Fakes 238 | FakesAssemblies/ 239 | 240 | # GhostDoc plugin setting file 241 | *.GhostDoc.xml 242 | 243 | # Node.js Tools for Visual Studio 244 | .ntvs_analysis.dat 245 | node_modules/ 246 | 247 | # Typescript v1 declaration files 248 | typings/ 249 | 250 | # Visual Studio 6 build log 251 | *.plg 252 | 253 | # Visual Studio 6 workspace options file 254 | *.opt 255 | 256 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 257 | *.vbw 258 | 259 | # Visual Studio LightSwitch build output 260 | **/*.HTMLClient/GeneratedArtifacts 261 | **/*.DesktopClient/GeneratedArtifacts 262 | **/*.DesktopClient/ModelManifest.xml 263 | **/*.Server/GeneratedArtifacts 264 | **/*.Server/ModelManifest.xml 265 | _Pvt_Extensions 266 | 267 | # Paket dependency manager 268 | .paket/paket.exe 269 | paket-files/ 270 | 271 | # FAKE - F# Make 272 | .fake/ 273 | 274 | # JetBrains Rider 275 | .idea/ 276 | *.sln.iml 277 | 278 | # CodeRush 279 | .cr/ 280 | 281 | # Python Tools for Visual Studio (PTVS) 282 | __pycache__/ 283 | *.pyc 284 | 285 | # Cake - Uncomment if you are using it 286 | # tools/** 287 | # !tools/packages.config 288 | 289 | # Tabs Studio 290 | *.tss 291 | 292 | # Telerik's JustMock configuration file 293 | *.jmconfig 294 | 295 | # BizTalk build output 296 | *.btp.cs 297 | *.btm.cs 298 | *.odx.cs 299 | *.xsd.cs 300 | *.gz 301 | -------------------------------------------------------------------------------- /BraveHaxvius/Facebook.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Specialized; 3 | using System.IO; 4 | using System.Net; 5 | using System.Text; 6 | using System.Web; 7 | 8 | namespace BraveHaxvius 9 | { 10 | public class Facebook 11 | { 12 | public String Id = ""; 13 | public String AccessToken = ""; 14 | CookieContainer cookies = new CookieContainer(); 15 | String UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1"; 16 | String FacebookUrl = "https://www.facebook.com"; 17 | String LoginUrl = "https://www.facebook.com/login.php?login_attempt=1"; 18 | String AuthorizeUrl = "https://m.facebook.com/v2.8/dialog/oauth?redirect_uri=fb1238083776220999%3A%2F%2Fauthorize%2F&display=touch&state={\"challenge\"%3A\"PpE4heBTCHXuTR3ApSdBb98PSLY%3D\"%2C\"0_auth_logger_id\"%3A\"3146F93F-25AA-4F98-902D-923988CFCCA2\"%2C\"com.facebook.sdk_client_state\"%3Atrue%2C\"3_method\"%3A\"sfvc_auth\"}&scope=user_friends&response_type=token%2Csigned_request&default_audience=friends&return_scopes=true&auth_type=rerequest&client_id=1238083776220999&ret=login&sdk=ios&fbapp_pres=0&logger_id=3146F93F-25AA-4F98-902D-923988CFCCA2"; 19 | String ConfirmUrl = "https://m.facebook.com/v2.8/dialog/oauth/confirm"; 20 | String AcceptUrl = "https://m.facebook.com/v2.8/dialog/oauth/read"; 21 | String UserIdUrl = "https://graph.facebook.com/v2.8/me?access_token=AccessToken&debug=info&fields=id%2Cname%2Cemail&format=json&include_headers=false&sdk=ios"; 22 | String RecoveryUrl = "https://m.facebook.com/login/checkpoint"; 23 | public Boolean TwoFactorAuth = false; 24 | String loginHtml = ""; 25 | public Facebook() 26 | { 27 | } 28 | public void Login(String email, String password) 29 | { 30 | cookies.Add(new CookieCollection()); 31 | var get = GetData(FacebookUrl); 32 | var loginHtml = PostData(LoginUrl, String.Format("email={0}&pass={1}", email, password)); 33 | if (loginHtml.Contains("checkpointSubmitButton")) 34 | TwoFactorAuth = true; 35 | } 36 | public void FinishTwoFactorAuth(String recoveryCode) 37 | { 38 | var code = Console.ReadLine(); 39 | var tokenSearch = "\"dtsg\":{\"token\":\""; 40 | var token = loginHtml.Substring(loginHtml.IndexOf(tokenSearch) + tokenSearch.Length); 41 | token = token.Substring(0, token.IndexOf("\"")); 42 | var nhSearch = "name=\"nh\" value=\""; 43 | var nh = loginHtml.Substring(loginHtml.IndexOf(nhSearch) + nhSearch.Length); 44 | nh = nh.Substring(0, nh.IndexOf("\"")); 45 | NameValueCollection parameters = HttpUtility.ParseQueryString(String.Empty); 46 | parameters.Add("fb_dtsg", token); 47 | parameters.Add("checkpoint_data", ""); 48 | parameters.Add("approvals_code", code); 49 | parameters.Add("codes_submitted", "1"); 50 | parameters.Add("submit[Submit Code]", "Submit Code"); 51 | parameters.Add("nh", nh); 52 | var p = parameters.ToString(); 53 | var recovery = PostData(RecoveryUrl, p); 54 | parameters = HttpUtility.ParseQueryString(String.Empty); 55 | parameters.Add("fb_dtsg", token); 56 | parameters.Add("checkpoint_data", ""); 57 | parameters.Add("name_action_selected", "dont_save"); 58 | parameters.Add("submit[Continue]", "Continue"); 59 | parameters.Add("nh", nh); 60 | p = parameters.ToString(); 61 | var dontsavedevice = PostData(RecoveryUrl, p); 62 | var login = GetData("https://m.facebook.com/home.php"); 63 | } 64 | public void AllowFFBE() 65 | { 66 | var confirmHtml = GetData(AuthorizeUrl); 67 | var accessTokenHtml = PostData(ConfirmUrl, GetConfirmTable(confirmHtml)); 68 | try 69 | { 70 | AccessToken = GetAccessToken(accessTokenHtml); 71 | } 72 | catch 73 | { 74 | accessTokenHtml = PostData(AcceptUrl, GetConfirmTable(confirmHtml)); 75 | AccessToken = GetAccessToken(accessTokenHtml); 76 | } 77 | var userIdHtml = GetData(UserIdUrl.Replace("AccessToken", AccessToken)); 78 | Id = GetId(userIdHtml); 79 | } 80 | String GetConfirmTable(String html) 81 | { 82 | html = html.Substring(html.IndexOf("id=\"platformDialogForm\"")); 83 | html = html.Substring(0, html.IndexOf("button")); 84 | NameValueCollection parameters = HttpUtility.ParseQueryString(String.Empty); 85 | while (html.Contains("name")) 86 | { 87 | html = html.Substring(html.IndexOf("name=") + 6); 88 | var field = html.Substring(0, html.IndexOf("\"")); 89 | var value = ""; 90 | if (html.Contains("value") && html.IndexOf("value") < html.IndexOf("name=")) 91 | { 92 | html = html.Substring(html.IndexOf("value=") + 7); 93 | value = html.Substring(0, html.IndexOf("\"")); 94 | } 95 | parameters.Add(field, value); 96 | } 97 | return parameters.ToString(); 98 | } 99 | String GetAccessToken(String html) 100 | { 101 | var token = html.Substring(html.IndexOf("access_token=") + 13); 102 | token = token.Substring(0, token.IndexOf("&expires")); 103 | return token; 104 | } 105 | String GetId(String html) 106 | { 107 | var id = html.Substring(html.IndexOf(": \"") + 3); 108 | id = id.Substring(0, id.IndexOf("\"")); 109 | return id; 110 | } 111 | String GetData(String url) 112 | { 113 | return PostData(url, null); 114 | } 115 | String PostData(String url, String data) 116 | { 117 | HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 118 | request.CookieContainer = cookies; 119 | request.UserAgent = UserAgent; 120 | request.ContentType = "application/x-www-form-urlencoded"; 121 | if (data != null) 122 | { 123 | request.Method = WebRequestMethods.Http.Post; 124 | byte[] byteArray = Encoding.ASCII.GetBytes(data); 125 | request.ContentLength = byteArray.Length; 126 | using (Stream requestStream = request.GetRequestStream()) 127 | requestStream.Write(byteArray, 0, byteArray.Length); 128 | } 129 | String html = ""; 130 | using (StreamReader streamReader = new StreamReader((request.GetResponse() as HttpWebResponse).GetResponseStream())) 131 | html = streamReader.ReadToEnd(); 132 | cookies = request.CookieContainer; 133 | return html; 134 | } 135 | } 136 | } -------------------------------------------------------------------------------- /DataExtractor/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\files.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 123 | 124 | 125 | ..\network.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 126 | 127 | 128 | ..\response.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 129 | 130 | 131 | ..\variables.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 132 | 133 | -------------------------------------------------------------------------------- /DataExtractor/response.json: -------------------------------------------------------------------------------- 1 | { 2 | "W4Pz5kYu": "GuestMst", 3 | "4rC0aLkA": "UserItemInfo", 4 | "PJm9d197": "GameSetting", 5 | "c1qYg84Q": "VersionInfo", 6 | "9Qt5cI0n": "FriendUnitInfo", 7 | "Ec901P4A": "sgExpdAchievementInfoList", 8 | "56gJBnVh": "FriendUnitInfo", 9 | "1k3IefTc": "UserUnitFavorite", 10 | "tN8f0PSB": "NoticeMstNew", 11 | "ExQ7H1ok": "UserSwitchInfo", 12 | "g3JFd0y7": "RbResult", 13 | "T3jFQ12h": "UserEquipItemInfo", 14 | "XTz8dp5A": "MapResourceVersion", 15 | "s4IVuXZ4": "ServerTimeInfo", 16 | "ZrDPm3j5": "UserRecipeBookInfo", 17 | "mk5fza4r": "UserQuestInfo", 18 | "qL76625D": "sgExpdAchievementInfo", 19 | "y2BFGc4i": "UserImportantItemInfo", 20 | "7zMgdt8N": "UserSqexMarketInfo", 21 | "Wmr7y9a0": "UserRmInfo", 22 | "JG96kr5C": "UserQuestSubInfo", 23 | "0dNXQa3R": "UserItemInfo", 24 | "3oU9Ktb7": "UserTeamInfo", 25 | "wiTU2Hy1": "UserMateriaDictionary", 26 | "iq8w45vP": "PurchaseSettlement", 27 | "DxCN9SNZ": "sgHomeMarqueeInfo", 28 | "pzf5se6V": "Reinforcement", 29 | "7DYgrrM4": "FacebookRewardList", 30 | "R5kozET8": "UserMedalExchangeInfo", 31 | "f08du6EW": "UnitMix", 32 | "oK8srF6U": "UnitEquip", 33 | "Bi6hVv34": "BattleGroupMst", 34 | "jSC4Tx9H": "UserRmActualInfo", 35 | "jBL5XNf6": "BannerScheduleMst", 36 | "XhUc0ZwY": "RateAppReward", 37 | "QCcFB3h9": "SignalKey", 38 | "yShV1C9u": "UserRbInfo", 39 | "fMohhKK8": "BundleMst", 40 | "Bbc6pF9Q": "UserLoginBonusTotalInfo", 41 | "nUM2AENxdr": "sgExpdQuestRefresh", 42 | "IC0ueV5s": "GachaDetailMst", 43 | "gy84FjCA": "UserCraftInfo", 44 | "Duz1v8x9": "UserUnitSkillSublimationInfo", 45 | "2vuhy0Ex": "FriendUnitInfo", 46 | "N7Bd3IuL": "UserRbMatchingInfo", 47 | "bV34YIJQ": "MonsterPartsMst", 48 | "p9ortU42": "UserClsmProgressInfo", 49 | "1Ke2wFgm": "MissionResumeInfo", 50 | "1cBqy20J": "EventPointLog", 51 | "aS39Eshy": "UserMateriaInfo", 52 | "1S8P2u9f": "UserBeastPieceInfo", 53 | "0eDvu2N3": "OpeCraft", 54 | "W0E8BHa8": "sgUserMissionLock", 55 | "4pYnBMw7": "UserItemInfo", 56 | "5RZe0rLH": "FriendRestart", 57 | "pAVPk3wb": "FacebookRewardClaim", 58 | "In9jMbU7": "UserLoginBonusInfo", 59 | "5Ip20EyX": "UserPurchaseInfo", 60 | "MBPCGT84": "UserEquipItemInfo", 61 | "h5XGny0N": "UserGiftInfo", 62 | "y35YvQjZ": "WaveBattleInfo", 63 | "UaPBS5H0": "UserFriendLvInfo", 64 | "NVC6JP91": "UserExviusPointInfo", 65 | "blmGz1EI": "BundleInfo", 66 | "Er92Kdhm": "UnitEquip", 67 | "1IfDqR4n": "DungeonResourceLoadMst", 68 | "Lg6S5Gxa": "MapEventMst", 69 | "Tr9m32i1": "RbMatchingListInfo", 70 | "fng74EXV": "ClsmResumeInfo", 71 | "YQN6zx3R": "RbRankingListInfo", 72 | "3BI1xSGW": "NoticeMstOpen", 73 | "hZR64mDe": "FriendUnitInfo", 74 | "pDFgB3i0": "FieldTreasureMst", 75 | "Jr6z91Tf": "UserAnnounceInfo", 76 | "TJ9eL80N": "UnitEquip", 77 | "2po7N9Pf": "UserBeastPieceInfo", 78 | "8SztQck9": "RoutineEventUpdate", 79 | "VpWnB21X": "UserUnitDictionary", 80 | "nE7pV2wr": "UserCarryItemInfo", 81 | "yL2jdmM3": "OpeLoginBonusUpdate", 82 | "8J1R5PXG": "UserSwitchInfo", 83 | "an6TB4WS": "MissionPhaseMst", 84 | "KMwJ3s6W": "RbResumeInfo", 85 | "R17unt2e": "NoticeMstOld", 86 | "19djzuNF": "DungeonBonusMst", 87 | "b21IQLY0": "GuestMst", 88 | "01CeopkL": "UserBeastInfo", 89 | "Hqdgx83H": "DailyQuestMst", 90 | "5yLD4dYI": "GachaExe", 91 | "3VS1Bhmf": "VariableStoreScheduleInfo", 92 | "rL81fVUI": "UserMateriaInfo", 93 | "F2pYJGt5": "UserUnitFavorite", 94 | "67l03PW2": "sgExpdQuestInfo", 95 | "Dqx0MA42": "UserOptionInfo", 96 | "qja26wHb": "UserMailInfo", 97 | "6RQhbe8m": "UserItemDictionary", 98 | "J3pAG0I5": "UserDiamondInfo", 99 | "xS3CA5LN": "RoutineHomeUpdate", 100 | "6ePjU3Nw": "SeasonEventGroupAbilityMst", 101 | "Z3vhm29a": "UserLearningInfo", 102 | "rqxw0p9k": "ScenarioBattleMst", 103 | "8KPfoy2F": "EventSetMst", 104 | "vM21k0do": "HarvestDetailInfo", 105 | "49rQB3fP": "UserBeastDeckInfo", 106 | "Md0N5abE": "UserImportantItemInfo", 107 | "j0e1xIv9": "UserUnitSkillSublimationInfo", 108 | "2K05IxtX": "FriendSearchResult", 109 | "RyOoibYJ": "sgMissionLock", 110 | "3yXTA9Se": "RoutineWorldUpdate", 111 | "yT12twnc": "OpeRbInfo", 112 | "Q4kJKh8b": "RmEventInfo", 113 | "LhVz6aD2": "UserInfo", 114 | "HrVT9C6h": "UserMonsterDictionary", 115 | "B71MekS8": "UserUnitInfo", 116 | "yeXn0tk1": "UserCraftInfo", 117 | "Zh5jXr2U": "UserMateriaInfo", 118 | "5Eb0Rig6": "UserPartyDeckInfo", 119 | "hQKAwj18": "UserQuestSubInfo", 120 | "f6yGgCj2": "FriendUnitInfo", 121 | "TEAYk6R1": "Header", 122 | "f5bA4wFx": "DailyLoginBonusInfo", 123 | "pZY6Vw70": "UserClsmBattleInfo", 124 | "0rVbiCG8": "DmgRankMst", 125 | "g4Pu8oUt": "UserRbInfo", 126 | "XoPQ5Rs3": "UserQuestInfo", 127 | "eKZu2j0M": "UserSpDungeonInfo", 128 | "w83oV9uP": "UserEquipItemInfo", 129 | "80nGg32w": "UserGachaInfo", 130 | "ds1vP0GR": "SeasonEventGroupMst", 131 | "I53AVzSo": "OpeFriendInfo", 132 | "R8U3uD1i": "OpeUnitFavorite", 133 | "JR7jZci2": "ScenarioBattleInfo", 134 | "ki9hJ5vq": "UserRbTradeCompleteInfo", 135 | "Y6j0NJho": "ResourceVersionMst", 136 | "4D5k8dpI": "GachaScheduleMst", 137 | "Z53gL0RU": "UserNoticeInfo", 138 | "sxe5C48P": "DailyQuestInfo", 139 | "wR18kvTe": "UserSpDungeonInfo", 140 | "tQf0KNH7": "UserFacebook", 141 | "wbet57nF": "MonsterMst", 142 | "gP9TW2Bf": "UserBeastInfo", 143 | "d4YbK6Iu": "RecipePickupScheduleMst", 144 | "wsItm74h": "SearchGetItemInfo", 145 | "m4Bk5ex3": "UserEquipItemDictionary", 146 | "r6I9k7WR": "UserClsmInfo", 147 | "aRhHK1S9": "UserMonsterDictionary", 148 | "NGwZ8y7X": "ReductionExtMst", 149 | "8PEB5o7G": "UserActualInfo", 150 | "m4M7CVBj": "RoutineHomeUpdate", 151 | "Ju23SReQ": "RoutineGachaUpdate", 152 | "6ywL2sQa": "AnnounceMst", 153 | "H54XvPis": "RbTradeBoardGroupMst", 154 | "pcjqhOI8": "BundleItemMst", 155 | "Ur6CKS2e": "RmResumeInfo", 156 | "Ray54PNQ": "UnitSell", 157 | "2pJ8F0SK": "UserRbTradePieceInfo", 158 | "h5zN9MvP": "RbRankingStateInfo", 159 | "vB5j26Gd": "UserClsmProgressInfo", 160 | "0xkoNP8U": "SpDungeonCondMst", 161 | "QB47tpMF": "RoutineHomeUpdate", 162 | "8gSkPD6b": "UserUnitInfo", 163 | "dg5ZV3kQ": "RaidMenuInfo", 164 | "UDBrChWN": "sgExpdResultInfo", 165 | "VKA5urE1": "NoticeMstOpenYet", 166 | "hcD0ej1v": "AppVersionInfo", 167 | "6v0LPiRe": "EncountInfo", 168 | "09HRWXDf": "MissionResult", 169 | "q02dyFhL": "GachaEffectBlockMst", 170 | "0T5wP98d": "CraftResultInfo", 171 | "YjHhvN65": "ScenarioBattleGroupMst", 172 | "K04eyEYA": "GachaEffectPatternMst", 173 | "ofp9t72b": "SeasonEventScheduleMst", 174 | "bCf65yoK": "Message", 175 | "DW0rgk3C": "UserRbVsInfo", 176 | "5Hx1NjQI": "OpeDmgRank", 177 | "nSG9Jb1s": "UserArchiveInfo", 178 | "Dg7f6chV": "SeasonEventMst", 179 | "sWc7EH69": "UnitClassUp", 180 | "PcUrGH13": "GachaMst", 181 | "TQ5AJd2K": "UserChallengeInfo", 182 | "1sGiqV9T": "OpeQuest", 183 | "3KLU4mSD": "UserSpChallengeInfo", 184 | "vCX8aN9E": "UnitEquip", 185 | "MLj0dJa8": "MonsterPassiveSkillMst", 186 | "Bin1S0Wc": "UserBeastDeckInfo", 187 | "IqkX0gV1": "UnitEquip", 188 | "8CoiSdu4": "SpChallengeScheduleMst", 189 | "WS1g0ECn": "SpChallengeStatus", 190 | "9Tp2fiyB": "Reinforcement", 191 | "UC91b2Vj": "UserPartyDeckInfo", 192 | "7RI4zZxY": "UserSpChallengeInfo", 193 | "V3bK1J60": "UserAllianceDeckInfo", 194 | "L4tq7QpW": "TickerLogInfo", 195 | "diY0g3S5": "SpChallengeStatus", 196 | "TxDI2r9g": "UserPurchaseListInfo", 197 | "5Xh859hl": "sgExpdMileStoneClaim" 198 | } 199 | -------------------------------------------------------------------------------- /PacketDecoder/PacketDecoder.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {9B176963-698E-451F-821D-908620E17702} 8 | WinExe 9 | PacketDecoder 10 | PacketDecoder 11 | v4.5.2 12 | 512 13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 14 | 4 15 | true 16 | publish\ 17 | true 18 | Disk 19 | false 20 | Foreground 21 | 7 22 | Days 23 | false 24 | false 25 | true 26 | 0 27 | 1.0.0.%2a 28 | false 29 | false 30 | true 31 | 32 | 33 | AnyCPU 34 | true 35 | full 36 | false 37 | ..\bin\ 38 | DEBUG;TRACE 39 | prompt 40 | 4 41 | 42 | 43 | AnyCPU 44 | pdbonly 45 | true 46 | ..\bin\ 47 | TRACE 48 | prompt 49 | 4 50 | 51 | 52 | PacketDecoder.Program 53 | 54 | 55 | 56 | ..\packages\FiddlerCore2.1.0.0\lib\net40\BasicFormatsForCore.dll 57 | False 58 | 59 | 60 | ..\packages\FiddlerCore2.1.0.0\lib\net40\BCMakeCert.dll 61 | False 62 | 63 | 64 | ..\packages\FiddlerCore2.1.0.0\lib\net40\CertMaker.dll 65 | False 66 | 67 | 68 | ..\packages\FiddlerCore2.1.0.0\lib\net40\FiddlerCore4.dll 69 | True 70 | 71 | 72 | ..\packages\MahApps.Metro.1.5.0\lib\net45\MahApps.Metro.dll 73 | True 74 | 75 | 76 | ..\packages\MahApps.Metro.IconPacks.Modern.1.9.1\lib\net45\MahApps.Metro.IconPacks.Modern.dll 77 | 78 | 79 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 80 | True 81 | False 82 | 83 | 84 | 85 | 86 | 87 | 88 | ..\packages\MahApps.Metro.1.5.0\lib\net45\System.Windows.Interactivity.dll 89 | True 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 4.0 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | MSBuild:Compile 107 | Designer 108 | 109 | 110 | 111 | True 112 | True 113 | Settings.settings 114 | 115 | 116 | MSBuild:Compile 117 | Designer 118 | 119 | 120 | App.xaml 121 | Code 122 | 123 | 124 | MainWindow.xaml 125 | Code 126 | 127 | 128 | 129 | 130 | 131 | Code 132 | 133 | 134 | Designer 135 | 136 | 137 | 138 | SettingsSingleFileGenerator 139 | Settings.Designer.cs 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | {bdcf492d-5bad-43f0-9056-a24647cbe948} 148 | BraveHaxvius 149 | True 150 | 151 | 152 | 153 | 154 | 155 | False 156 | Microsoft .NET Framework 4.5.2 %28x86 and x64%29 157 | true 158 | 159 | 160 | False 161 | .NET Framework 3.5 SP1 162 | false 163 | 164 | 165 | 166 | -------------------------------------------------------------------------------- /BraveHaxvius/Networking.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Net; 6 | using System.Text; 7 | using System.Threading; 8 | using Newtonsoft.Json; 9 | using Newtonsoft.Json.Linq; 10 | using BraveHaxvius.Data; 11 | 12 | namespace BraveHaxvius 13 | { 14 | public class Networking 15 | { 16 | public BraveExvius client; 17 | public Networking() 18 | { 19 | ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 20 | } 21 | JObject VersionInfo(String name, String version) 22 | { 23 | return new JObject( 24 | new JProperty(Variable.KeyName, name), 25 | new JProperty(Variable.Value, version)); 26 | } 27 | JProperty VersionInfo() 28 | { 29 | var os = client.OperatingSystem.Contains("ios") ? "IOS" : client.OperatingSystem.Contains("amazon") ? "AMAZON" : "AND"; 30 | return new JProperty(GameObject.VersionInfo, 31 | new JArray( 32 | VersionInfo("F_APP_VERSION_" + os, client.AppVersion), 33 | VersionInfo("F_RSC_VERSION", client.RscVersion), 34 | VersionInfo("F_MST_VERSION", client.MstVersion))); 35 | } 36 | public JObject DataObject(List inputs) 37 | { 38 | var data = new JObject(); 39 | foreach (var input in inputs) 40 | data.Add(input); 41 | data.Add(client.UserInfo); 42 | if (client.Locale == "US" && !String.IsNullOrEmpty(client.TransferCode)) 43 | data.Add(new JProperty(Variable.Facebook, new JArray(new JObject(new JProperty(Variable.UsingFacebook, "0"))))); 44 | else if (!String.IsNullOrWhiteSpace(client.FacebookUserId)) 45 | data.Add(new JProperty(Variable.Facebook, new JArray(new JObject(new JProperty(Variable.UsingFacebook, "1"))))); 46 | if (client.LastSignalKey != "") 47 | data.Add(new JProperty(GameObject.SignalKey, new JArray(new JObject(new JProperty(Variable.Data, client.LastSignalKey))))); 48 | data.Add(VersionInfo()); 49 | return data; 50 | } 51 | public JObject Packet(String requestID, String encryptedData) 52 | { 53 | return new JObject( 54 | new JProperty(GameObject.Header, 55 | new JObject( 56 | new JProperty(Variable.Milliseconds, ((int)((DateTime.UtcNow - System.Diagnostics.Process.GetCurrentProcess().StartTime.ToUniversalTime()).TotalMilliseconds)).ToString()), 57 | new JProperty(Variable.RequestID, requestID))), 58 | new JProperty(Variable.Encrypted, 59 | new JObject( 60 | new JProperty(Variable.Data, encryptedData)))); 61 | } 62 | public JObject SendPacket(Request request) 63 | { 64 | return SendPacket(request, new List()); 65 | } 66 | public JObject SendPacket(Request request, params JProperty[] inputs) 67 | { 68 | var inputList = new List(); 69 | foreach (var input in inputs) 70 | inputList.Add(input); 71 | return SendPacket(request, inputList); 72 | } 73 | public JObject SendPacket(Request request, List inputs) 74 | { 75 | Logger.Out("Sending : " + request.Name + "..."); 76 | var decryptedData = DataObject(inputs); 77 | var decryptedDataString = JsonConvert.SerializeObject(decryptedData, Formatting.None); 78 | var encryptedData = Crypto.Encrypt(decryptedDataString, request.EncodeKey); 79 | var packet = Packet(request.RequestID, encryptedData); 80 | var packetString = JsonConvert.SerializeObject(packet, Formatting.None); 81 | var url = "https://lapisv230.gumi.sg/lapisProd/app/php/gme/actionSymbol/"; 82 | //url = "https://lapis-dev.gumi.sg/lapisDev/app/php/gme/actionSymbol/"; 83 | if (client.Locale == "JP") 84 | url = "https://v29-android.game.exvius.com/lapis/app/php/gme/actionSymbol/"; 85 | var responseString = ""; 86 | JObject responseData = null; 87 | //responseString = SendData(url + request.Url + ".php", packetString); /* 88 | try 89 | { 90 | responseString = SendData(url + request.Url + ".php", packetString); 91 | responseData = (JObject)JsonConvert.DeserializeObject(responseString); 92 | } 93 | catch (Exception e) 94 | { 95 | var ee = e.Message.ToString(); 96 | if (ee.Contains("403")) 97 | throw new Exception("IP Banned"); 98 | if (ee.Contains("Unable to connect")) 99 | throw new Exception("Bad Proxy"); 100 | if (ee.Contains("400")) 101 | throw new Exception("Unk"); 102 | if (ee.Contains("503")) 103 | throw new Exception("proxy dead"); 104 | responseString = SendData(url + request.Url + ".php", packetString); 105 | responseData = (JObject)JsonConvert.DeserializeObject(responseString); 106 | //return SendPacket(request, inputs); 107 | }//*/ 108 | var errorMsg = responseData[GameObject.Message]?[Variable.Message]; 109 | if (errorMsg != null) 110 | { 111 | var msg = Text.Texts.First(t => t.Key == errorMsg.ToString()).Value; 112 | if (msg == "Please log in again.") 113 | { 114 | Thread.Sleep(10000); 115 | client.UserId = ""; 116 | client.UserName = ""; 117 | client.FriendCode = ""; 118 | client.Password = ""; 119 | client.GumiId = ""; 120 | client.GumiToken = ""; 121 | client.ModelChangeCnt = ""; 122 | Request Initialize = new Request { Name = "Initialize", Url = "fSG1eXI9", EncodeKey = "rVG09Xnt", RequestID = "75fYdNxq" }; 123 | var initializeResponse = SendPacket(Initialize); 124 | var userInfo = initializeResponse["LhVz6aD2"].First(); 125 | client.UserId = userInfo["9Tbns0eI"].ToString(); 126 | client.UserName = userInfo["9qh17ZUf"].ToString(); 127 | client.FriendCode = userInfo["m3Wghr1j"].ToString(); 128 | client.Password = userInfo["JC61TPqS"].ToString(); 129 | if (client.Locale != "JP") 130 | { 131 | client.GumiId = userInfo["mESKDlqL"].ToString(); 132 | client.GumiToken = userInfo["iVN1HD3p"].ToString(); 133 | } 134 | client.ModelChangeCnt = userInfo["6Nf5risL"].ToString(); 135 | Thread.Sleep(2000); 136 | 137 | return SendPacket(request, inputs); 138 | } 139 | throw new Exception(Text.Texts.First(t => t.Key == errorMsg.ToString()).Value); 140 | } 141 | var decryptedResponseString = Crypto.Decrypt(responseData[Variable.Encrypted][Variable.Data].ToString(), request.EncodeKey); 142 | var decryptedResponseData = (JObject)JsonConvert.DeserializeObject(decryptedResponseString); 143 | var signalResponse = decryptedResponseData[GameObject.SignalKey]; 144 | if (signalResponse != null) 145 | client.LastSignalKey = signalResponse.First()[Variable.Data].ToString(); 146 | Logger.Out("\tRequest done"); 147 | return decryptedResponseData; 148 | } 149 | public String DecodePacket(JObject obj) 150 | { 151 | var decryptedDataString = JsonConvert.SerializeObject(obj, Formatting.Indented); 152 | foreach (var v in Variable.Variables) 153 | decryptedDataString = decryptedDataString.Replace(v.Key, v.Value); 154 | foreach (var v in GameObject.GameObjects) 155 | decryptedDataString = decryptedDataString.Replace(v.Key, v.Value); 156 | return decryptedDataString; 157 | } 158 | private String SendData(String url, String data) 159 | { 160 | HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 161 | webRequest.Headers.Clear(); 162 | webRequest.Method = WebRequestMethods.Http.Post; 163 | webRequest.Timeout = 150000; 164 | webRequest.ContentType = "application/x-www-form-urlencoded"; 165 | webRequest.Accept = "*/*"; 166 | webRequest.UserAgent = "FF%20EXVIUS/" + client.BuildVersion.Replace("ver.", "") + " CFNetwork/808.3 Darwin/16.3.0"; 167 | webRequest.AutomaticDecompression = DecompressionMethods.GZip; 168 | webRequest.Headers[HttpRequestHeader.AcceptEncoding] = "gzip"; 169 | webRequest.Headers[HttpRequestHeader.AcceptLanguage] = "en-us"; 170 | webRequest.KeepAlive = true; 171 | webRequest.ProtocolVersion = HttpVersion.Version10; 172 | if (!String.IsNullOrWhiteSpace(client.ProxyIpAddr)) 173 | webRequest.Proxy = new WebProxy(client.ProxyIpAddr, client.ProxyPort); 174 | var content = Encoding.UTF8.GetBytes(data); 175 | using (Stream stream = webRequest.GetRequestStream()) 176 | stream.Write(content, 0, content.Length); 177 | using (Stream stream = webRequest.GetResponse().GetResponseStream()) 178 | using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) 179 | return reader.ReadToEnd(); 180 | } 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /DataExtractor/variables.json: -------------------------------------------------------------------------------- 1 | { 2 | "t7n6cVWf": "Encrypted", 3 | "9Tbns0eI": "UserId", 4 | "9qh17ZUf": "UserName", 5 | "JC61TPqS": "Password", 6 | "io30YcLA": "OperatingSystem", 7 | "Y76dKryw": "CountryCode", 8 | "e8Si6TGh": "ContactId", 9 | "K1G4fBjF": "PurchaseSignature", 10 | "1WKh6Xqe": "BuildVersion", 11 | "64anJRhx": "Time", 12 | "m3Wghr1j": "FriendId", 13 | "w40YsHIz": "NotFriendId", 14 | "6Nf5risL": "ModelChangeCnt", 15 | "ma6Ac53v": "MacroToolRunningStatus", 16 | "D2I1Vtog": "Ymd", 17 | "9K0Pzcpd": "AppVersion", 18 | "mESKDlqL": "GumiId", 19 | "iVN1HD3p": "GumiToken", 20 | "c52MWCji": "TransferCode", 21 | "D3fzIL1s": "TransferPin", 22 | "F0bCxp5m": "DateCreatedShort", 23 | "Tx6MGkJ1": "DateCreated", 24 | "XBZ40ms5": "DateLinked", 25 | "3ES8GAu4": "Time0", 26 | "6e4ik6kA": "DeviceId", 27 | "NggnPgQC": "AdvertisingId", 28 | "X6jT6zrQ": "FacebookUserId", 29 | "DOFV3qRF": "FacebookToken", 30 | "K2jzG6bp": "UsingFacebook", 31 | "qrVcDe48": "Data", 32 | "7wV3QZ80": "Level", 33 | "B6H34Mea": "Experience", 34 | "B6kyCQ9M": "Energy", 35 | "n4LtSU7G": "EnergyTimer", 36 | "m0bD2zwU": "EnergyMax", 37 | "xDm19iGS": "ColosseumOrb", 38 | "4ywDFuU9": "ColosseumOrbTimer", 39 | "zo76TkaG": "ColosseumOrbMax", 40 | "Ddsg1be4": "RaidOrb", 41 | "nhdY37pu": "RaidOrbTimer", 42 | "Le8Z5cS0": "RaidOrbMax", 43 | "T1Lm7WdD": "ExtraUnits", 44 | "tsT4vP7w": "ExtraFriends", 45 | "Xu7L1dNM": "ExtraEquipment", 46 | "4BI0WKjQ": "ExtraItems", 47 | "9w3Pi6XJ": "ExtraMaterials", 48 | "92LoiU76": "ExtraMateria", 49 | "3TzVX8nZ": "LastLoginYMD", 50 | "68Vn2FrK": "SerialLogin", 51 | "7UR4J2SE": "Gil", 52 | "0XUs3Tv6": "FriendPoints", 53 | "Utx8P1Qo": "Gift", 54 | "Wk1v6upb": "Message", 55 | "a4hXTIm0": "KeyName", 56 | "wM9AfX6I": "Value", 57 | "og2GHy49": "UniqueUnitId", 58 | "3HriTp6B": "UnitId", 59 | "Z06cK4Qi": "LastAccessBase", 60 | "9fW0TePj": "Rarity", 61 | "UbSL8C7i": "GenderId", 62 | "IWv3u1xX": "JobId", 63 | "a9qg8vnP": "TribeId", 64 | "taQ69cIx": "GameId", 65 | "woghJa61": "BaseUnitId", 66 | "aU3o2D4t": "UnitMaxLevel", 67 | "yY7U9TsP": "EquipIds", 68 | "wSB84Usi": "IsCombatUnit", 69 | "2odVXyT8": "IsPotUnit", 70 | "Fzmtn2Q5": "IsSummonable", 71 | "19ykfMgL": "MateriaSlots", 72 | "FBjo93gK": "UnitSellPrice", 73 | "S5Ib7En1": "UnitSellIds", 74 | "10fNKueF": "UnitLvl", 75 | "em5hx4FX": "UnitHp", 76 | "L0MX7edB": "UnitMp", 77 | "o7Ynu1XP": "UnitAtk", 78 | "6tyb58Kc": "UnitDef", 79 | "Y9H6TWnv": "UnitMag", 80 | "sa8Ewx3H": "UnitSpr", 81 | "EXf5G3Mk": "UnitLb", 82 | "a71oxzCH": "UnitLbLvl", 83 | "f17L8wuX": "UnitTmr", 84 | "xojJ2w0S": "BonusUnit", 85 | "X9ABM7En": "TotalExperience", 86 | "KJv6V7G9": "Dictionary", 87 | "z41pMJvC": "LibraDictionary", 88 | "4yk1JQBs": "KnockdownCount", 89 | "r21y0YzS": "PartyId", 90 | "Z34jU7ue": "QuestId", 91 | "4kcAD9fW": "QuestStatus", 92 | "VjJQ51uG": "AcceptedDate", 93 | "m8ivD4NX": "CompletedDate", 94 | "Iwfx42Wo": "EsperId", 95 | "i5pd8xr3": "ColosseumId", 96 | "G4L0YIB2": "Description", 97 | "X1IuZnj2": "GachaId", 98 | "nqzG3b2v": "GachaSubId", 99 | "UJz5QED2": "GachaUnitList", 100 | "WbGYcN17": "UnitList", 101 | "ecK58yUC": "LoginBonus", 102 | "93Y6evuT": "Equipment", 103 | "80NUYFMJ": "Materia", 104 | "2A6fYiEC": "PartyUnits", 105 | "7Svg2kdT": "SubQuestId", 106 | "0G7J2vfD": "SubQuestItemCount", 107 | "Gs6BT8n5": "TargetYear", 108 | "goAiX84L": "NoticeInfo", 109 | "S21FT3L8": "MedalId", 110 | "ngQX7a3N": "MedalExchangeCount", 111 | "vhjEjKXZ": "ServerTime", 112 | "cnopoBWZ": "ServerTick", 113 | "S4U09svH": "UnitExperience", 114 | "kcb0tsM6": "ActualUnitExperience", 115 | "Wdi3MAs2": "BonusGil", 116 | "Syar71nw": "StolenGil", 117 | "16LQuC5r": "ActualBonusGil", 118 | "TK6dB18Q": "BaseGilTK", 119 | "L1uwe36k": "AddGil", 120 | "09HRWXDf": "MissionResults", 121 | "J1YX9kmM": "EquipId", 122 | "1Rf2VDoI": "UnitLbGain", 123 | "u18nfD7p": "UnitXpGain", 124 | "N85uJT1d": "UnitGilSell", 125 | 126 | "xF9Sr1a6": "ItemsDropped", 127 | "JHMit30L": "ItemsUniqueDropped", 128 | "Sp7fF6I9": "ItemsStolen", 129 | "02aARqrv": "ItemsUniqueStolen", 130 | "Z7G0yxXe": "ItemsTreasure", 131 | "EWmQy52k": "ItemsFound", 132 | 133 | "81fnjKLw": "EquipmentDropped", 134 | "3imo7rf4": "EquipmentUniqueDropped", 135 | "Iyx9Bos7": "EquipmentStolen", 136 | "VZ8DSco1": "EquipmentUniqueStolen", 137 | "Mh1BA4uv": "EquipmentTreasure", 138 | "XMgu7qE0": "EquipmentFound", 139 | 140 | "2U05aV9Z": "UnitsDropped", 141 | 142 | "REB5tAL9": "ItemsTrusted", 143 | "Ym8F0ndw": "EquipmentTrusted", 144 | "ERJa3SL5": "MateriaTrusted", 145 | "V59rxm82": "EncounterId", 146 | "nar74pDu": "EncounteredMonsters", 147 | "f6M1cJgk": "MonstersKilledCount", 148 | "uU21m4ry": "MonsterParts", 149 | "Qic38SuC": "PartyStats", 150 | "j94B63fP": "PossibleItems", 151 | "dX6cor8J": "Rewards", 152 | "5vFjunq1": "Options", 153 | "XFLm4Mx6": "InternalDescription", 154 | "g38Pjk10": "GachaAnimation", 155 | "JDFMe3A7": "Moogle", 156 | "4yT7FUqj": "InternalDesc", 157 | "1X65WPLU": "Link", 158 | "2HqjK1F7": "GiftId", 159 | "A3j7Wxtw": "DateStartedYMD", 160 | "9WsTg26F": "FriendUnitId", 161 | "AJGfV35v": "FriendName", 162 | "QSf4NDq3": "FriendRank", 163 | "wjX34YxG": "FriendLevel", 164 | "bUfq8BJ3": "FriendIdFrom", 165 | //"XZ4Kh7Ic": "Espers", 166 | "fh31sk7B": "MonsterHp", 167 | "PC97pWQj": "MonsterMp", 168 | "9NBV1XCS": "MonsterAtk", 169 | "Pn5w9dfh": "MonsterDef", 170 | "84FJM3PD": "MonsterMag", 171 | "T8xMDAZ4": "MonsterMnd", 172 | "41fbhtj2": "MonsterSpr", 173 | "hn42BL3Q": "ElementResists", 174 | "D9Nb7jgd": "StatusResists", 175 | "f67khsQZ": "PhysicalResist", 176 | "Q1qLbx93": "MagicalResist", 177 | "5VtY0SIU": "MagicAffinity", 178 | "PR2HIc71": "BattleUnitId", 179 | "rUnq35N9": "IsMoogle", 180 | "9mu4boy7": "UnitTmrId", 181 | "QLfe23bu": "BitNumber", 182 | "a9DvZ70c": "AttackFrames", 183 | "5A8SmwyC": "EffectFrames", 184 | "0A1BkNWb": "EsperSp", 185 | "E8WRi1bg": "EsperBoardPieces", 186 | "jsvoa0I2": "Items", 187 | "6ukvMSg9": "NumSlots", 188 | "1J7WnqxL": "NumSlots2", 189 | "V36ygRYs": "ChallengeId", 190 | "Pzn5h0Ga": "ChallengeRequirement", 191 | "dX6cor8j": "ChallengeReward", 192 | "HpL3FM4V": "ItemList", 193 | "YBRCsoxu": "AppRated", 194 | "qo3PECw6": "MissionId", 195 | "9Pb24aSy": "MapId", 196 | "Esxe71j3": "RegionId", 197 | "uv60hgDW": "SubRegionId", 198 | "U9iHsau3": "DungeonId", 199 | "Y4VoF8yu": "MissionType", 200 | "qdhWF7z9": "MissionIdChallenges", 201 | "juA0Z4m7": "RequiredSwitchId", 202 | "dIPkNn61": "GrantedSwitchId", 203 | "5opcUT9t": "SwitchType", 204 | "1x4bG2J8": "DungeonCompleteReward", 205 | "CQN15Hgr": "Raid", 206 | "zF6QIY2r": "GatheringStageId", 207 | "1C7GDEv4": "QuestSwitchIdQQ", 208 | "q4f9IdMs": "EventDungeonSwitchIdQQ", 209 | "bs60p4LC": "DungeonSwitchIdQQ", 210 | "6w4xiIsS": "BattleMusicQQ", 211 | "DYTx1Is3": "IconQQ", 212 | "gQR24kST": "StdEsperRaidGath", 213 | "Kn03YQLk": "UnitRestricted", 214 | "fV4Jn13q": "EscapeContinueQQ", 215 | "TKBIV0U1": "NotEggSeekerQQ", 216 | "T03qgLWA": "PumpkinKingQQ", 217 | "1Xfx5nPZ": "SnowmanQQ", 218 | "k4imoR6p": "EventQQ", 219 | "27RyqAGe": "OptionName", 220 | "ayUH8g4q": "OptionValue", 221 | "NYb0Cri6": "ArchiveName", 222 | "6gAX1BpC": "ArchiveValue", 223 | "Gh92V3Tx": "TownId", 224 | "j9NS0H15": "StoreItemBuyId", 225 | "U1uaXph4": "StoreItemBuyPrice", 226 | "8X7LwE3r": "StoreItemSellId", 227 | "97h4mIQo": "StoreItemSellPrice", 228 | "GA1D6XIC": "ArenaPlayerDmg", 229 | "Pch7J9Ty": "ArenaEnemyDmg", 230 | "3S8pMym0": "ArenaPlayerTotalDmg", 231 | "bB69ZWQY": "ArenaEnemyTotalDmg", 232 | "z8uj9TAU": "ArenaResult", 233 | "g9t7dBCH": "ArenaTurns", 234 | "2q7sZreS": "ArenaVsFriend", 235 | "nYD7LvSG": "DailyQuestId", 236 | "97CxqAgk": "DailyQuestAmountRequired", 237 | "XCD3VwHk": "DailyQuestAmountCompleted", 238 | "3cEGYLhA": "QuestCompleted", 239 | "6uvHX2JG": "DailyQuestName", 240 | "56rsqHAp": "DailyQuestDescription", 241 | "ZLuw4DLa": "DailyQuestStatus", 242 | "Z0EN6jSh": "CountId", 243 | "8xi6Xvyk": "BattleWaves", 244 | "0VkYZx1a": "BattleType", 245 | "4tNM5fGC": "FieldTreasureId", 246 | "NiG2wL3A": "FieldTreasureItem", 247 | "uJh46wFS": "FieldTreasureAvailable", 248 | "N3hB0CwE": "HarvestId", 249 | "9GIvAQC2": "HarvestOrder", 250 | "1Fa7rL5R": "HarvestItem", 251 | "0GgK6ytT": "GachaCost", 252 | "zJ1A6HXm": "GachaCost", 253 | "2RtVPS3b": "GachaRepeat", 254 | "ytHoz4E2": "Milliseconds", 255 | "z5hB3P01": "RequestID", 256 | "6tSP4s8J": "ID", 257 | "dNrSy63V": "ServerTime", 258 | "3a162M47": "ImageQuality", 259 | "KmgMTuj5": "Language", 260 | "dUX7Pt5i": "ReinforcementFriendId", 261 | "qLke7K8f": "ReinforcementUnitId", 262 | "4p6CrcGt": "Items", 263 | "Pqi5r1TZ": "Specials", 264 | "i1yJ3hmT": "Magics", 265 | "s2rX7g0o": "LimitBreaks", 266 | "9JBtk2LE": "Espers", 267 | "qr5PoZ1W": "ElementalAttacks", 268 | "73CfbLEx": "KnockOuts", 269 | "Z1p0j9uF": "DeadCount", 270 | "69ieJGhD": "BattleClear", 271 | "6q35TL07": "Count", 272 | "xqartN26": "MonsterPartId", 273 | "6Yc4RkdM": "MonstPartsNum", 274 | "V9j8wJcC": "MonsterId", 275 | "VgrT60cL": "MonsterName", 276 | "9BetM2Ds": "MonsterDrops", 277 | "MZn8LC6H": "MonsterSpecialDrops", 278 | "Vf5DGw07": "MonsterUnitDrops", 279 | "3frn4ILX": "MonsterSteal", 280 | "ATM35pjf": "MonsterStealGil", 281 | "15Y3fBmF": "TranslationJson", 282 | "KosY4a18": "RecipeType", 283 | "MpNE6gB5": "RecipeId", 284 | "staFu8U1": "RecipeBookId", 285 | "H5jBL0Vf": "MateriaId", 286 | "gak9Gb3N": "ItemType", 287 | "9YPZuB2i": "QuestSubquest", 288 | "xfirgH86": "RaidName", 289 | "7DTnc2Lt": "RaidImage", 290 | "j93tApg0": "RaidStart", 291 | "d7SKE3yo": "RaidEnd", 292 | "R01Wz7fe": "RaidLevel", 293 | "TI6deE8P": "ArenaOpponents", 294 | "CLg9j1sh": "ArenaRankingOpponents", 295 | "k9pWH78Z": "ArenaReward", 296 | "u3bysZ8S": "DateStart", 297 | "2twsMyD6": "DateEnd", 298 | "kaR12y9r": "Expires", 299 | "ja07xgLF": "ScenarioId", 300 | "cb3WmiD0": "Lapis", 301 | "tL6G9egd": "ItemId", 302 | "Qy5EvcK1": "ItemCount", 303 | "2fY1IomW": "MissionWaveId", 304 | "0b6e9cwr": "FriendIdUniqueUnitIdList", 305 | "0j67QHm1": "FriendIdOnCooldown", 306 | "fP8Nv0KZ": "RbEnemyId", 307 | "Jc4udh7x": "RbEnemyUnitList", 308 | "td06MKEX": "NoticeId", 309 | "5GNraZM0": "NoticeType", 310 | "oIra47LK": "NoticeRead", 311 | "42B7MGIU": "EventSubId", 312 | "pvS5A4kE": "EventId", 313 | "89EvGKHx": "EventType", 314 | "6uIYE15X": "ObjectId", 315 | "86JmXL41": "EventBonusUnitId", 316 | "1G6xjYvf": "EventBonutType", 317 | "EzXXHtTY": "BundleId", 318 | "3GtkuMJ1": "BundleTitle", 319 | "70oO1OaR": "BundleDesc", 320 | "cSUSxGZA": "BundleImage1", 321 | "MfynwFte": "BundleImage2", 322 | "hJs2B3X5": "BundleImage1Copy", 323 | "pRYHbNN5": "BundleCostType", 324 | "AOHRcCC2": "BundleCost", 325 | "4FF0gz8P": "BundleItemId", 326 | "YWF08vZS": "BundleItemType", 327 | "ynP26rjD": "MailId", 328 | "fbcj5Aq9": "MailTitle", 329 | "9m5yIkCK": "MailType", 330 | "7iJpH5zZ": "MailItems", 331 | "14Y7jihw": "MailStatus", 332 | "f5LHNT4v": "MailRecievedData", 333 | 334 | "Simv74We": "BeastMix", 335 | "Euv8cncS": "Facebook", 336 | "H6o3079i": "HomeMarqueeQuality", 337 | "yJjS7dKX": "HomeMarqueeLocale", 338 | "2aciVI9Y": "ItemBuy", 339 | "2tHu3Chy": "ItemSell", 340 | "rStH7od8": "MailReceipt", 341 | "jQsE54Iz": "Mission", 342 | "2urzfX6d": "MissionEndChallenge", 343 | "L4i4418y": "MissionEndContinue", 344 | "gM1w8m4y": "NoticeUpdate", 345 | "9Zok3IK2": "RmDungeon", 346 | "3uy7DzGB": "RoutineRaidMenuUpdate", 347 | "JcxS6A8N": "TownInfo", 348 | "67l03PW2": "Expedition", 349 | "Ko86047K": "ExpeditionId", 350 | "k60s8T42": "ExpeditionRewardId", 351 | "p1H8307H": "ExpeditionRelic", 352 | "23tA3948": "ExpeditionRewardItem", 353 | "O7s2496M": "ExpeditionRewardClaimed", 354 | "7mA422N6": "ExpeditionUnits", 355 | "sO308L0M": "ExpeditionBonus", 356 | "CN92arJK": "PartySelect", 357 | "Kgvo5JL2": "CurrentParty", 358 | "MBIYc89Q": "CompanionParty", 359 | "Isc1ga3G": "ColosseumParty", 360 | "igrz05CY": "ArenaParty", 361 | "XZ4Kh7Ic": "EsperParty", 362 | 363 | "52KBR9qV": "EquipmentRarity", 364 | "znGsI4f8": "EquipmentSlotId", 365 | "8DZGF4Nn": "EquipmentTypeId", 366 | "t5Q4wZ7v": "EquipmentRequirement", 367 | "SxREt1M0": "EquipmentStatusInflict", 368 | "Jn6BbR2P": "EquipmentElementInflict", 369 | "t42Xb3jV": "EquipmentPassiveAbility", 370 | "GiBvPK84": "EquipmentActiveAbility", 371 | 372 | "9J6uRe8f": "ItemStack", 373 | "0HUPxDf1": "ItemIdClone", 374 | "E61qF5Lp": "ItemBuyPrice", 375 | "bz6RS3pI": "ItemSellPrice", 376 | "SJ56uhz2": "SublimationId", 377 | "HS7V6Ww1": "SublimationItems", 378 | "25oxcKwN": "SublimationUnitId", 379 | "KCk8u0am": "ClassUpItems", 380 | "A90DrNfp": "LBExperience" 381 | } -------------------------------------------------------------------------------- /DataExtractor/files.json: -------------------------------------------------------------------------------- 1 | {"F_EXCHANGE_SHOP_ITEM_MST": {"Name": "5hYf3xv1", "Key": "sg3fXED8"}, "F_TEXT_JOB_NAME": {"Name": "yUkwbFyc", "Key": "R6mBb3T3"}, "F_BEAST_CP_MST": {"Name": "dzA5MC6f", "Key": "Syax34vR"}, "F_SEASON_EVENT_ABILITY_TYPE_MST": {"Name": "I0SUr3WY", "Key": "XY2MA1x3"}, "F_UNIT_EXP_PATTERN_MST": {"Name": "kMnY10ry", "Key": "B38YWDtF"}, "F_TEXT_DIAMOND_NAME": {"Name": "mcQeT7mq", "Key": "tN7Gjdpv"}, "F_UNIT_SERIES_LV_ACQUIRE_MST": {"Name": "Eb5ewi87", "Key": "t8QV2WvE"}, "F_PICTURE_STORY_MST": {"Name": "PSDIR8b1", "Key": "SDV4mZL0"}, "F_STORY_MST": {"Name": "IiVw7H6k", "Key": "Cf2WZ8qA"}, "F_TRIBE_MST": {"Name": "3Lc1DWQV", "Key": "adj41LQC"}, "F_STORE_ITEM_MST": {"Name": "03cY9vXe", "Key": "d60DCUMp"}, "F_STORY_EVENT_MST": {"Name": "YW9MUm2H", "Key": "LyjM2nU9"}, "F_TOWN_MST": {"Name": "6P9XZ7ts", "Key": "IavY38oB"}, "F_MAP_EXT_RESOURCE_MST": {"Name": "En90A5BC", "Key": "9dA6bguS"}, "F_MISSION_MST": {"Name": "24Eka6wL", "Key": "naJ3P84b"}, "F_TEXT_BEAST_NAME": {"Name": "148O76GI", "Key": "pzLuYoDO"}, "F_TEXT_RECIPE_BOOK_NAME": {"Name": "tFnHkR8G", "Key": "lEWsm9iI"}, "F_BATTLE_SCRIPT_MST": {"Name": "dhR7sSxt", "Key": "QuxKHQQT"}, "F_TEXT_DAILY_QUEST_DES": {"Name": "W4525rcx", "Key": "1ihwWs7f"}, "F_RESOURCE_MAP_VERSION_MST_LOCALIZE": {"Name": "YIgCpDKW", "Key": "geHlpoos"}, "F_TOWN_EXPLAIN_MST": {"Name": "QJF37LcR", "Key": "1ThX6WNZ"}, "F_TEXT_ITEM_EQUIP_NAME": {"Name": "E0NdslwL", "Key": "SGMI0nIq"}, "F_RB_LS_MST": {"Name": "8tR1K79p", "Key": "2nJN19qh"}, "F_TROPHY_MST": {"Name": "9ZN4Eo1m", "Key": "5qRZs6Kz"}, "F_TEXT_UNIT_EVO": {"Name": "7tfppWVS", "Key": "OYQn68Hu"}, "F_RB_AI_PATTERN_MST": {"Name": "A6DJx0Qj", "Key": "2phgAJt3"}, "F_CHARACTER_MST": {"Name": "cf29diuR", "Key": "ru39Q4YK"}, "F_TEXT_TROPHY_EXPLAIN": {"Name": "pNeHXqpJ", "Key": "OJV9Jpm8"}, "F_LIMITBURST_LV_MST": {"Name": "0EvyjKh8", "Key": "g2hZpVW7"}, "F_GIFT_MST": {"Name": "AK5v1YEd", "Key": "1cJ4IuP9"}, "F_MONSTER_SKILL_SET_MST": {"Name": "B9K8ULHc", "Key": "p6iXmLh4"}, "F_AWARD_EXPLAIN_MST": {"Name": "B2mKN0M4", "Key": "0FfIgG67"}, "F_RECIPE_BOOK_MST": {"Name": "yu5rvEI3", "Key": "3t8DMRQE"}, "F_MATERIA_MST": {"Name": "Af46DrVW", "Key": "4MbdRZI6"}, "F_AWARD_TYPE_MST": {"Name": "jsX49HtE", "Key": "t3IEWke8"}, "F_TEXT_TOWN_STORE_OWNER_NAME": {"Name": "KFL34pbm", "Key": "Q9HMWNZG"}, "F_ITEM_EXT_BEAST_MST": {"Name": "hc8Ham29", "Key": "wZ5IkW2f"}, "F_ENCOUNT_FIELD_MST": {"Name": "2Jtkc4Ar", "Key": "mhok0p7B"}, "F_AI_MST": {"Name": "PCm9K3no", "Key": "yFr6Kj3P"}, "F_TEXT_UNIT_FUSION": {"Name": "TpbDECdR", "Key": "v47OlIK4"}, "F_TEXT_ITEM_EXPLAIN_SHORT": {"Name": "IAPS1jOu", "Key": "TZh30bbo"}, "F_TEXT_QUEST_SUB_TARGET_PARAM": {"Name": "Cw3B65ql", "Key": "W4rz5Sas"}, "F_SWITCH_MST": {"Name": "T46RpNZH", "Key": "AUx51pni"}, "F_RESOURCE_VERSION_MST_LOCALIZE": {"Name": "A1L1GlaQ", "Key": "JchlFPWK"}, "F_SOUND_MST": {"Name": "9bnqECY6", "Key": "m2zHEtV0"}, "F_JOB_MST": {"Name": "F2mQ87Wt", "Key": "3CVoZu7s"}, "F_TEXT_SEASON_EVENT_ABILITY_TYPE_NAME": {"Name": "xT67VZAS", "Key": "jFgn6bIU"}, "F_TICKET_MST": {"Name": "95KFiNTM", "Key": "0sDdWku8"}, "F_TEXT_MATERIA_NAME": {"Name": "2Eg5s20D", "Key": "E5jbLGyb"}, "F_TEXT_DUNGEON_NAME": {"Name": "AyVqkz2B", "Key": "0cqVvd61"}, "F_TEXT_ARCHIVE_NAME": {"Name": "QR3zeiJr", "Key": "CrZmyr8k"}, "F_TEXT_QUEST_SUB_STORY": {"Name": "fULaqIeB", "Key": "CueuZNTN"}, "F_TROPHY_METER_SERIF_MST": {"Name": "4Qz7qK51", "Key": "SGjk89Tr"}, "F_TEXT_UNIT_EXPLAIN_SHOP": {"Name": "3uEWl5CV", "Key": "QrOn67A8"}, "F_BEAST_EXP_PATTERN_MST": {"Name": "42JaImDh", "Key": "UY7D3dpn"}, "F_GACHA_EFFECT_BLOCK_MST": {"Name": "fDI1T97q", "Key": "7H3P6zF4"}, "F_RB_ABILITY_GROUP_MST": {"Name": "UHk7x2V8", "Key": "Q83j0GvZ"}, "F_UNIT_EXPLAIN_MST": {"Name": "Da62x85q", "Key": "zU6L4Gng"}, "F_MAP_EVENT_MST": {"Name": "91vNbdxg", "Key": "1YAk2fcr"}, "F_TEXT_STORY_NAME": {"Name": "fKGHnuPm", "Key": "nJswCIXz"}, "F_WORLD_MST": {"Name": "JLxQW68j", "Key": "t8bWUq9Z"}, "F_IMPORTANT_ITEM_EXPLAIN_MST": {"Name": "Nny6xD90", "Key": "89fcSX4v"}, "F_EFFECT_GROUP_MST": {"Name": "ZM06fUem", "Key": "4WipzuH2"}, "F_TEXT_UNITS_NAME": {"Name": "sZE3Lhgj", "Key": "3IfWAnJ3"}, "F_LAND_MST": {"Name": "23yVcGpH", "Key": "Y9wKxzI0"}, "F_QUEST_SUB_MST": {"Name": "myGc0U5v", "Key": "oWcL37sK"}, "F_TEXT_WORLD_NAME": {"Name": "GPNXLUJP", "Key": "uDFuhlR6"}, "F_TEXT_GACHA": {"Name": "ZJz5QwAy", "Key": "Ab2Kb6yJ"}, "F_BATTLE_BG_MST": {"Name": "bqR4p8SN", "Key": "39mEiDNB"}, "F_TEXT_TEXT_EN": {"Name": "0ThfQQWd", "Key": "s9E34w78"}, "F_DIAMOND_MST": {"Name": "mo47BaST", "Key": "p9sk1MjH"}, "F_TROPHY_EXPLAIN_MST": {"Name": "yhnT19Z4", "Key": "JPTK6q4V"}, "F_TEXT_SEASON_EVENT_ABILITY_TYPE_DESCRIPTION": {"Name": null, "Key": null}, "F_TEXT_NPC_NAME": {"Name": "A55coosK", "Key": "xQj2cuc8"}, "F_URL_MST": {"Name": "9wmd4iua", "Key": "UREmi85S"}, "F_TEXT_MATERIA_EXPLAIN_LONG": {"Name": "QEbXmDTD", "Key": "3ZaDmbq1"}, "F_BEAST_SKILL_MST": {"Name": "zE1hx53P", "Key": "Y4Fds1Jr"}, "F_DUNGEON_MST": {"Name": "1Bj4oy5Q", "Key": "9bEA2SYP"}, "F_TEXT_IMPORTANT_ITEM_EXPLAIN_LONG": {"Name": "aJ4tvgSq", "Key": "iElLxksB"}, "F_TEXT_BEAST_SKILL_NAME": {"Name": "k51drhZ6", "Key": "JHJRAcEx"}, "F_TEXT_MISSION": {"Name": "pa6vblsG", "Key": "GdAhtrNB"}, "F_TEXT_ABILITY_EXPLAIN_LONG": {"Name": "uxMPAs4y", "Key": "lECkWwBw"}, "F_MAP_OBJECT_MST": {"Name": "7d25gta1", "Key": "1zYSh5ps"}, "F_TEXT_MONSTER_DICTIONARY_NAME": {"Name": "F1VQsGpG", "Key": "uEOGF11w"}, "F_AREA_MST": {"Name": "Fvix6V0n", "Key": "pR2DHS6i"}, "F_TEAM_LV_MST": {"Name": "NCPTw2p0", "Key": "qP7TGZE8"}, "F_TOWN_STORE_COMMENT_MST": {"Name": "ASh8IH0b", "Key": "1L7oneM4"}, "F_BEAST_GROW_MST": {"Name": "tSb4Y8QR", "Key": "7YUDsew3"}, "F_TEXT_SEASON_EVENT_ABILITY_NAME": {"Name": "q81b55dv", "Key": "E6Jrump4"}, "F_TEXT_ANALYTICS_LOCALIZE": {"Name": "3sI39BAT", "Key": "6zAQarn1"}, "F_BEAST_STATUS_MST": {"Name": "tWp7f5Ma", "Key": "XuWn97Hf"}, "F_TEXT_ANALYTICS_ITEMS": {"Name": "8e6PGb3p", "Key": "7nyO4pC9"}, "F_TEXT_TRIBE": {"Name": "Z6OfsPv9", "Key": "FAfGhIMo"}, "F_BEAST_MST": {"Name": "WF57bvfG", "Key": "hdFeT14k"}, "F_TEXT_SHOP": {"Name": "NYz5Oxm4", "Key": "yBd5wOHp"}, "F_TEXT_MAP_OBJECT": {"Name": "15KaBQci", "Key": "U56G5oiU"}, "F_RB_TRADE_BOARD_PIECE_MST": {"Name": "7Si5wPLj", "Key": "fXZse89L"}, "F_MAP_ROUTE_MST": {"Name": "F1a5PZYq", "Key": "rASW8N5L"}, "F_TEXT_AREA_NAME": {"Name": "4qiOcmtJ", "Key": "FhWJxFlW"}, "F_AWARD_MST": {"Name": "xH4WGNk8", "Key": "HZgmc2u9"}, "F_TEXT_RB_BONUS_RULE_NAME": {"Name": "6YYynT87", "Key": "YC0psthA"}, "F_IMPORTANT_ITEM_MST": {"Name": "vdeSoq61", "Key": "tnNGLk45"}, "F_TEXT_TOWN_EXPLAIN": {"Name": "KLoYS0Tj", "Key": "0BZOtiRB"}, "F_ARCHIVE_MST": {"Name": "Wmd5K32b", "Key": "t3T1hELp"}, "F_TEXT_AWARD_EXPLAIN": {"Name": "TlrlvFx5", "Key": "XfXmnCNF"}, "F_TEXT_IMPORTANT_ITEM_NAME": {"Name": "TIKwbf3D", "Key": "lx4HCdrQ"}, "F_EQUIP_ITEM_MST": {"Name": "S67QEJsz", "Key": "T1kP80NU"}, "F_TEXT_SEASON_EVENT_DESCRIPTION": {"Name": "mKbhB8ai", "Key": "Kt30PvJg"}, "F_TEXT_UNIT_AFFINITY": {"Name": "Zfw0jmyn", "Key": "xCppLKwD"}, "F_STORY_SUB_MST": {"Name": "8vneWT7G", "Key": "8ci0TamY"}, "F_RECIPE_MST": {"Name": "27pGMZDm", "Key": "JveAwh98"}, "F_TEXT_ITEM_EQUIP_LONG": {"Name": "CD4giPVu", "Key": "jqe9yQm0"}, "F_TEXT_ITEM_EQUIP_SHORT": {"Name": "Nao9HYWk", "Key": "I0l1uc2s"}, "F_RB_TRADE_BOARD_MST": {"Name": "yiuv0Fb9", "Key": "cbqYR3s7"}, "F_RB_FORBIDDEN_INFO_MST": {"Name": "x6iQrD2e", "Key": "8yWH5IGC"}, "F_TEXT_GAME_TITLE_NAME": {"Name": "3CzC5zn7", "Key": "SA6Bv7i1"}, "F_RB_LS_REWARD_MST": {"Name": "0Nc4PkAJ", "Key": "m7XJdkp1"}, "F_DEFINE_MST": {"Name": "zg5P1AxM", "Key": "Zib6m5ed"}, "F_TEXT_RB_ABILITY_GROUP_NAME": {"Name": "69zUY4Zb", "Key": "qEAmEfJU"}, "F_TEXT_MAGIC_EXPLAIN_SHORT": {"Name": "Hs9KVVnj", "Key": "raokY9Xl"}, "F_UNIT_MST": {"Name": "SsidX62G", "Key": "UW0D8ouL"}, "F_TEXT_QUEST_SUB_NAME": {"Name": "uuU68I2u", "Key": "cnW2w71S"}, "F_TEXT_TROPHY_METER_SERIF": {"Name": "7BfBBf9E", "Key": "S410iF8y"}, "F_LIMITBURST_MST": {"Name": "c5T4PIyL", "Key": "6q3eIR9k"}, "F_GAME_TITLE_MST": {"Name": "91D3CfxA", "Key": "yFZs58K7"}, "F_NPC_MST": {"Name": "94diC1bt", "Key": "fvQ37cE0"}, "F_TEXT_MAGIC_NAME": {"Name": "1ZqISaBp", "Key": "9TAwFj0e"}, "F_TEXT_SUBLIMATION_EXPLAIN": {"Name": "JF89DHPE", "Key": "SkUNQP6F"}, "F_TEXT_TICKER": {"Name": "RUPcXt7J", "Key": "tHaAyyqI"}, "F_CLSM_GRADE_MST": {"Name": "q14CSpIb", "Key": "sn8QPJ24"}, "F_ITEM_MST": {"Name": "1CUX0Qwr", "Key": "L3f8nko1"}, "F_TEXT_ITEM_NAME": {"Name": "VhkhtvDn", "Key": "xDkegMbe"}, "F_SWITCH_TYPE_MST": {"Name": "PJw28YRg", "Key": "5NUkhS4Q"}, "F_TEXT_ITEM_EXPLAIN_LONG": {"Name": "9NCIDltW", "Key": "s3fVSywt"}, "F_STRONGBOX_MST": {"Name": "X1xsdRk7", "Key": "qPpXT0Z2"}, "F_ITEM_EXPLAIN_MST": {"Name": "E7YMdK3P", "Key": "TERM4PD7"}, "F_UNIT_CLASS_UP_MST": {"Name": "60FtuAhp", "Key": "pjW5TI0K"}, "F_TEXT_AWARD_NAME": {"Name": "mGPBqPdv", "Key": "G9IOqfaz"}, "F_TEXT_PICTURE_STORY_NAME": {"Name": "j525zYCH", "Key": "Pe21ACFe"}, "F_MONSTER_DICTIONARY_MST": {"Name": "1r6jb9wB", "Key": "wL4N16V3"}, "F_TEXT_DAILY_QUEST_NAME": {"Name": "FBBD8vv6", "Key": "BhDl8FWG"}, "F_CLSM_PROGRESS_MST": {"Name": "pF3JiA6L", "Key": "h8Za6TiL"}, "F_TEXT_TELEPO_NAME": {"Name": "ca5XNnWD", "Key": "WfvQbAKG"}, "F_TOWN_STORE_MST": {"Name": "v34C8PdG", "Key": "Si9bxe86"}, "F_TEXT_TOWN_STORE": {"Name": "h23JuUGF", "Key": "Jovaw62m"}, "F_LOGIN_BONUS_TOTAL_REWARD_MST": {"Name": "J6dVmNv5", "Key": "y57ZhtLI"}, "F_TELEPO_MST": {"Name": "zw0kb3To", "Key": "KENf4db1"}, "F_EQUIP_ITEM_EXPLAIN_MST": {"Name": "psuJ5VE2", "Key": "r6PSK8QW"}, "F_CRAFT_EXT_MST": {"Name": "1GPYxQR3", "Key": "eHn8EU5o"}, "F_RB_BONUS_RULE_MST": {"Name": "09u3Nzk2", "Key": "7Hm6jxe3"}, "F_TICKER_MST": {"Name": "5WJ9MQ3n", "Key": "h92Fk0Qw"}, "F_TEXT_RB_ABILITY_GROUP_DESCRIPTION": {"Name": "3sxyv1w9", "Key": "v30p83B2"}, "F_BEAST_BOARD_PIECE_MST": {"Name": "E9z2e4UZ", "Key": "XvkVU34H"}, "F_TEXT_IMPORTANT_ITEM_EXPLAIN_SHORT": {"Name": "YBqAUJt1", "Key": "Fc6H1Udw"}, "F_MATERIA_LIMIT_MST": {"Name": "BX0pRc8A", "Key": "CVERk9KN"}, "F_TEXT_UNIT_DESCRIPTION": {"Name": "w6U2ntyZ", "Key": "VNh3r92R"}, "F_BANNER_MST": {"Name": "oB0YVw67", "Key": "C6ci5pfG"}, "F_ICON_MST": {"Name": "LM1APs6u", "Key": "8XT23CYy"}, "F_TEXT_RB_FORBIDDEN_INFO_NAME": {"Name": "DaNvFWp7", "Key": "wxea5c0t"}, "F_RB_SS_MST": {"Name": "gd74jWQn", "Key": "gY7NiJL8"}, "F_BEAST_EXPLAIN_MST": {"Name": "J3BkY7wT", "Key": "jw0X2ZNm"}, "F_TEXT_MONSTER_DIC_EXPLAIN_SHORT": {"Name": "zf7USTwU", "Key": "OJir9FR5"}, "F_FUNCTION_MST": {"Name": "6wibj9m8", "Key": "sy6GRuY2"}, "F_EFFECT_MST": {"Name": "HfRPdg65", "Key": "d4KR8YSq"}, "F_TEXT_MONSTER_NAME": {"Name": "0xkPiwVI", "Key": "UOz3hI2k"}, "F_TEXT_ABILITY_NAME": {"Name": "eSB5Ry3E", "Key": "At4ghcWo"}, "F_LEARNING_MST": {"Name": "DLVF0cN1", "Key": "4HCdYk80"}, "F_MONSTER_SKILL_MST": {"Name": "wJE09yxD", "Key": "D6cJZb89"}, "F_TEXT_CHARACTER_NAME": {"Name": "JIqrNzje", "Key": "iizk8FjI"}, "F_TEXT_MAGIC_EXPLAIN_LONG": {"Name": "Jcavjyxo", "Key": "ZFHehCN4"}, "F_ABILITY_EXPLAIN_MST": {"Name": "7FGj2bCh", "Key": "B2Ka3kft"}, "F_RB_SS_REWARD_MST": {"Name": "cg5k2Mxn", "Key": "KNWf37Bm"}, "F_TEXT_MONSTER_SKILL_NAME": {"Name": "F1z92dkt", "Key": "B41kLp2C"}, "F_TEXT_MONSTER_PART_DIC_NAME": {"Name": "P4c5fq2t", "Key": "XhCacZZv"}, "F_TEXT_UNIT_SUMMON": {"Name": "hWE8dJMC", "Key": "GInxSlTN"}, "F_SEASON_EVENT_ABILITY_MST": {"Name": "VMIe9c6U", "Key": "Na71Z6kg"}, "F_UNIT_GROW_MST": {"Name": "i3YrEM1t", "Key": "6cUguh10"}, "F_ABILITY_MST": {"Name": "TK61DudV", "Key": "4sPQ8aXo"}, "F_TEXT_EXCHANGE_SHOP_ITEM": {"Name": "r1ZLxyyg", "Key": "fT1SbKUm"}, "F_SEASON_EVENT_GROUP_FRIEND_LV_MST": {"Name": "v5aCt9ne", "Key": "g7VmK5a9"}, "F_TEXT_MATERIA_EXPLAIN_SHORT": {"Name": "8g18k8jD", "Key": "DvdwoXYQ"}, "F_TEXT_RB_FORBIDDEN_INFO_DESCRIPTION": {"Name": "M6bRb5Eg", "Key": "ScqX2kIE"}, "F_TEXT_ABILITY_PARAM_MSG": {"Name": "3oM745kA", "Key": "OTxnCDr7"}, "F_SUBLIMATION_RECIPE_MST": {"Name": "M9K0SJgR", "Key": "vnkfer76"}, "F_TEXT_LIMIT_BURST_DES": {"Name": "EUsG7rlQ", "Key": "ZcXYp8BI"}, "F_QUEST_MST": {"Name": "2Px75LpY", "Key": "20mEeKo3"}, "F_SHOP_MST": {"Name": "1ks9q4Pj", "Key": "X0FA6Ewh"}, "F_TEXT_QUEST_SUB_DETAIL": {"Name": "vb5Nom5d", "Key": "sCFyRxng"}, "F_CLSM_ROUND_MST": {"Name": "7zEc85n1", "Key": "V4wZA7Hn"}, "F_RESOURCE_MST": {"Name": "ZQqB38Ns", "Key": "u6q3F02d"}, "F_RB_DEFINE_MST": {"Name": "qzTG4ba0", "Key": "2y1oT5gq"}, "F_MONSTER_DICTIONARY_EXPLAIN_MST": {"Name": "Svq1K0rh", "Key": "wA4Dxp1m"}, "F_TROPHY_REWARD_MST": {"Name": "GN1bMQm3", "Key": "KyAC0q3D"}, "F_TEXT_ABILITY_EXPLAIN_SHORT": {"Name": "8GJBzdQV", "Key": "D9UVupRQ"}, "F_LOGIN_BONUS_MST": {"Name": "P3raZX89", "Key": "8xQP3fUZ"}, "F_TEXT_STORY_SUB": {"Name": "hiiVWxXJ", "Key": "ucOQs1YO"}, "F_MEDAL_EXCHANGE_MST": {"Name": "", "Key": "7FmTj0hp"}, "F_TEXT_IMPORTANT_ITEM_SHOP": {"Name": "JO7UqqJ6", "Key": "EzACmD0Y"}, "F_BEAST_BOARD_PIECE_EXT_MST": {"Name": "5o0Z6Gwn", "Key": "Knh15FzM"}, "F_CLSM_RANK_MST": {"Name": "W2f5GThw", "Key": "jtbur0h5"}, "F_TEXT_DAILY_QUEST_DETAIL": {"Name": "gCfFcx75", "Key": "xpLyjA9A"}, "F_TEXT_SEASON_EVENT_NAME": {"Name": "FxaCYmHE", "Key": "NwKi0CpP"}, "F_RESOURCE_MAP_MST": {"Name": "B7LnP2TH", "Key": "U0Vd7AfQ"}, "F_TEXT_MONSTER_SKILL_SET_NAME": {"Name": "76oKZdNU", "Key": "mOz786Zr"}, "F_TEXT_CAPTURE_INFO": {"Name": "Ir2B1EBL", "Key": "Ak7An4Ys"}, "F_TEXT_LAND_NAME": {"Name": "sKLZVYWQ", "Key": "yYnTSUtm"}, "F_TEXT_SCENARIO_BATTLE": {"Name": "TGxop4tW", "Key": "ZCIcuxf3"}, "F_TEXT_AWARD_TYPE": {"Name": "soohaWOo", "Key": "b23aWS6d"}, "F_TEXT_QUEST": {"Name": "NMwfx1lf", "Key": "KVBowHC2"}, "F_TEXT_MONSTER_DIC_EXPLAIN_LONG": {"Name": "xe6RH45K", "Key": "p9l4ys4L"}, "F_CAPTURE_MST": {"Name": "65fHqgnT", "Key": "w1A9S5sr"}, "F_TEXT_TOWN_STORE_COMMENT": {"Name": "SZXTrTgq", "Key": "oVpBUtX2"}, "F_MAGIC_EXPLAIN_MST": {"Name": "8qbVQUx5", "Key": "8LE2hk3r"}, "F_CHALLENGE_MST": {"Name": "GL9t6cMF", "Key": "8Dx2QUZS"}, "F_TEXT_LIMIT_BURST_NAME": {"Name": "XBS8hLZD", "Key": "zswbSb5U"}, "F_TEXT_COLOSSEUM_GRADE": {"Name": "Y2rngIF3", "Key": "7Vzk5Oq9"}, "F_TEXT_TOWN_NAME": {"Name": "N12vEZpN", "Key": "11yq2cUt"}, "F_TEXT_COLOSSEUM_MONSTER_GROUP_NAME": {"Name": "q4z5D08C", "Key": "04zFXazI"}, "F_TEXT_RB_BONUS_RULE_DESCRIPTION": {"Name": "10Ew2Rth", "Key": "AGItS6CC"}, "F_MAGIC_MST": {"Name": "6J8jwSDW", "Key": "2zyP4WQY"}, "F_GACHA_EFFECT_PATTERN_MST": {"Name": "uw07SXpU", "Key": "48HhnaKP"}, "F_RULE_MST": {"Name": "7s4egUBN", "Key": "sf2o1jWL"}, "F_TEXT_CHALLENGE_NAME": {"Name": "4bQbA2FH", "Key": "SFaS7rXZ"}, "F_MATERIA_EXPLAIN_MST": {"Name": "bW2GHT1N", "Key": "7mof2RVP"}, "F_FOOTPRINT_MST": {"Name": "q3jTCo8m", "Key": "iI7aS2oq"}, "F_TEXT_BEAST_SKILL_DES": {"Name": "Yjq14lAB", "Key": "g5SJviEC"}, "F_PURCHASE_AGE_LIMIT_MST": {"Name": "okUH6yV7", "Key": "ZDvrb16x"}} -------------------------------------------------------------------------------- /DataExtractor/network.json: -------------------------------------------------------------------------------- 1 | { 2 | "PurchaseSettlement": { 3 | "Url": "yt82BRwk", 4 | "EncodeKey": "jmh7xID8", 5 | "RequestID": "JsFd4b7j" 6 | }, 7 | "RbMatching": { 8 | "Url": "mn5cHaJ0", 9 | "EncodeKey": "4GSMn0qb", 10 | "RequestID": "DgG4Cy0F" 11 | }, 12 | "RmDungeonStart": { 13 | "Url": "NC8Ie07P", 14 | "EncodeKey": "A7V1zkyc", 15 | "RequestID": "R5mWbQ3M" 16 | }, 17 | "RmEnd": { 18 | "Url": "I9p3n48A", 19 | "EncodeKey": "FX5L3Sfv", 20 | "RequestID": "fyp10Rrc" 21 | }, 22 | "FacebookRewardClaim": { 23 | "Url": "47R9pLGq", 24 | "EncodeKey": "Rja82ZUK", 25 | "RequestID": "47R9pLGq" 26 | }, 27 | "FriendDelete": { 28 | "Url": "8R4fQbYh", 29 | "EncodeKey": "d0VP5ia6", 30 | "RequestID": "a2d6omAy" 31 | }, 32 | "UpdateSwitchInfo": { 33 | "Url": "SqoB3a1T", 34 | "EncodeKey": "4Z5UNaIW", 35 | "RequestID": "mRPo5n2j" 36 | }, 37 | "VariableStoreCheck": { 38 | "Url": "Nhn93ukW", 39 | "EncodeKey": "Hi0FJU3c", 40 | "RequestID": "i0woEP4B" 41 | }, 42 | "CraftStart": { 43 | "Url": "w71MZ0Gg", 44 | "EncodeKey": "K92H8wkY", 45 | "RequestID": "Gr9zxXk5" 46 | }, 47 | "SearchGetItemInfo": { 48 | "Url": "e4Gjkf0x", 49 | "EncodeKey": "vK2V8mZM", 50 | "RequestID": "0D9mpGUR" 51 | }, 52 | "SublimationSkill": { 53 | "Url": "xG3jBbw5", 54 | "EncodeKey": "97Uvrdz3", 55 | "RequestID": "s48Qzvhd" 56 | }, 57 | "TownIn": { 58 | "Url": "isHfQm09", 59 | "EncodeKey": "JI8zU5rC", 60 | "RequestID": "8EYGrg76" 61 | }, 62 | "MissionBreak": { 63 | "Url": "P4oIeVf0", 64 | "EncodeKey": "Z2oPiE6p", 65 | "RequestID": "17LFJD0b" 66 | }, 67 | "BeastMix": { 68 | "Url": "7vHqNPF0", 69 | "EncodeKey": "WfNSmy98", 70 | "RequestID": "C8X1KUpV" 71 | }, 72 | "LoginBonus": { 73 | "Url": "iP9ogKy6", 74 | "EncodeKey": "Vi6vd9zG", 75 | "RequestID": "vw9RP3i4" 76 | }, 77 | "Initialize": { 78 | "Url": "fSG1eXI9", 79 | "EncodeKey": "rVG09Xnt", 80 | "RequestID": "75fYdNxq" 81 | }, 82 | "DmgRankEnd": { 83 | "Url": "zd5KJ3jn", 84 | "EncodeKey": "7pGj8hSW", 85 | "RequestID": "s98cw1WA" 86 | }, 87 | "GameSetting": { 88 | "Url": "OTX6Fmvu", 89 | "EncodeKey": "4foXVwWd", 90 | "RequestID": "OTX6Fmvu" 91 | }, 92 | "GetUserInfo": { 93 | "Url": "u7sHDCg4", 94 | "EncodeKey": "rcsq2eG7", 95 | "RequestID": "X07iYtp5" 96 | }, 97 | "NoticeUpdate": { 98 | "Url": "TqtzK84R", 99 | "EncodeKey": "9t68YyjT", 100 | "RequestID": "CQ4jTm2F" 101 | }, 102 | "sgExpdAccelerate": { 103 | "Url": "Ik142Ff6", 104 | "EncodeKey": "d3D4l8b4", 105 | "RequestID": "Ik142Ff6" 106 | }, 107 | "TownOut": { 108 | "Url": "0EF3JPjL", 109 | "EncodeKey": "Kc2PXd9D", 110 | "RequestID": "sJcMPy04" 111 | }, 112 | "BeastBoardPieceOpen": { 113 | "Url": "Y2Zvnad9", 114 | "EncodeKey": "7uxYTm3k", 115 | "RequestID": "0gk3Tfbz" 116 | }, 117 | "NoticeReadUpdate": { 118 | "Url": "j6kSWR3q", 119 | "EncodeKey": "iLdaq6j2", 120 | "RequestID": "pC3a2JWU" 121 | }, 122 | "MissionWaveStart": { 123 | "Url": "Mn15zmDZ", 124 | "EncodeKey": "d2mqJ6pT", 125 | "RequestID": "BSq28mwY" 126 | }, 127 | "MissionContinue": { 128 | "Url": "ZzCXI6E7", 129 | "EncodeKey": "34n2iv7z", 130 | "RequestID": "LuCN4tU5" 131 | }, 132 | "RoutineGachaUpdate": { 133 | "Url": "qS0YW57G", 134 | "EncodeKey": "Q6ZGJj0h", 135 | "RequestID": "t60dQP49" 136 | }, 137 | "ExchangeShop": { 138 | "Url": "1bf0HF4w", 139 | "EncodeKey": "qoRP87Fw", 140 | "RequestID": "I7fmVX3R" 141 | }, 142 | "GiftUpdate": { 143 | "Url": "noN8I0UK", 144 | "EncodeKey": "xLEtf78b", 145 | "RequestID": "9KN5rcwj" 146 | }, 147 | "FriendSuggest": { 148 | "Url": "6TCn0BFh", 149 | "EncodeKey": "j2P3uqRC", 150 | "RequestID": "iAs67PhJ" 151 | }, 152 | "RoutineWorldUpdate": { 153 | "Url": "oR1psQ5B", 154 | "EncodeKey": "XDIL4E7j", 155 | "RequestID": "6H1R9WID" 156 | }, 157 | "UnitSell": { 158 | "Url": "0qmzs2gA", 159 | "EncodeKey": "DJ43wmds", 160 | "RequestID": "9itzg1jc" 161 | }, 162 | "StrongBoxOpen": { 163 | "Url": "48ktHf13", 164 | "EncodeKey": "sgc30nRh", 165 | "RequestID": "PIv7u8jU" 166 | }, 167 | "RbStart": { 168 | "Url": "dR20sWwE", 169 | "EncodeKey": "P1w8BKLI", 170 | "RequestID": "eHY7X8Nn" 171 | }, 172 | "ClsmStart": { 173 | "Url": "rncR9js8", 174 | "EncodeKey": "wdSs23yW", 175 | "RequestID": "4uCSA3ko" 176 | }, 177 | "GachaExe": { 178 | "Url": "oC30VTFp", 179 | "EncodeKey": "oaEJ9y1Z", 180 | "RequestID": "9fVIioy1" 181 | }, 182 | "sgExpdQuestStart": { 183 | "Url": "I8uq68c3", 184 | "EncodeKey": "60Os29Mg", 185 | "RequestID": "I8uq68c3" 186 | }, 187 | "MissionReStart": { 188 | "Url": "r5vfM1Y3", 189 | "EncodeKey": "Vw6bP0rN", 190 | "RequestID": "GfI4LaU3" 191 | }, 192 | "CraftExe": { 193 | "Url": "UyHLjV60", 194 | "EncodeKey": "ZbHEB15J", 195 | "RequestID": "PKDhIN34" 196 | }, 197 | "OptionUpdate": { 198 | "Url": "0Xh2ri5E", 199 | "EncodeKey": "B9mAa7rp", 200 | "RequestID": "otgXV79T" 201 | }, 202 | "RoutineRaidMenuUpdate": { 203 | "Url": "Sv85kcPQ", 204 | "EncodeKey": "z80swWd9", 205 | "RequestID": "g0BjrU5D" 206 | }, 207 | "Friend": { 208 | "Url": "8drhF2mG", 209 | "EncodeKey": "6WAkj0IH", 210 | "RequestID": "j0A5vQd8" 211 | }, 212 | "MedalExchange": { 213 | "Url": "0X8Fpjhb", 214 | "EncodeKey": "dCja1E54", 215 | "RequestID": "LiM9Had2" 216 | }, 217 | "RbBoardPieceOpen": { 218 | "Url": "iXKfI4v1", 219 | "EncodeKey": "g68FW4k1", 220 | "RequestID": "hqzU9Qc5" 221 | }, 222 | "RmRetire": { 223 | "Url": "fBn58ApV", 224 | "EncodeKey": "T4Undsr6", 225 | "RequestID": "e0R3iDm1" 226 | }, 227 | "FriendList": { 228 | "Url": "p3hwqW5U", 229 | "EncodeKey": "1iV2oN9r", 230 | "RequestID": "u7Id4bMg" 231 | }, 232 | "MailList": { 233 | "Url": "u3E8hpad", 234 | "EncodeKey": "7kgsrGQ1", 235 | "RequestID": "KQHpi0D7" 236 | }, 237 | "FriendRefuse": { 238 | "Url": "Vw0a4I3i", 239 | "EncodeKey": "RYdX9h2A", 240 | "RequestID": "1nbWRV9w" 241 | }, 242 | "RmRestart": { 243 | "Url": "NC8Ie07P", 244 | "EncodeKey": "R1VjnNx0", 245 | "RequestID": "yh21MTaG" 246 | }, 247 | "MissionEnd": { 248 | "Url": "0ydjM5sU", 249 | "EncodeKey": "1tg0Lsqj", 250 | "RequestID": "x5Unqg2d" 251 | }, 252 | "UpdateUserInfo": { 253 | "Url": "v3RD1CUB", 254 | "EncodeKey": "6v5ykfpr", 255 | "RequestID": "ey8mupb4" 256 | }, 257 | "RmStart": { 258 | "Url": "8BJSL7g0", 259 | "EncodeKey": "iu67waph", 260 | "RequestID": "7FyJS3Zn" 261 | }, 262 | "FacebookRewardList": { 263 | "Url": "8YZsGLED", 264 | "EncodeKey": "85YBRzZg", 265 | "RequestID": "8YZsGLED" 266 | }, 267 | "MissionUpdate": { 268 | "Url": "fRDUy3E2", 269 | "EncodeKey": "Nq9uKGP7", 270 | "RequestID": "j5JHKq6S" 271 | }, 272 | "sgExpdQuestRefresh": { 273 | "Url": "vTgYyHM6", 274 | "EncodeKey": "vceNlSf3gn", 275 | "RequestID": "vTgYyHM6lC" 276 | }, 277 | "CreateUser": { 278 | "Url": "0FK8NJRX", 279 | "EncodeKey": "73BUnZEr", 280 | "RequestID": "P6pTz4WA" 281 | }, 282 | "ClsmEnd": { 283 | "Url": "7vHqNPF0", 284 | "EncodeKey": "6aBHXGv4", 285 | "RequestID": "3zgbapQ7" 286 | }, 287 | "sgMissionUnlock": { 288 | "Url": "LJhqu0x6", 289 | "EncodeKey": "ZcBV06K4", 290 | "RequestID": "LJhqu0x6" 291 | }, 292 | "DailyQuestUpdate": { 293 | "Url": "QWDn5epF", 294 | "EncodeKey": "9QtGVCWg", 295 | "RequestID": "6QYd5Hym" 296 | }, 297 | "FacebookLogout": { 298 | "Url": "xHTo4BZp", 299 | "EncodeKey": "wwHxtAy6", 300 | "RequestID": "xHTo4BZp" 301 | }, 302 | "DailyQuestClaimReward": { 303 | "Url": "Br9PwJ6A", 304 | "EncodeKey": "jwYGF3sY", 305 | "RequestID": "Zy8fYJ5e" 306 | }, 307 | "RmEntry": { 308 | "Url": "fBn58ApV", 309 | "EncodeKey": "p2tqP7Ng", 310 | "RequestID": "wx5sg9ye" 311 | }, 312 | "TransferCodeCheck": { 313 | "Url": "C9LoeYJ8", 314 | "EncodeKey": "c5aNjK9J", 315 | "RequestID": "CY89mIdz" 316 | }, 317 | "CraftEnd": { 318 | "Url": "9G7Vc8Ny", 319 | "EncodeKey": "yD97t8kB", 320 | "RequestID": "WIuvh09n" 321 | }, 322 | "RoutineEventUpdate": { 323 | "Url": "WCK5tvr0", 324 | "EncodeKey": "V0TGwId5", 325 | "RequestID": "4kA1Ne05" 326 | }, 327 | "RmBreak": { 328 | "Url": "8BJSL7g0", 329 | "EncodeKey": "W3YTRI8e", 330 | "RequestID": "kWrXKC35" 331 | }, 332 | "MissionRetire": { 333 | "Url": "gbZ64SQ2", 334 | "EncodeKey": "oUh1grm8", 335 | "RequestID": "v51PM7wj" 336 | }, 337 | "FriendAgree": { 338 | "Url": "1DYp5Nqm", 339 | "EncodeKey": "9FjK0zM3", 340 | "RequestID": "kx13SLUY" 341 | }, 342 | "BundlePurchase": { 343 | "Url": "tPc64qmn", 344 | "EncodeKey": "NE3Pp4K8", 345 | "RequestID": "w6Z9a6tD" 346 | }, 347 | "ClsmEntry": { 348 | "Url": "UmLwv56W", 349 | "EncodeKey": "8bmHF3Cz", 350 | "RequestID": "5g0vWZFq" 351 | }, 352 | "GetBackgroundDownloadInfo": { 353 | "Url": "action", 354 | "EncodeKey": "Z1krd75o", 355 | "RequestID": "lEHBdOEf" 356 | }, 357 | "TransferCodeIssue": { 358 | "Url": "hF0yCKc1", 359 | "EncodeKey": "T0y6ij47", 360 | "RequestID": "crzI2bA5" 361 | }, 362 | "RoutineHomeUpdate": { 363 | "Url": "1YWTzU9h", 364 | "EncodeKey": "aw0syG7H", 365 | "RequestID": "Daud71Hn" 366 | }, 367 | "ItemCarryEdit": { 368 | "Url": "8BE6tJbf", 369 | "EncodeKey": "04opy1kf", 370 | "RequestID": "UM7hA0Zd" 371 | }, 372 | "ClsmLottery": { 373 | "Url": "4uj3NhUQ", 374 | "EncodeKey": "pU62SkhJ", 375 | "RequestID": "Un16HuNI" 376 | }, 377 | "MissionStart": { 378 | "Url": "63VqtzbQ", 379 | "EncodeKey": "i48eAVL6", 380 | "RequestID": "29JRaDbd" 381 | }, 382 | "ItemBuy": { 383 | "Url": "oQrAys71", 384 | "EncodeKey": "InN5PUR0", 385 | "RequestID": "sxK2HG6T" 386 | }, 387 | "sgExpdQuestInfo": { 388 | "Url": "hW0804Q9", 389 | "EncodeKey": "4Bn7d973", 390 | "RequestID": "hW0804Q9" 391 | }, 392 | "FacebookAddFriend": { 393 | "Url": "NAW9vJnm", 394 | "EncodeKey": "532vAYUy", 395 | "RequestID": "NAW9vJnm" 396 | }, 397 | "CraftAdd": { 398 | "Url": "iQ7R4CFB", 399 | "EncodeKey": "qz0SG1Ay", 400 | "RequestID": "QkN1Sp64" 401 | }, 402 | "PurchaseCurrentState": { 403 | "Url": "bAR4k7Qd", 404 | "EncodeKey": "X9k5vFdu", 405 | "RequestID": "9mM3eXgi" 406 | }, 407 | "UnitFavorite": { 408 | "Url": "sqeRg12M", 409 | "EncodeKey": "w9mWkGX0", 410 | "RequestID": "tBDi10Ay" 411 | }, 412 | "BundleStatus": { 413 | "Url": "tPc64qmn", 414 | "EncodeKey": "PrSPuc8c", 415 | "RequestID": "uLXAMvCT" 416 | }, 417 | "FriendFavorite": { 418 | "Url": "8IYSJ5H1", 419 | "EncodeKey": "3EBXbj1d", 420 | "RequestID": "1oE3Fwn4" 421 | }, 422 | "RbRanking": { 423 | "Url": "3fd8y7W1", 424 | "EncodeKey": "SR6PoLM3", 425 | "RequestID": "kcW85SfU" 426 | }, 427 | "DailyDungeonSelect": { 428 | "Url": "9LgmdR0v", 429 | "EncodeKey": "ioC6zqG1", 430 | "RequestID": "JyfxY2e0" 431 | }, 432 | "PurchaseList": { 433 | "Url": "YqZ6Qc1z", 434 | "EncodeKey": "X3Csghu0", 435 | "RequestID": "BT28S96F" 436 | }, 437 | "DailyQuestClaimAllReward": { 438 | "Url": "Br9PwJ6A", 439 | "EncodeKey": "KHx6JdrT", 440 | "RequestID": "DCmya9WD" 441 | }, 442 | "RbReStart": { 443 | "Url": "DQ49vsGL", 444 | "EncodeKey": "PRzAL3V2", 445 | "RequestID": "6ZNY3zAm" 446 | }, 447 | "ArchiveUpdate": { 448 | "Url": "2bCcKx0D", 449 | "EncodeKey": "IFLW9H4M", 450 | "RequestID": "cVTxW0K3" 451 | }, 452 | "PurchaseSetting": { 453 | "Url": "9hUtW0F8", 454 | "EncodeKey": "ePFcMX53", 455 | "RequestID": "QkwU4aD9" 456 | }, 457 | "RbEntry": { 458 | "Url": "30inL7I6", 459 | "EncodeKey": "EA5amS29", 460 | "RequestID": "f8kXGWy0" 461 | }, 462 | "DungeonLiberation": { 463 | "Url": "0vc6irBY", 464 | "EncodeKey": "0xDA4Cr9", 465 | "RequestID": "nQMb2L4h" 466 | }, 467 | "UnitMix": { 468 | "Url": "6aLHwhJ8", 469 | "EncodeKey": "4zCuj2hK", 470 | "RequestID": "UiSC9y8R" 471 | }, 472 | "sgExpdMileStoneClaim": { 473 | "Url": "r4A791RF", 474 | "EncodeKey": "t04N07LQ", 475 | "RequestID": "r4A791RF" 476 | }, 477 | "sgExpdRecall": { 478 | "Url": "0Fb87D0F", 479 | "EncodeKey": "9J02K0lX", 480 | "RequestID": "0Fb87D0F" 481 | }, 482 | "Transfer": { 483 | "Url": "v6Jba7pX", 484 | "EncodeKey": "C6eHo3wU", 485 | "RequestID": "oE5fmZN9" 486 | }, 487 | "PurchaseGiveUp": { 488 | "Url": "C2w0f3go", 489 | "EncodeKey": "xoZ62QWy", 490 | "RequestID": "BFf1nwh6" 491 | }, 492 | "GachaInfo": { 493 | "Url": "3nhWq25K", 494 | "EncodeKey": "VA8QR57X", 495 | "RequestID": "UNP1GR5n" 496 | }, 497 | "PurchaseStart": { 498 | "Url": "tPc64qmn", 499 | "EncodeKey": "9Kf4gYvm", 500 | "RequestID": "qAUzP3R6" 501 | }, 502 | "RmDungeonEnd": { 503 | "Url": "CH9fWn8K", 504 | "EncodeKey": "dEnsQ75t", 505 | "RequestID": "WaPC2T6i" 506 | }, 507 | "sgHomeMarqueeInfo": { 508 | "Url": "PBSP9qn5", 509 | "EncodeKey": "d3GDS9X8", 510 | "RequestID": "PBSP9qn5" 511 | }, 512 | "TownUpdate": { 513 | "Url": "0ZJzH2qY", 514 | "EncodeKey": "37nH21zE", 515 | "RequestID": "G1hQM8Dr" 516 | }, 517 | "GetTitleInfo": { 518 | "Url": "BbIeq31M", 519 | "EncodeKey": "Mw56RNZ2", 520 | "RequestID": "ocP3A1FI" 521 | }, 522 | "RateAppReward": { 523 | "Url": "L0OsxMaT", 524 | "EncodeKey": "m1pPBwC3", 525 | "RequestID": "L0OsxMaT" 526 | }, 527 | "PurchaseFailed": { 528 | "Url": "2TCis0R6", 529 | "EncodeKey": "sW0vf3ZM", 530 | "RequestID": "jSe80Gx7" 531 | }, 532 | "CampaignAccept": { 533 | "Url": "n7Hitfg4", 534 | "EncodeKey": "Xb0G1wcB", 535 | "RequestID": "G6ye0D1t" 536 | }, 537 | "PurchaseCancel": { 538 | "Url": "y71uBCER", 539 | "EncodeKey": "Z1mojg9a", 540 | "RequestID": "L7K0ezU2" 541 | }, 542 | "DmgRankRetire": { 543 | "Url": "8wdmR9yG", 544 | "EncodeKey": "5fkWyeE6", 545 | "RequestID": "W3Z4VF1X" 546 | }, 547 | "ItemSell": { 548 | "Url": "hQRf8D6r", 549 | "EncodeKey": "E8H3UerF", 550 | "RequestID": "d9Si7TYm" 551 | }, 552 | "PurchaseHold": { 553 | "Url": "dCxtMZ27", 554 | "EncodeKey": "5Mwfq90Z", 555 | "RequestID": "79EVRjeM" 556 | }, 557 | "MailReceipt": { 558 | "Url": "M2fHBe9d", 559 | "EncodeKey": "P2YFr7N9", 560 | "RequestID": "XK7efER9" 561 | }, 562 | "UnitClassUp": { 563 | "Url": "8z4Z0DUY", 564 | "EncodeKey": "L2sTK0GM", 565 | "RequestID": "zf49XKg8" 566 | }, 567 | "PartyDeckEdit": { 568 | "Url": "6xkK4eDG", 569 | "EncodeKey": "34qFNPf7", 570 | "RequestID": "TS5Dx9aZ" 571 | }, 572 | "FriendSearch": { 573 | "Url": "6Y1jM3Wp", 574 | "EncodeKey": "VCL5oj6u", 575 | "RequestID": "3siZRSU4" 576 | }, 577 | "sgExpdEnd": { 578 | "Url": "2pe3Xa8bpG", 579 | "EncodeKey": "cjHumZ2Jkt", 580 | "RequestID": "2pe3Xa8bpG" 581 | }, 582 | "ShopUse": { 583 | "Url": "w76ThDMm", 584 | "EncodeKey": "ZT0Ua4wL", 585 | "RequestID": "73SD2aMR" 586 | }, 587 | "UnitEquip": { 588 | "Url": "nIk9z5pT", 589 | "EncodeKey": "45VZgFYv", 590 | "RequestID": "pB3st6Tg" 591 | }, 592 | "DmgRankStart": { 593 | "Url": "j37Vk5xe", 594 | "EncodeKey": "1d5AP9p6", 595 | "RequestID": "5P6ULvjg" 596 | }, 597 | "RbEnd": { 598 | "Url": "e8AHNiT7", 599 | "EncodeKey": "MVA3Te2i", 600 | "RequestID": "os4k7C0b" 601 | }, 602 | "TrophyReward": { 603 | "Url": "05vJDxg9", 604 | "EncodeKey": "2o7kErn1", 605 | "RequestID": "wukWY4t2" 606 | }, 607 | "MissionWaveReStart": { 608 | "Url": "8m7KNezI", 609 | "EncodeKey": "M3bYZoU5", 610 | "RequestID": "e9RP8Cto" 611 | }, 612 | "CraftCancel": { 613 | "Url": "7WdDLIE4", 614 | "EncodeKey": "68zcUF3E", 615 | "RequestID": "79xDN1Mw" 616 | }, 617 | "CampaignTieup": { 618 | "Url": "2u30vqfY", 619 | "EncodeKey": "72d5UTNC", 620 | "RequestID": "mI0Q2YhW" 621 | }, 622 | "SpChallengeRewardGet": { 623 | "Url": "9inGHyqC", 624 | "EncodeKey": "mG25PIUn", 625 | "RequestID": "2G7ZVs4A" 626 | }, 627 | "PlaybackMissionWaveStart": { 628 | "Url": "scyPYa81", 629 | "EncodeKey": "NdkX15vE", 630 | "RequestID": "1BpXP3Fs" 631 | }, 632 | "DungeonResourceLoadMstList": { 633 | "Url": "Sl8UgmP4", 634 | "EncodeKey": "3PVu6ReZ", 635 | "RequestID": "jnw49dUq" 636 | }, 637 | "MissionSwitchUpdate": { 638 | "Url": "1Xz8kJLr", 639 | "EncodeKey": "bZezA63a", 640 | "RequestID": "Tvq54dx6" 641 | }, 642 | "AllianceDeckEdit": { 643 | "Url": "7gAGFC4I", 644 | "EncodeKey": "2E3UinsJ", 645 | "RequestID": "P76LYXow" 646 | }, 647 | "IsNeedValidate": { 648 | "Url": "gk3Wtr8A", 649 | "EncodeKey": "djhiU6x8", 650 | "RequestID": "er5xMIj6" 651 | }, 652 | "SpChallengeEntry": { 653 | "Url": "8DermCsY", 654 | "EncodeKey": "Uey5jW2G", 655 | "RequestID": "MTf2j9aK" 656 | }, 657 | "ChallengeClear": { 658 | "Url": "dEvLKchl", 659 | "EncodeKey": "UD5QCa2s", 660 | "RequestID": "D9xphQ8X" 661 | }, 662 | "GetReinforcementInfo": { 663 | "Url": "hXMoLwgE", 664 | "EncodeKey": "87khNMou", 665 | "RequestID": "AJhnI37s" 666 | }, 667 | "PlaybackMissionStart": { 668 | "Url": "zm2ip59f", 669 | "EncodeKey": "YC20v1Uj", 670 | "RequestID": "1YnQM4iB" 671 | }, 672 | "AllianceEntry": { 673 | "Url": "EzfT0wX6", 674 | "EncodeKey": "zS4tPgi7", 675 | "RequestID": "HtR8XF4e" 676 | }, 677 | } 678 | -------------------------------------------------------------------------------- /PacketDecoder/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using System.Windows; 8 | using System.Windows.Controls; 9 | using System.Windows.Documents; 10 | using MahApps.Metro.Controls; 11 | using MahApps.Metro.Controls.Dialogs; 12 | using Fiddler; 13 | using BraveHaxvius; 14 | using BraveHaxvius.Data; 15 | using Newtonsoft.Json; 16 | using Newtonsoft.Json.Linq; 17 | 18 | namespace PacketDecoder 19 | { 20 | public partial class MainWindow 21 | { 22 | ObservableCollection people = new ObservableCollection(); 23 | public MainWindow() 24 | { 25 | InitializeComponent(); 26 | 27 | if (Properties.Settings.Default.Cert != "") 28 | { 29 | FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.key", Properties.Settings.Default.Key); 30 | FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.cert", Properties.Settings.Default.Cert); 31 | } 32 | DataContext = people; 33 | InstallCertificate(); 34 | 35 | AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; 36 | FiddlerApplication.BeforeRequest += delegate (Session oSession) 37 | { 38 | oSession.bBufferResponse = true; 39 | }; 40 | FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; 41 | FiddlerApplication.BeforeResponse += FiddlerApplication_BeforeResponse; 42 | FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete; 43 | FiddlerApplication.Startup(8888, true, true, true); 44 | } 45 | 46 | Boolean installCertificateMessage = false; 47 | private void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e) 48 | { 49 | BraveHaxvius.Logger.Out(e.ToString()); 50 | if (e.Exception.Message == "A call to SSPI failed, see inner exception.") 51 | { 52 | if (installCertificateMessage) 53 | return; 54 | installCertificateMessage = true; 55 | var ipaddr = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork); 56 | Application.Current.Dispatcher.InvokeAsync(async () => 57 | { 58 | var result = await this.ShowMessageAsync("Need to Accept Certificate On Proxied Device!", "Go to " + ipaddr.ToString() + " and download the FiddlerRoot Certificate!"); 59 | installCertificateMessage = false; 60 | }); 61 | } 62 | } 63 | public static bool InstallCertificate() 64 | { 65 | if (!CertMaker.rootCertExists()) 66 | { 67 | if (!CertMaker.createRootCert()) 68 | return false; 69 | if (!CertMaker.trustRootCert()) 70 | return false; 71 | Properties.Settings.Default.Cert = FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.cert", null); 72 | Properties.Settings.Default.Key = FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.key", null); 73 | Properties.Settings.Default.Save(); 74 | } 75 | return true; 76 | } 77 | public static bool UninstallCertificate() 78 | { 79 | if (CertMaker.rootCertExists()) 80 | { 81 | if (!CertMaker.removeFiddlerGeneratedCerts(true)) 82 | return false; 83 | } 84 | Properties.Settings.Default.Cert = ""; 85 | Properties.Settings.Default.Key = ""; 86 | Properties.Settings.Default.Save(); 87 | return true; 88 | } 89 | private void Button_Click(object sender, RoutedEventArgs e) 90 | { 91 | UninstallCertificate(); 92 | } 93 | int packetCount = 0; 94 | 95 | private void FiddlerApplication_BeforeRequest(Session oSession) 96 | { 97 | if (oSession.RequestMethod == "CONNECT") 98 | return; 99 | if (oSession == null || oSession.oRequest == null || oSession.oRequest.headers == null) 100 | return; 101 | if (!oSession.fullUrl.Contains("actionSymbol")) 102 | return; 103 | string headers = oSession.oRequest.headers.ToString(); 104 | var reqBody = oSession.GetRequestBodyAsString(); 105 | reqBody = reqBody.Substring(reqBody.IndexOf("{")); 106 | reqBody = reqBody.Substring(0, reqBody.LastIndexOf("}") + 1); 107 | string firstLine = oSession.RequestMethod + " " + oSession.fullUrl + " " + oSession.oRequest.headers.HTTPVersion; 108 | int at = headers.IndexOf("\r\n"); 109 | if (at < 0) 110 | return; 111 | headers = firstLine + "\r\n" + headers.Substring(at + 1); 112 | var url = oSession.fullUrl.Substring(oSession.fullUrl.IndexOf("actionSymbol") + 13).Replace(".php", ""); 113 | var request = Request.Requests.First(r => r.Url == url); 114 | { 115 | dynamic json = JsonConvert.DeserializeObject(reqBody); 116 | if (json != null) 117 | { 118 | var encryptedObject = json[Variable.Encrypted]; 119 | if (encryptedObject != null) 120 | { 121 | var encryptedData = encryptedObject[Variable.Data].Value; 122 | var decryptedJson = Crypto.Decrypt(encryptedData, request.EncodeKey); 123 | if (decryptedJson.Contains("")) 124 | { 125 | } 126 | } 127 | } 128 | } 129 | } 130 | private void FiddlerApplication_BeforeResponse(Session oSession) 131 | { 132 | if (oSession.RequestMethod == "CONNECT") 133 | return; 134 | if (oSession == null || oSession.oRequest == null || oSession.oRequest.headers == null) 135 | return; 136 | if (!oSession.fullUrl.Contains("actionSymbol")) 137 | return; 138 | var time = (int)(DateTime.UtcNow - System.Diagnostics.Process.GetCurrentProcess().StartTime.ToUniversalTime()).TotalMilliseconds; 139 | string headers = oSession.oRequest.headers.ToString(); 140 | string respHeaders = oSession.oResponse.headers.ToString(); 141 | //var respBody = Encoding.UTF8.GetString(oSession.responseBodyBytes); 142 | var respBody = oSession.GetResponseBodyAsString(); 143 | respBody = respBody.Substring(respBody.IndexOf("{")); 144 | respBody = respBody.Substring(0, respBody.LastIndexOf("}") + 1); 145 | string firstLine = oSession.RequestMethod + " " + oSession.fullUrl + " " + oSession.oRequest.headers.HTTPVersion; 146 | int at = headers.IndexOf("\r\n"); 147 | if (at < 0) 148 | return; 149 | headers = firstLine + "\r\n" + headers.Substring(at + 1); 150 | var url = oSession.fullUrl.Substring(oSession.fullUrl.IndexOf("actionSymbol") + 13).Replace(".php", ""); 151 | var request = Request.Requests.First(r => r.Url == url); 152 | { 153 | dynamic json = JsonConvert.DeserializeObject(respBody); 154 | if (json != null) 155 | { 156 | var encryptedObject = json[Variable.Encrypted]; 157 | if (encryptedObject != null) 158 | { 159 | var encryptedData = encryptedObject[Variable.Data].Value; 160 | var decryptedJson = Crypto.Decrypt(encryptedData, request.EncodeKey); 161 | } 162 | } 163 | } 164 | } 165 | private void FiddlerApplication_AfterSessionComplete(Session oSession) 166 | { 167 | if (oSession.RequestMethod == "CONNECT") 168 | return; 169 | if (oSession == null || oSession.oRequest == null || oSession.oRequest.headers == null) 170 | return; 171 | if (!oSession.fullUrl.Contains("actionSymbol")) 172 | return; 173 | var time = (int)(DateTime.UtcNow - System.Diagnostics.Process.GetCurrentProcess().StartTime.ToUniversalTime()).TotalMilliseconds; 174 | 175 | string headers = oSession.oRequest.headers.ToString(); 176 | var reqBody = oSession.GetRequestBodyAsString(); 177 | 178 | string respHeaders = oSession.oResponse.headers.ToString(); 179 | var respBody = oSession.GetResponseBodyAsString(); 180 | 181 | string firstLine = oSession.RequestMethod + " " + oSession.fullUrl + " " + oSession.oRequest.headers.HTTPVersion; 182 | int at = headers.IndexOf("\r\n"); 183 | if (at < 0) 184 | return; 185 | headers = firstLine + "\r\n" + headers.Substring(at + 1); 186 | 187 | string output = headers + "\r\n" + 188 | (!string.IsNullOrEmpty(reqBody) ? reqBody + "\r\n" : string.Empty) + "\r\n\r\n"; 189 | var url = oSession.fullUrl.Substring(oSession.fullUrl.IndexOf("actionSymbol") + 13).Replace(".php", ""); 190 | var request = Request.Requests.First(r => r.Url == url); 191 | 192 | { 193 | dynamic json = JsonConvert.DeserializeObject(reqBody); 194 | var encryptedObject = json[Variable.Encrypted]; 195 | var encryptedData = encryptedObject[Variable.Data].Value; 196 | var decryptedJson = Crypto.Decrypt(encryptedData, request.EncodeKey); 197 | var sendpacket = new Packet 198 | { 199 | Time = time, 200 | Num = packetCount, 201 | Direction = "Send", 202 | Url = url, 203 | Type = request.Name, 204 | EncryptedJson = reqBody, 205 | DecryptedJson = decryptedJson, 206 | }; 207 | packetGrid.BeginInvoke(new Action(() => { people.Add(sendpacket); })); 208 | } 209 | { 210 | dynamic json = JsonConvert.DeserializeObject(respBody); 211 | if (json != null) 212 | { 213 | var encryptedObject = json[Variable.Encrypted]; 214 | if (encryptedObject != null) 215 | { 216 | var encryptedData = encryptedObject[Variable.Data].Value; 217 | var decryptedJson = Crypto.Decrypt(encryptedData, request.EncodeKey); 218 | var recievepacket = new Packet 219 | { 220 | Time = time, 221 | Num = packetCount++, 222 | Direction = "Receive", 223 | Url = url, 224 | Type = request.Name, 225 | EncryptedJson = respBody, 226 | DecryptedJson = decryptedJson, 227 | }; 228 | packetGrid.BeginInvoke(new Action(() => { people.Add(recievepacket); })); 229 | } 230 | else 231 | { 232 | var errorMsg = json[GameObject.Message]?[Variable.Message]; 233 | var recievepacket = new Packet 234 | { 235 | Time = time, 236 | Num = packetCount++, 237 | Direction = "Receive", 238 | Url = url, 239 | Type = request.Name, 240 | EncryptedJson = errorMsg, 241 | DecryptedJson = errorMsg, 242 | }; 243 | packetGrid.BeginInvoke(new Action(() => { people.Add(recievepacket); })); 244 | } 245 | } 246 | } 247 | } 248 | private void MetroWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 249 | { 250 | if (FiddlerApplication.IsStarted()) 251 | FiddlerApplication.Shutdown(); 252 | } 253 | private void PacketGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 254 | { 255 | encryptedJsonText.Document.Blocks.Clear(); 256 | try 257 | { 258 | encryptedJsonText.Document.Blocks.Add(new Paragraph(new Run((packetGrid.SelectedItem as Packet).EncryptedJson.Trim()))); 259 | var decryptedJson = (packetGrid.SelectedItem as Packet).DecryptedJson; 260 | using (var stringReader = new StringReader(decryptedJson)) 261 | using (var stringWriter = new StringWriter()) 262 | { 263 | var jsonReader = new JsonTextReader(stringReader); 264 | var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented }; 265 | jsonWriter.WriteToken(jsonReader); 266 | decryptedJsonText.Document.Blocks.Clear(); 267 | decryptedJsonText.Document.Blocks.Add(new Paragraph(new Run(stringWriter.ToString()))); 268 | } 269 | foreach (var obj in GameObject.GameObjects) 270 | decryptedJson = decryptedJson.Replace(obj.Key, obj.Value); 271 | foreach (var obj in Variable.Variables) 272 | decryptedJson = decryptedJson.Replace(obj.Key, obj.Value); 273 | using (var stringReader = new StringReader(decryptedJson)) 274 | using (var stringWriter = new StringWriter()) 275 | { 276 | var jsonReader = new JsonTextReader(stringReader); 277 | var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented }; 278 | jsonWriter.WriteToken(jsonReader); 279 | gameObjectJsonText.Document.Blocks.Clear(); 280 | gameObjectJsonText.Document.Blocks.Add(new Paragraph(new Run(stringWriter.ToString()))); 281 | } 282 | dynamic gameJsonObject = JsonConvert.DeserializeObject(decryptedJson); 283 | gameObjectView.Items.Clear(); 284 | var tree = Json2Tree(gameJsonObject); 285 | tree.IsExpanded = true; 286 | gameObjectView.Items.Add(tree); 287 | } 288 | catch { } 289 | } 290 | private TreeViewItem Json2Tree(JObject obj) 291 | { 292 | var parent = new TreeViewItem 293 | { 294 | Header = "Dictionary" 295 | }; 296 | foreach (var token in obj) 297 | { 298 | var child = new TreeViewItem 299 | { 300 | Header = token.Key.ToString() 301 | }; 302 | if (token.Value.Type.ToString() == "Object") 303 | { 304 | JObject o = (JObject)token.Value; 305 | child = Json2Tree(o); 306 | parent.Items.Add(child); 307 | } 308 | else if (token.Value.Type.ToString() == "Array") 309 | { 310 | int ix = -1; 311 | foreach (var itm in token.Value) 312 | { 313 | if (itm.Type.ToString() == "Object") 314 | { 315 | var objTN = new TreeViewItem(); 316 | ix++; 317 | var o = (JObject)itm; 318 | objTN = Json2Tree(o); 319 | objTN.Header = token.Key.ToString() + "[" + ix + "]"; 320 | child.Items.Add(objTN); 321 | } 322 | else if (itm.Type.ToString() == "Array") 323 | { 324 | ix++; 325 | var dataArray = new TreeViewItem(); 326 | foreach (var data in itm) 327 | { 328 | dataArray.Header = token.Key.ToString() + "[" + ix + "]"; 329 | dataArray.Items.Add(data.ToString()); 330 | } 331 | child.Items.Add(dataArray); 332 | } 333 | else 334 | child.Items.Add(itm.ToString()); 335 | } 336 | parent.Items.Add(child); 337 | } 338 | else 339 | { 340 | child.Header += " = " + token.Value.ToString(); 341 | parent.Items.Add(child); 342 | } 343 | } 344 | return parent; 345 | } 346 | } 347 | } 348 | -------------------------------------------------------------------------------- /Client/MainWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading; 10 | using System.Windows.Forms; 11 | using BraveHaxvius; 12 | using BraveHaxvius.Data; 13 | using Client.Properties; 14 | using Newtonsoft.Json; 15 | using Newtonsoft.Json.Linq; 16 | 17 | namespace Client 18 | { 19 | public partial class MainWindow : Form 20 | { 21 | BraveExvius client = new BraveExvius(); 22 | DataTable injectDataTable = new DataTable(); 23 | JToken Gachas; 24 | 25 | public MainWindow() 26 | { 27 | Control.CheckForIllegalCrossThreadCalls = false; 28 | InitializeComponent(); 29 | InitStaticItems(); 30 | client.FacebookUserId = fbidInput.Text; 31 | client.FacebookToken = fbtokenInput.Text; 32 | client.ProxyIpAddr = ProxyIP.Text; 33 | if (!String.IsNullOrWhiteSpace(ProxyIP.Text)) 34 | client.ProxyPort = int.Parse(ProxyPort.Text); 35 | Logger.LogHook = Hook; 36 | } 37 | public void Hook(String s) 38 | { 39 | consoleLog.Focus(); 40 | consoleLog.AppendText(s+ "\r\n"); 41 | } 42 | private void InitStaticItems() 43 | { 44 | injectDataTable.Columns.Add("Count"); 45 | injectDataTable.Columns.Add("Type"); 46 | injectDataTable.Columns.Add("Name"); 47 | injectDataTable.Columns.Add("ID"); 48 | Item.Items.FindAll(i => i.Description != null).ForEach(i => injectDataTable.Rows.Add(0, "item", i.Name, i.ItemId)); 49 | Equipment.Equipments.FindAll(i => i.Description != null).ForEach(i => injectDataTable.Rows.Add(0, "equip", i.Name, i.EquipId)); 50 | Materia.Materias.FindAll(i => i.Description != null).ForEach(i => injectDataTable.Rows.Add(0, "materia", i.Name, i.MateriaId)); 51 | injectDataGrid.DataSource = injectDataTable; 52 | 53 | Unit.Units.FindAll(u => u.Description != null && u.IsSummonable == "1" && u.UnitId == u.BaseUnitId); 54 | List list = new List(); 55 | Mission.Missions.FindAll(i => i.Description != null).ForEach(i => list.Add(i)); 56 | 57 | unitSelect.DataSource = Unit.Units.FindAll(u => u.Description != null && u.IsSummonable == "1" && u.UnitId == u.BaseUnitId); 58 | unitSelect.DisplayMember = "Name"; 59 | 60 | missionSelect.DataSource = Mission.Missions.FindAll(i => i.Description != null); 61 | missionSelect.DisplayMember = "Name"; 62 | } 63 | private void InitGacha(BraveExvius b) 64 | { 65 | Gachas = b.GetUserInfo[GameObject.GachaScheduleMst]; 66 | 67 | foreach (var gacha in b.GachaId) 68 | JPGacha.Items.Add(gacha); 69 | 70 | JPGacha.SelectedIndex = 0; 71 | 72 | foreach (var ticket in Ticket.Tickets) 73 | JPGachaTicket.Items.Add(ticket.Name); 74 | 75 | JPGachaTicket.SelectedIndex = 0; 76 | } 77 | private void InjectSearchInput_TextChanged(object sender, EventArgs e) 78 | { 79 | injectDataTable.DefaultView.RowFilter = string.Format("Name LIKE '%{0}%'", injectSearchInput.Text); 80 | } 81 | private void InjectButton_Click(object sender, EventArgs e) 82 | { 83 | var t = new Thread(() => 84 | { 85 | injectButton.Enabled = false; 86 | var itemHax = String.Join(",", injectDataTable.Rows.Cast().ToList().FindAll(i => i.ItemArray[1].ToString() == "item" && i.ItemArray[0].ToString() != "0").Select(i => "20:" + i.ItemArray[3] + ":" + i.ItemArray[0])); 87 | var equipmentHax = String.Join(",", injectDataTable.Rows.Cast().ToList().FindAll(i => i.ItemArray[1].ToString() == "equip" && i.ItemArray[0].ToString() != "0").Select(i => "21:" + i.ItemArray[3] + ":" + i.ItemArray[0])); 88 | var materiaHax = String.Join(",", injectDataTable.Rows.Cast().ToList().FindAll(i => i.ItemArray[1].ToString() == "materia" && i.ItemArray[0].ToString() != "0").Select(i => "22:" + i.ItemArray[3] + ":" + i.ItemArray[0])); 89 | client.Login(); 90 | client.DoMission(Mission.AirshipDeck, false, itemHax, equipmentHax, materiaHax); 91 | injectButton.Enabled = true; 92 | }); 93 | t.IsBackground = true; 94 | t.Start(); 95 | } 96 | private void SummonButton_Click(object sender, EventArgs e) 97 | { 98 | var t = new Thread(() => 99 | { 100 | Func iteration = i => 101 | { 102 | summonButton.Text = (i + 1).ToString() + "..."; 103 | return 1; 104 | }; 105 | summonButton.Enabled = false; 106 | var unit = unitSelect.SelectedItem as Unit; 107 | client.Login(); 108 | client.UnitHunterNew(unit, sell3Star.Checked, sell4Star.Checked, sell5Star.Checked, iteration); 109 | summonButton.Text = "summon"; 110 | summonButton.Enabled = true; 111 | }); 112 | t.IsBackground = true; 113 | t.Start(); 114 | } 115 | private void GitHubButton_Click(object sender, EventArgs e) 116 | { 117 | System.Diagnostics.Process.Start("https://github.com/shalzuth/BraveHaxvius"); 118 | } 119 | private void DonateButton_Click(object sender, EventArgs e) 120 | { 121 | System.Diagnostics.Process.Start("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=shal.zuth@gmail.com&lc=US¤cy_code=USD&bn=PP%2dDonationsBF"); 122 | } 123 | private void LevelPartyButton_Click(object sender, EventArgs e) 124 | { 125 | var t = new Thread(() => 126 | { 127 | Func update = i => 128 | { 129 | levelStatus.Text = i; 130 | return 1; 131 | }; 132 | levelPartyButton.Enabled = false; 133 | client.Login(); 134 | client.LevelPartyNew(update); 135 | levelPartyButton.Enabled = true; 136 | }); 137 | t.IsBackground = true; 138 | t.Start(); 139 | } 140 | private void RankUpButton_Click(object sender, EventArgs e) 141 | { 142 | var t = new Thread(() => 143 | { 144 | Func update = i => 145 | { 146 | levelStatus.Text = i; 147 | return 1; 148 | }; 149 | rankUpButton.Enabled = false; 150 | client.Login(); 151 | while (true) 152 | { 153 | var result = client.DoMission(Mission.PortCityLodin, false, null, null, null, false, false, false, false, false, null, 15000); 154 | var level = result[GameObject.UserTeamInfo].First()[Variable.Level].ToString(); 155 | var experience = result[GameObject.UserTeamInfo].First()[Variable.Experience].ToString(); 156 | levelStatus.Text = "Rank " + level + " : experience = " + experience; 157 | if (level == "150") 158 | break; 159 | Thread.Sleep(3000); 160 | } 161 | rankUpButton.Enabled = true; 162 | }); 163 | t.IsBackground = true; 164 | t.Start(); 165 | } 166 | 167 | private void JPLogin_Click(object sender, EventArgs e) 168 | { 169 | var t = new Thread(() => 170 | { 171 | JPLogin.Enabled = false; 172 | client.LoginJapan(); 173 | InitGacha(client); 174 | JPLogin.Enabled = true; 175 | GachaSummon.Enabled = true; 176 | }); 177 | t.IsBackground = true; 178 | t.Start(); 179 | } 180 | 181 | private void GachaSummon_Click(object sender, EventArgs e) 182 | { 183 | var t = new Thread(() => 184 | { 185 | GachaSummon.Enabled = false; 186 | 187 | var GachaId = JPGacha.Text.Split(':').Select(p => p.Trim()).ToList().First(); 188 | var Gacha = Gachas.First(g => g[Variable.GachaId].ToString() == GachaId); 189 | var GachaTicket = Ticket.Tickets.First(x => x.Name == JPGachaTicket.Text).Id; 190 | var GachaSubId = Gacha[Variable.Options].ToString().Split(',').Last(); 191 | client.Summon(Gacha[Variable.GachaId].ToString(), GachaSubId, "1", GachaTicket); 192 | 193 | GachaSummon.Enabled = true; 194 | }); 195 | t.IsBackground = true; 196 | t.Start(); 197 | } 198 | 199 | private void StartMission_Click(object sender, EventArgs e) 200 | { 201 | var t = new Thread(() => 202 | { 203 | StartMission.Enabled = false; 204 | client.Device = RBiOS.Checked ? "iPhone9,3" : "XT890"; 205 | client.OperatingSystem = RBiOS.Checked ? "ios10.2.1" : RBAndroid.Checked ? "android4.4.2" : "amazon"; 206 | client.Login(); 207 | var mission = missionSelect.SelectedItem as Mission; 208 | client.DoMission(mission, CBFriends.Checked, null, null, null, CBTrophies.Checked, CBChallenge.Checked, CBLoot.Checked, CBUnits.Checked, CBExplore.Checked, LBLevel.Text, 3000); 209 | var count = 1; 210 | while (!String.IsNullOrEmpty(RepeatMission.Text.Replace(" ", "")) && count < Int32.Parse(RepeatMission.Text.Replace(" ", ""))) 211 | { 212 | client.DoMission(mission, CBFriends.Checked, null, null, null, CBTrophies.Checked, CBChallenge.Checked, CBLoot.Checked, CBUnits.Checked, CBExplore.Checked, LBLevel.Text, 3000); 213 | count++; 214 | Thread.Sleep(3000); 215 | } 216 | StartMission.Enabled = true; 217 | }); 218 | t.IsBackground = true; 219 | t.Start(); 220 | } 221 | 222 | private void RBOS_CheckedChanged(object sender, EventArgs e) 223 | { 224 | } 225 | 226 | private void FbidInput_TextChanged(object sender, EventArgs e) 227 | { 228 | fbidInput.Text = fbidInput.Text.Replace(" ", ""); 229 | client.FacebookUserId = fbidInput.Text; 230 | Settings.Default.fbidInput = fbidInput.Text; 231 | Settings.Default.Save(); 232 | } 233 | 234 | private void fbtokenInput_TextChanged(object sender, EventArgs e) 235 | { 236 | fbtokenInput.Text = fbtokenInput.Text.Replace(" ", ""); 237 | client.FacebookToken = fbtokenInput.Text; 238 | Settings.Default.fbtokenInput = fbtokenInput.Text; 239 | Settings.Default.Save(); 240 | } 241 | 242 | private void ProxyIP_TextChanged(object sender, EventArgs e) 243 | { 244 | client.ProxyIpAddr = ProxyIP.Text; 245 | Settings.Default.ProxyIP = ProxyIP.Text; 246 | Settings.Default.Save(); 247 | } 248 | 249 | private void ProxyPort_TextChanged(object sender, EventArgs e) 250 | { 251 | client.ProxyPort = int.Parse(ProxyPort.Text); 252 | Settings.Default.ProxyPort = ProxyPort.Text; 253 | Settings.Default.Save(); 254 | } 255 | private void CBTrophies_CheckedChanged(object sender, EventArgs e) 256 | { 257 | CheckBox cb = sender as CheckBox; 258 | 259 | if (cb.Checked) 260 | { 261 | LBLevel.Text = ""; 262 | LBLevel.Enabled = false; 263 | CBChallenge.Checked = false; 264 | CBChallenge.Enabled = false; 265 | } 266 | else 267 | { 268 | LBLevel.Enabled = true; 269 | } 270 | } 271 | private void arenaButton_Click(object sender, EventArgs e) 272 | { 273 | var t = new Thread(() => 274 | { 275 | Func update = i => 276 | { 277 | levelStatus.Text = i; 278 | return 1; 279 | }; 280 | arenaButton.Enabled = false; 281 | client.Login(); 282 | client.ClearArena(); 283 | arenaButton.Enabled = true; 284 | }); 285 | t.IsBackground = true; 286 | t.Start(); 287 | } 288 | 289 | public class Sell 290 | { 291 | public String ItemName; 292 | public String id; 293 | public String type; 294 | public int count; 295 | public int price; 296 | public override string ToString() 297 | { 298 | return ItemName + " : " + count; 299 | } 300 | } 301 | private void sellButton_Click(object sender, EventArgs e) 302 | { 303 | var t = new Thread(() => 304 | { 305 | if (sellButton.Text == "login") 306 | { 307 | sellButton.Enabled = false; 308 | client.Login(); 309 | var items = client.GetUserInfo[GameObject.UserItemInfo_4rC0aLkA].First()[Variable.ItemList].ToString().Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); 310 | var equips = client.GetUserInfo[GameObject.UserEquipItemInfo_w83oV9uP].First()[Variable.ItemList].ToString().Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); 311 | var materias = client.GetUserInfo[GameObject.UserMateriaInfo_aS39Eshy].First()[Variable.ItemList].ToString().Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); 312 | 313 | List sellable = new List(); 314 | foreach (var itemInfo in items) 315 | { 316 | var id = itemInfo.Split(new char[1] { ':' })[0]; 317 | var count = itemInfo.Split(new char[1] { ':' })[1]; 318 | var item = Item.Items.First(i => i.ItemId == id); 319 | sellable.Add(new Sell { ItemName = item.Name, count = int.Parse(count), id = id, price = int.Parse(item.ItemSellPrice), type = "20:" });//, ItemNameAndCount = item.Name + " : " + count }); 320 | } 321 | foreach (var itemInfo in equips) 322 | { 323 | var id = itemInfo.Split(new char[1] { ':' })[0]; 324 | var count = itemInfo.Split(new char[1] { ':' })[1]; 325 | var item = Equipment.Equipments.First(i => i.EquipId == id); 326 | sellable.Add(new Sell { ItemName = item.Name, count = int.Parse(count), id = id, price = int.Parse(item.ItemSellPrice), type = "21:" });//, ItemNameAndCount = item.Name + " : " + count }); 327 | } 328 | foreach (var itemInfo in materias) 329 | { 330 | var id = itemInfo.Split(new char[1] { ':' })[0]; 331 | var count = itemInfo.Split(new char[1] { ':' })[1]; 332 | var item = Materia.Materias.First(i => i.MateriaId == id); 333 | sellable.Add(new Sell { ItemName = item.Name, count = int.Parse(count), id = id, price = int.Parse(item.ItemSellPrice), type = "22:" });//, ItemNameAndCount = item.Name + " : " + count }); 334 | } 335 | sellable = sellable.OrderByDescending(s => s.count).ToList(); 336 | sellButton.Text = "sell"; 337 | sellItemSelect.DataSource = sellable; 338 | sellButton.Enabled = true; 339 | } 340 | else if (sellButton.Text == "sell") 341 | { 342 | sellButton.Enabled = false; 343 | var item = (sellItemSelect.SelectedItem as Sell); 344 | while ((UInt64)item.count * (UInt64)item.price > 999999999) 345 | { 346 | var maxSell = 999999999 / item.price; 347 | client.Network.SendPacket(Request.ItemSell, new JProperty(Variable.ItemSell, new JArray(new JObject( 348 | new JProperty(Variable.StoreItemSellId, item.type + item.id + ":" + maxSell), 349 | new JProperty(Variable.StoreItemSellPrice, ((UInt64)item.price * (UInt64)maxSell).ToString()))))); 350 | item.count -= maxSell; 351 | Thread.Sleep(3000); 352 | } 353 | client.Network.SendPacket(Request.ItemSell, new JProperty(Variable.ItemSell, new JArray(new JObject( 354 | new JProperty(Variable.StoreItemSellId, item.type + item.id + ":" + item.count), 355 | new JProperty(Variable.StoreItemSellPrice, (item.price * item.count).ToString()))))); 356 | sellButton.Enabled = true; 357 | } 358 | }); 359 | t.IsBackground = true; 360 | t.Start(); 361 | } 362 | } 363 | } 364 | --------------------------------------------------------------------------------