From e384ec226ede9b07c3788c25445f6c6d4517ec63 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Sat, 12 Sep 2020 13:56:23 +0200 Subject: [PATCH] GUI: Support split APKs --- Il2CppInspector.GUI/App.xaml.cs | 7 +++---- Il2CppInspector.GUI/MainWindow.xaml | 2 +- Il2CppInspector.GUI/MainWindow.xaml.cs | 18 ++++++++++++------ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Il2CppInspector.GUI/App.xaml.cs b/Il2CppInspector.GUI/App.xaml.cs index 50732a4..a474b34 100644 --- a/Il2CppInspector.GUI/App.xaml.cs +++ b/Il2CppInspector.GUI/App.xaml.cs @@ -31,14 +31,13 @@ namespace Il2CppInspectorGUI private void StatusUpdate(object sender, string status) => OnStatusUpdate?.Invoke(sender, status); // Attempt to load an IL2CPP application package (APK or IPA) - public async Task LoadPackageAsync(string packageFile) { + public async Task LoadPackageAsync(IEnumerable packageFiles) { try { OnStatusUpdate?.Invoke(this, "Extracting package"); - // TODO: Accept multiple APKs - var streams = Inspector.GetStreamsFromPackage(new string[] { packageFile }); + var streams = Inspector.GetStreamsFromPackage(packageFiles); if (streams == null) - throw new InvalidOperationException("The supplied package is not an APK or IPA file, or does not contain an IL2CPP application"); + throw new InvalidOperationException("The supplied package is not an APK or IPA file, or does not contain a complete IL2CPP application"); return await LoadMetadataAsync(streams.Value.Metadata) && await LoadBinaryAsync(streams.Value.Binary); } diff --git a/Il2CppInspector.GUI/MainWindow.xaml b/Il2CppInspector.GUI/MainWindow.xaml index 2d7c241..011e087 100644 --- a/Il2CppInspector.GUI/MainWindow.xaml +++ b/Il2CppInspector.GUI/MainWindow.xaml @@ -451,7 +451,7 @@ Option 2 - Select or drag & drop an APK or IPA file + Select or drag & drop one or more APK files or an IPA file Encrypted IPA files are not supported diff --git a/Il2CppInspector.GUI/MainWindow.xaml.cs b/Il2CppInspector.GUI/MainWindow.xaml.cs index 15c5a30..9ed6852 100644 --- a/Il2CppInspector.GUI/MainWindow.xaml.cs +++ b/Il2CppInspector.GUI/MainWindow.xaml.cs @@ -137,28 +137,30 @@ namespace Il2CppInspectorGUI } /// - /// Select APK or IPA package file + /// Select APK or IPA package files /// private async void BtnSelectPackageFile_OnClick(object sender, RoutedEventArgs e) { var openFileDialog = new OpenFileDialog { Filter = "Android/iOS Application Package (*.apk;*.ipa;*.zip)|*.apk;*.ipa;*.zip|All files (*.*)|*.*", - CheckFileExists = true + CheckFileExists = true, + Multiselect = true }; if (openFileDialog.ShowDialog() == true) { - await LoadPackageAsync(openFileDialog.FileName); + await LoadPackageAsync(openFileDialog.FileNames); } } // Load the package file - private async Task LoadPackageAsync(string filename) { + private async Task LoadPackageAsync(string filename) => await LoadPackageAsync(new[] { filename }); + private async Task LoadPackageAsync(IEnumerable filenames) { var app = (App) Application.Current; areaBusyIndicator.Visibility = Visibility.Visible; grdFirstPage.Visibility = Visibility.Hidden; // Load the package - if (await app.LoadPackageAsync(filename)) { + if (await app.LoadPackageAsync(filenames)) { // Package loaded successfully areaBusyIndicator.Visibility = Visibility.Hidden; @@ -556,7 +558,7 @@ namespace Il2CppInspectorGUI } } // Metadata and binary - else if (files.Length == 2) { + else if (files.Length == 2 && (files[0].ToLower().EndsWith(".dat") || files[1].ToLower().EndsWith(".dat"))) { var metadataIndex = files[0].ToLower().EndsWith(".dat") ? 0 : 1; var binaryIndex = 1 - metadataIndex; @@ -566,6 +568,10 @@ namespace Il2CppInspectorGUI if (btnSelectBinaryFile.Visibility == Visibility.Visible) await LoadBinaryAsync(files[binaryIndex]); } + // Split APK (files.Length >= 2) + else { + await LoadPackageAsync(files); + } } // Binary (on 2nd page) else if (btnSelectBinaryFile.Visibility == Visibility.Visible)