using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows; using Il2CppInspector; using Inspector = Il2CppInspector.Il2CppInspector; namespace Il2CppInspectorGUI { /// /// Interaction logic for App.xaml /// public partial class App : Application { private Metadata metadata; public List Il2CppImages { get; } = new List(); public Exception LastException { get; private set; } // Attempt to load an IL2CPP metadata file public Task LoadMetadataAsync(string metadataFile) => Task.Run(() => { try { metadata = new Metadata(new MemoryStream(File.ReadAllBytes(metadataFile))); return true; } catch (Exception ex) { LastException = ex; return false; } }); public Task LoadBinaryAsync(string binaryFile) => Task.Run(() => { try { // This may throw other exceptions from the individual loaders as well IFileFormatReader stream = FileFormatReader.Load(binaryFile); if (stream == null) { throw new InvalidOperationException("Could not determine the binary file format"); } if (!stream.Images.Any()) { throw new InvalidOperationException("Could not find any binary images in the file"); } // Multi-image binaries may contain more than one Il2Cpp image Il2CppImages.Clear(); foreach (var image in stream.Images) { // Architecture-agnostic load attempt try { // If we can't load the IL2CPP data here, it's probably packed or obfuscated; ignore it if (Il2CppBinary.Load(image, metadata.Version) is Il2CppBinary binary) { Il2CppImages.Add(new Inspector(binary, metadata)); } } // Unsupported architecture; ignore it catch (NotImplementedException) { } } if (!Il2CppImages.Any()) { throw new InvalidOperationException("Could not auto-detect any IL2CPP binary images in the file"); } return true; } catch (Exception ex) { LastException = ex; return false; } }); } }