diff --git a/APKToolGUI/APKToolGUI.csproj b/APKToolGUI/APKToolGUI.csproj index 52ebc7d..dd323ab 100644 --- a/APKToolGUI/APKToolGUI.csproj +++ b/APKToolGUI/APKToolGUI.csproj @@ -112,6 +112,9 @@ + + ..\packages\ProDotNetZip.1.20.0\lib\netstandard2.0\ProDotNetZip.dll + ..\packages\ResourceLoader.3.3.1\lib\netstandard2.0\ResourceLoader.dll @@ -135,6 +138,7 @@ True + ..\packages\System.Diagnostics.DiagnosticSource.9.0.3\lib\net462\System.Diagnostics.DiagnosticSource.dll @@ -144,6 +148,7 @@ True True + ..\packages\System.Formats.Nrbf.9.0.3\lib\net462\System.Formats.Nrbf.dll @@ -157,17 +162,7 @@ True True - - ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll - True - True - - - ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll - True - True - ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll True @@ -192,6 +187,7 @@ ..\packages\System.Memory.4.6.1\lib\net462\System.Memory.dll + ..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll True @@ -241,6 +237,9 @@ True + + ..\packages\System.Security.AccessControl.6.0.1\lib\net461\System.Security.AccessControl.dll + ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll True @@ -261,11 +260,22 @@ True True + + ..\packages\System.Security.Permissions.9.0.3\lib\net462\System.Security.Permissions.dll + + + ..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll + + + + ..\packages\System.Text.Encoding.CodePages.9.0.3\lib\net462\System.Text.Encoding.CodePages.dll + ..\packages\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll True True + diff --git a/APKToolGUI/Forms/FormMain.cs b/APKToolGUI/Forms/FormMain.cs index 6405cd8..4367970 100644 --- a/APKToolGUI/Forms/FormMain.cs +++ b/APKToolGUI/Forms/FormMain.cs @@ -10,18 +10,12 @@ using APKToolGUI.Properties; using APKToolGUI.ApkTool; using APKToolGUI.Utils; using System.Threading.Tasks; -using System.Collections.Generic; using APKToolGUI.Handlers; using Microsoft.WindowsAPICodePack.Taskbar; using System.Media; using System.Linq; -using System.Windows.Interop; -using System.Security.Cryptography; -using static System.Windows.Forms.VisualStyles.VisualStyleElement; using APKToolGUI.Controls; -using Dark.Net; -using APKEasyTool; -using System.IO.Compression; +using Ionic.Zip; namespace APKToolGUI { @@ -196,35 +190,35 @@ namespace APKToolGUI { Directory.CreateDirectory(splitPath); - using (ZipArchive archive = ZipFile.OpenRead(file)) + using (ZipFile zipDest = ZipFile.Read(file)) { bool mainApkFound = false; - foreach (ZipArchiveEntry entry in archive.Entries) + foreach (ZipEntry entry in zipDest.Entries) { - if (!mainApkFound && !entry.FullName.Contains("config.") && entry.FullName.EndsWith(".apk")) + if (!mainApkFound && !entry.FileName.Contains("config.") && entry.FileName.EndsWith(".apk")) { - Debug.WriteLine("Found main APK: " + entry.FullName); - string extractPath = Path.Combine(splitPath, entry.FullName); + Debug.WriteLine("Found main APK: " + entry.FileName); + string extractPath = Path.Combine(splitPath, entry.FileName); Directory.CreateDirectory(Path.GetDirectoryName(extractPath)); - entry.ExtractToFile(extractPath, true); + entry.Extract(splitPath, ExtractExistingFileAction.OverwriteSilently); file = extractPath; mainApkFound = true; } - if (entry.FullName.Contains("lib/armeabi-v7a")) + if (entry.FileName.Contains("lib/armeabi-v7a")) { arch += "armeabi-v7a, "; } - if (entry.FullName.Contains("lib/arm64-v8a")) + if (entry.FileName.Contains("lib/arm64-v8a")) { arch += "arm64-v8a, "; } - if (entry.FullName.Contains("lib/x86")) + if (entry.FileName.Contains("lib/x86")) { arch += "x86, "; } - if (entry.FullName.Contains("lib/x86_64")) + if (entry.FileName.Contains("lib/x86_64")) { arch += "x86_64, "; } @@ -890,9 +884,9 @@ namespace APKToolGUI if (Directory.Exists(Path.Combine(inputFolder, "original", "META-INF"))) { string unsignedApkPath = Path.Combine(Path.GetDirectoryName(outputCompiledApkFile), Path.GetFileName(outputUnsignedApk)); - ZipUtils.AddDirectory(outputFile, Path.Combine(inputFolder, "original", "META-INF"), "META-INF"); + ZipUtils.UpdateDirectory(outputFile, Path.Combine(inputFolder, "original", "META-INF"), "META-INF"); if (File.Exists(Path.Combine(inputFolder, "original", "stamp-cert-sha256"))) - ZipUtils.AddFile(outputFile, Path.Combine(inputFolder, "original", "stamp-cert-sha256")); + ZipUtils.UpdateFile(outputFile, Path.Combine(inputFolder, "original", "stamp-cert-sha256")); ToLog(ApktoolEventType.Infomation, String.Format(Language.CopyFileTo, outputFile, unsignedApkPath)); File.Copy(outputFile, unsignedApkPath, true); } @@ -1627,7 +1621,6 @@ namespace APKToolGUI #endregion #region Fix flickering - public static void SetDoubleBuffered(System.Windows.Forms.Control c) { if (System.Windows.Forms.SystemInformation.TerminalServerSession) diff --git a/APKToolGUI/TaskBar/TaskBarJumpList.cs b/APKToolGUI/TaskBar/TaskBarJumpList.cs index 009f5de..9d02d3f 100644 --- a/APKToolGUI/TaskBar/TaskBarJumpList.cs +++ b/APKToolGUI/TaskBar/TaskBarJumpList.cs @@ -8,7 +8,7 @@ using System.Reflection; using Microsoft.WindowsAPICodePack.Shell; using APKToolGUI.Languages; -namespace APKEasyTool +namespace APKToolGUI { public class TaskBarJumpList { diff --git a/APKToolGUI/Utils/ZipUtils.cs b/APKToolGUI/Utils/ZipUtils.cs index 69b13d3..8cf287a 100644 --- a/APKToolGUI/Utils/ZipUtils.cs +++ b/APKToolGUI/Utils/ZipUtils.cs @@ -1,165 +1,160 @@ -using System; +using Ionic.Zip; +using System; +using System.Collections.Generic; using System.IO; -using System.IO.Compression; using System.Linq; using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Documents; namespace APKToolGUI.Utils { public class ZipUtils { + public static void ExtractAllStream(string path, string embeddedZip) + { + Assembly _assembly = Assembly.GetExecutingAssembly(); + Stream _zipFileStream = _assembly.GetManifestResourceStream(embeddedZip); + using (ZipFile zipFile = ZipFile.Read(_zipFileStream)) + { + zipFile.ExtractAll(path); + } + } + public static string GetFileName(string path, string fileNameContains, string folderContains = "") { - using (ZipArchive archive = ZipFile.OpenRead(path)) + using (ZipFile zipDest = ZipFile.Read(path)) { - var entry = archive.Entries - .FirstOrDefault(e => e.FullName.Contains(fileNameContains) && - (string.IsNullOrEmpty(folderContains) || e.FullName.Contains(folderContains))); - return entry != null ? Path.GetFileName(entry.FullName) : string.Empty; + foreach (ZipEntry entry in zipDest.Entries) + { + if (entry.FileName.Contains(fileNameContains) && entry.FileName.Contains(folderContains)) + return Path.GetFileName(entry.FileName); + } } + return ""; } public static string GetFileNameWithoutExtension(string path, string fileNameContains, string folderContains = "") { - using (ZipArchive archive = ZipFile.OpenRead(path)) + using (ZipFile zipDest = ZipFile.Read(path)) { - var entry = archive.Entries - .FirstOrDefault(e => e.FullName.Contains(fileNameContains) && - (string.IsNullOrEmpty(folderContains) || e.FullName.Contains(folderContains))); - return entry != null ? Path.GetFileNameWithoutExtension(entry.FullName) : string.Empty; + foreach (ZipEntry entry in zipDest.Entries) + { + if (entry.FileName.Contains(fileNameContains) && entry.FileName.Contains(folderContains)) + return Path.GetFileNameWithoutExtension(entry.FileName); + } } + return ""; } - public static bool Exists(string path, string fileNameContains, string folderContains = "") { - using (ZipArchive archive = ZipFile.OpenRead(path)) + using (ZipFile zipDest = ZipFile.Read(path)) { - return archive.Entries.Any(e => e.FullName.Contains(fileNameContains) && - (string.IsNullOrEmpty(folderContains) || e.FullName.Contains(folderContains))); + foreach (ZipEntry entry in zipDest.Entries) + { + if (entry.FileName.Contains(fileNameContains) && String.IsNullOrEmpty(folderContains)) + return true; + else if (entry.FileName.Contains(fileNameContains) && entry.FileName.Contains(folderContains)) + return true; + } + } + return false; + } + + public static void AddFile(string zipFile, string fileName, string directoryPathInArchive = "") + { + using (ZipFile zip = ZipFile.Read(zipFile)) + { + if (!String.IsNullOrEmpty(directoryPathInArchive)) + zip.AddFile(fileName, directoryPathInArchive); + else + zip.AddFile(fileName); + zip.Save(); } } - public static void AddFile(string zipPath, string filePath, string targetFolderInZip = "") + public static void UpdateFile(string zipFile, string fileName, string directoryPathInArchive = "") { - using (FileStream zipToOpen = new FileStream(zipPath, FileMode.Open)) + using (ZipFile zip = ZipFile.Read(zipFile)) { - using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)) - { - // Combine the target folder with the file name to create the entry path - string fileName = Path.GetFileName(filePath); - string entryPath = string.IsNullOrEmpty(targetFolderInZip) - ? fileName - : Path.Combine(targetFolderInZip, fileName).Replace("\\", "/"); - - // Remove the entry if it already exists - var existingEntry = archive.GetEntry(entryPath); - existingEntry?.Delete(); - - // Add the file to the archive - archive.CreateEntryFromFile(filePath, entryPath, CompressionLevel.Optimal); - - Console.WriteLine($"Added '{filePath}' to ZIP archive at '{entryPath}'."); - } + if (!String.IsNullOrEmpty(directoryPathInArchive)) + zip.UpdateFile(fileName, directoryPathInArchive); + else + zip.UpdateFile(fileName); + zip.Save(); } } public static void RemoveFile(string zipFile, string fileName) { - using (FileStream fs = new FileStream(zipFile, FileMode.OpenOrCreate)) - using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update)) + using (ZipFile zip = ZipFile.Read(zipFile)) { - var entry = archive.Entries.FirstOrDefault(e => e.FullName.Contains(fileName)); - entry?.Delete(); + bool chkresult2 = zip.Any(entry => entry.FileName.Contains(fileName)); + if (chkresult2) + { + zip.RemoveEntry(fileName); + zip.Save(); + } } } public static void ExtractFile(string path, string fileName, string destination) { - using (ZipArchive archive = ZipFile.OpenRead(path)) + using (ZipFile zip = ZipFile.Read(path)) { - var entry = archive.Entries.FirstOrDefault(e => e.FullName.Contains(fileName)); - entry?.ExtractToFile(Path.Combine(destination, Path.GetFileName(entry.FullName)), true); + bool chkresult2 = zip.Any(entry => entry.FileName.Contains(fileName)); + if (chkresult2) + { + zip.FlattenFoldersOnExtract = true; + ZipEntry e = zip[fileName]; + e.Extract(destination, ExtractExistingFileAction.OverwriteSilently); + } } } public static void ExtractAll(string path, string destination, bool flattenFoldersOnExtract = false) { - using (ZipArchive archive = ZipFile.OpenRead(path)) + using (ZipFile zip = ZipFile.Read(path)) { - foreach (var entry in archive.Entries) - { - string fullPath = flattenFoldersOnExtract - ? Path.Combine(destination, Path.GetFileName(entry.FullName)) - : Path.Combine(destination, entry.FullName); - string directoryPath = Path.GetDirectoryName(fullPath); - if (!string.IsNullOrEmpty(directoryPath)) Directory.CreateDirectory(directoryPath); - entry.ExtractToFile(fullPath, true); - } + zip.FlattenFoldersOnExtract = flattenFoldersOnExtract; + zip.ExtractAll(destination, ExtractExistingFileAction.OverwriteSilently); } } - public static void AddDirectory(string zipPath, string directoryPath, string directoryPathInArchive = "") + public static void AddDirectory(string path, string fileName, string directoryPathInArchive = "") { - if (!File.Exists(zipPath)) - { - Console.WriteLine("ZIP file does not exist."); - return; - } - - using (FileStream zipToOpen = new FileStream(zipPath, FileMode.Open)) - { - using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)) - { - foreach (string filePath in Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories)) - { - // Calculate the relative path and prepend the target folder inside the ZIP - string relativePath = GetRelativePath(directoryPath, filePath); - string entryPath = Path.Combine(directoryPathInArchive, relativePath).Replace("\\", "/"); - - // Remove the entry if it already exists - var existingEntry = archive.GetEntry(entryPath); - existingEntry?.Delete(); - - // Add the file to the archive - archive.CreateEntryFromFile(filePath, entryPath, CompressionLevel.Optimal); - } - } - } + ZipFile zip = new ZipFile(); + if (!String.IsNullOrEmpty(directoryPathInArchive)) + zip.AddDirectory(fileName, directoryPathInArchive); + else + zip.AddDirectory(fileName); + zip.Save(path); } - static string GetRelativePath(string basePath, string fullPath) + public static void UpdateDirectory(string path, string dirName, string directoryPathInArchive = "") { - // Ensure both paths are absolute - basePath = Path.GetFullPath(basePath); - fullPath = Path.GetFullPath(fullPath); - - if (!fullPath.StartsWith(basePath, StringComparison.OrdinalIgnoreCase)) + using (ZipFile zip = ZipFile.Read(path)) { - throw new ArgumentException("The fullPath is not within the basePath."); + if (!String.IsNullOrEmpty(directoryPathInArchive)) + zip.UpdateDirectory(dirName, directoryPathInArchive); + else + zip.UpdateDirectory(dirName); + zip.Save(); } - - return fullPath.Substring(basePath.Length).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); } public static void ExtractDirectory(string path, string folderName, string destination, bool flattenFoldersOnExtract = false) { - using (ZipArchive archive = ZipFile.OpenRead(path)) + using (ZipFile zip = ZipFile.Read(path)) { - foreach (ZipArchiveEntry entry in archive.Entries.Where(e => e.FullName.Contains(folderName))) + zip.FlattenFoldersOnExtract = flattenFoldersOnExtract; + foreach (ZipEntry e in zip.Where(x => x.FileName.Contains(folderName))) { - string extractPath = flattenFoldersOnExtract - ? Path.Combine(destination, Path.GetFileName(entry.FullName)) - : Path.Combine(destination, entry.FullName); - - string directoryPath = Path.GetDirectoryName(extractPath); - if (!string.IsNullOrEmpty(directoryPath)) - { - Directory.CreateDirectory(directoryPath); - } - - entry.ExtractToFile(extractPath, true); + e.Extract(destination, ExtractExistingFileAction.OverwriteSilently); } } } + } -} +} \ No newline at end of file diff --git a/APKToolGUI/app.config b/APKToolGUI/app.config index 43d8b3d..f97bd66 100644 --- a/APKToolGUI/app.config +++ b/APKToolGUI/app.config @@ -330,6 +330,14 @@ + + + + + + + + diff --git a/APKToolGUI/packages.config b/APKToolGUI/packages.config index ead8d97..8e67af0 100644 --- a/APKToolGUI/packages.config +++ b/APKToolGUI/packages.config @@ -12,6 +12,7 @@ + @@ -28,8 +29,6 @@ - - @@ -53,11 +52,15 @@ + + + +