diff --git a/BinaryObjectScanner/FileType/BZip2.cs b/BinaryObjectScanner/FileType/BZip2.cs index 916c905c..25276784 100644 --- a/BinaryObjectScanner/FileType/BZip2.cs +++ b/BinaryObjectScanner/FileType/BZip2.cs @@ -31,13 +31,23 @@ namespace BinaryObjectScanner.FileType // Try opening the stream using var bz2File = new BZip2InputStream(stream, true); - // Create the output file path - Directory.CreateDirectory(outDir); - string tempFile = Path.Combine(outDir, Guid.NewGuid().ToString()); + // Ensure directory separators are consistent + string filename = Guid.NewGuid().ToString(); + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); + if (directoryName != null && !Directory.Exists(directoryName)) + Directory.CreateDirectory(directoryName); // Extract the file - using FileStream fs = File.OpenWrite(tempFile); + using FileStream fs = File.OpenWrite(filename); bz2File.CopyTo(fs); + fs.Flush(); return true; } diff --git a/BinaryObjectScanner/FileType/CFB.cs b/BinaryObjectScanner/FileType/CFB.cs index d8362520..2d33e5e0 100644 --- a/BinaryObjectScanner/FileType/CFB.cs +++ b/BinaryObjectScanner/FileType/CFB.cs @@ -66,13 +66,21 @@ namespace BinaryObjectScanner.FileType decoded = decoded.Replace(c, '_'); } - string tempFile = Path.Combine(outDir, decoded); - var directoryName = Path.GetDirectoryName(tempFile); + // Ensure directory separators are consistent + if (Path.DirectorySeparatorChar == '\\') + decoded = decoded.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + decoded = decoded.Replace('\\', '/'); + + // Ensure the full output directory exists + decoded = Path.Combine(outDir, decoded); + var directoryName = Path.GetDirectoryName(decoded); if (directoryName != null && !Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); - using Stream fs = File.OpenWrite(tempFile); + using Stream fs = File.OpenWrite(decoded); fs.Write(strData, 0, strData.Length); + fs.Flush(); } catch (Exception ex) { diff --git a/BinaryObjectScanner/FileType/GZIP.cs b/BinaryObjectScanner/FileType/GZIP.cs index c7047f04..7569048a 100644 --- a/BinaryObjectScanner/FileType/GZIP.cs +++ b/BinaryObjectScanner/FileType/GZIP.cs @@ -31,13 +31,23 @@ namespace BinaryObjectScanner.FileType // Try opening the stream using var gzipFile = new GZipStream(stream, CompressionMode.Decompress, true); - // Create the output file path - Directory.CreateDirectory(outDir); - string tempFile = Path.Combine(outDir, Guid.NewGuid().ToString()); + // Ensure directory separators are consistent + string filename = Guid.NewGuid().ToString(); + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); + if (directoryName != null && !Directory.Exists(directoryName)) + Directory.CreateDirectory(directoryName); // Extract the file - using FileStream fs = File.OpenWrite(tempFile); + using FileStream fs = File.OpenWrite(filename); gzipFile.CopyTo(fs); + fs.Flush(); return true; } diff --git a/BinaryObjectScanner/FileType/InstallShieldCAB.cs b/BinaryObjectScanner/FileType/InstallShieldCAB.cs index 4d923a55..0dfbf906 100644 --- a/BinaryObjectScanner/FileType/InstallShieldCAB.cs +++ b/BinaryObjectScanner/FileType/InstallShieldCAB.cs @@ -71,22 +71,20 @@ namespace BinaryObjectScanner.FileType if (!cabfile.HeaderList.FileIsValid(i)) continue; - string tempFile; - try - { - string? filename = cabfile.HeaderList.GetFileName(i); - tempFile = Path.Combine(outDir, filename ?? string.Empty); - } - catch - { - tempFile = Path.Combine(outDir, $"BAD_FILENAME{i}"); - } + // Ensure directory separators are consistent + string filename = cabfile.HeaderList.GetFileName(i) ?? $"BAD_FILENAME{i}"; + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); - var directoryName = Path.GetDirectoryName(tempFile); + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); if (directoryName != null && !Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); - cabfile.FileSave(i, tempFile); + cabfile.FileSave(i, filename); } catch (Exception ex) { diff --git a/BinaryObjectScanner/FileType/MPQ.cs b/BinaryObjectScanner/FileType/MPQ.cs index 35a8ccbd..e3f22646 100644 --- a/BinaryObjectScanner/FileType/MPQ.cs +++ b/BinaryObjectScanner/FileType/MPQ.cs @@ -56,14 +56,23 @@ namespace BinaryObjectScanner.FileType // Loop over each entry foreach (string sub in listfileLines) { + // Ensure directory separators are consistent + string filename = sub; + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); + if (directoryName != null && !Directory.Exists(directoryName)) + Directory.CreateDirectory(directoryName); + + // Try to write the data try { - string tempFile = Path.Combine(outDir, sub); - var directoryName = Path.GetDirectoryName(tempFile); - if (directoryName != null && !Directory.Exists(directoryName)) - Directory.CreateDirectory(directoryName); - - mpqArchive.ExtractFile(sub, tempFile); + mpqArchive.ExtractFile(sub, filename); } catch (System.Exception ex) { diff --git a/BinaryObjectScanner/FileType/PKZIP.cs b/BinaryObjectScanner/FileType/PKZIP.cs index f7a9ec3c..1b418d9d 100644 --- a/BinaryObjectScanner/FileType/PKZIP.cs +++ b/BinaryObjectScanner/FileType/PKZIP.cs @@ -64,12 +64,20 @@ namespace BinaryObjectScanner.FileType if (!entry.IsComplete) continue; - string tempFile = Path.Combine(outDir, entry.Key); - var directoryName = Path.GetDirectoryName(tempFile); + // Ensure directory separators are consistent + string filename = entry.Key; + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); if (directoryName != null && !Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); - entry.WriteToFile(tempFile); + entry.WriteToFile(filename); } catch (Exception ex) { diff --git a/BinaryObjectScanner/FileType/RAR.cs b/BinaryObjectScanner/FileType/RAR.cs index 277534c0..ea44a146 100644 --- a/BinaryObjectScanner/FileType/RAR.cs +++ b/BinaryObjectScanner/FileType/RAR.cs @@ -67,14 +67,14 @@ namespace BinaryObjectScanner.FileType return false; #endif } - + #if NET462_OR_GREATER || NETCOREAPP - + /// /// Extraction method for non-solid archives. This iterates over each entry in the archive to extract every /// file individually, in order to extract all valid files from the archive. /// - private bool ExtractNonSolid(RarArchive rarFile, string outDir, bool includeDebug) + private static bool ExtractNonSolid(RarArchive rarFile, string outDir, bool includeDebug) { foreach (var entry in rarFile.Entries) { @@ -92,12 +92,20 @@ namespace BinaryObjectScanner.FileType if (!entry.IsComplete) continue; - string tempFile = Path.Combine(outDir, entry.Key); - var directoryName = Path.GetDirectoryName(tempFile); + // Ensure directory separators are consistent + string filename = entry.Key; + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); if (directoryName != null && !Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); - entry.WriteToFile(tempFile); + entry.WriteToFile(filename); } catch (Exception ex) { @@ -106,12 +114,12 @@ namespace BinaryObjectScanner.FileType } return true; } - + /// /// Extraction method for solid archives. Uses ExtractAllEntries because extraction for solid archives must be /// done sequentially, and files beyond a corrupted point in a solid archive will be unreadable anyways. /// - private bool ExtractSolid(RarArchive rarFile, string outDir, bool includeDebug) + private static bool ExtractSolid(RarArchive rarFile, string outDir, bool includeDebug) { try { diff --git a/BinaryObjectScanner/FileType/SevenZip.cs b/BinaryObjectScanner/FileType/SevenZip.cs index 04fcfab2..03c18677 100644 --- a/BinaryObjectScanner/FileType/SevenZip.cs +++ b/BinaryObjectScanner/FileType/SevenZip.cs @@ -65,13 +65,13 @@ namespace BinaryObjectScanner.FileType return false; #endif } - + #if NET462_OR_GREATER || NETCOREAPP /// /// Extraction method for non-solid archives. This iterates over each entry in the archive to extract every /// file individually, in order to extract all valid files from the archive. /// - private bool ExtractNonSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug) + private static bool ExtractNonSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug) { foreach (var entry in sevenZip.Entries) { @@ -89,12 +89,20 @@ namespace BinaryObjectScanner.FileType if (!entry.IsComplete) continue; - string tempFile = Path.Combine(outDir, entry.Key); - var directoryName = Path.GetDirectoryName(tempFile); + // Ensure directory separators are consistent + string filename = entry.Key; + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); if (directoryName != null && !Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); - entry.WriteToFile(tempFile); + entry.WriteToFile(filename); } catch (Exception ex) { @@ -103,24 +111,24 @@ namespace BinaryObjectScanner.FileType } return true; } - + /// /// Extraction method for solid archives. Uses ExtractAllEntries because extraction for solid archives must be /// done sequentially, and files beyond a corrupted point in a solid archive will be unreadable anyways. /// - private bool ExtractSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug) + private static bool ExtractSolid(SevenZipArchive sevenZip, string outDir, bool includeDebug) { try { if (!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); - + sevenZip.WriteToDirectory(outDir, new ExtractionOptions() { ExtractFullPath = true, - Overwrite = true, + Overwrite = true, }); - + } catch (Exception ex) { diff --git a/BinaryObjectScanner/FileType/TapeArchive.cs b/BinaryObjectScanner/FileType/TapeArchive.cs index 227e3130..73768f99 100644 --- a/BinaryObjectScanner/FileType/TapeArchive.cs +++ b/BinaryObjectScanner/FileType/TapeArchive.cs @@ -54,12 +54,20 @@ namespace BinaryObjectScanner.FileType if (!entry.IsComplete) continue; - string tempFile = Path.Combine(outDir, entry.Key); - var directoryName = Path.GetDirectoryName(tempFile); + // Ensure directory separators are consistent + string filename = entry.Key; + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); if (directoryName != null && !Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName); - entry.WriteToFile(tempFile); + entry.WriteToFile(filename); } catch (Exception ex) { diff --git a/BinaryObjectScanner/FileType/XZ.cs b/BinaryObjectScanner/FileType/XZ.cs index 4c63a7d7..fcfa6eed 100644 --- a/BinaryObjectScanner/FileType/XZ.cs +++ b/BinaryObjectScanner/FileType/XZ.cs @@ -34,13 +34,23 @@ namespace BinaryObjectScanner.FileType // Try opening the stream using var xzFile = new XZStream(stream); - // Create the output file path - Directory.CreateDirectory(outDir); - string tempFile = Path.Combine(outDir, Guid.NewGuid().ToString()); + // Ensure directory separators are consistent + string filename = Guid.NewGuid().ToString(); + if (Path.DirectorySeparatorChar == '\\') + filename = filename.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + filename = filename.Replace('\\', '/'); + + // Ensure the full output directory exists + filename = Path.Combine(outDir, filename); + var directoryName = Path.GetDirectoryName(filename); + if (directoryName != null && !Directory.Exists(directoryName)) + Directory.CreateDirectory(directoryName); // Extract the file - using FileStream fs = File.OpenWrite(tempFile); + using FileStream fs = File.OpenWrite(filename); xzFile.CopyTo(fs); + fs.Flush(); return true; }