├── 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 | [](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 |
--------------------------------------------------------------------------------