diff --git a/BurnOutSharp/EVORE.cs b/BurnOutSharp/EVORE.cs index 22539970..9f54bb52 100644 --- a/BurnOutSharp/EVORE.cs +++ b/BurnOutSharp/EVORE.cs @@ -19,23 +19,22 @@ using System; using System.Diagnostics; using System.IO; -using System.Text; -using System.Threading; namespace BurnOutSharp { internal static class EVORE { - private struct Section + // TODO: Replace this with BurnOutSharp.ExecutableType.Microsoft.IMAGE_SECTION_HEADER + internal struct Section { public uint iVirtualSize; public uint iVirtualOffset; public uint iRawOffset; } - private const int WaitSeconds = 20; + internal const int WaitSeconds = 20; - private static Process StartSafe(string file) + internal static Process StartSafe(string file) { if (file == null || !File.Exists(file)) return null; @@ -57,7 +56,7 @@ namespace BurnOutSharp return startingprocess; } - private static string MakeTempFile(byte[] fileContent, string sExtension = ".exe") + internal static string MakeTempFile(byte[] fileContent, string sExtension = ".exe") { string filei = Guid.NewGuid().ToString(); string tempPath = Path.Combine(Path.GetTempPath(), "tmp", $"{filei}{sExtension}"); @@ -82,7 +81,7 @@ namespace BurnOutSharp return null; } - private static bool IsEXE(byte[] fileContent) + internal static bool IsEXE(byte[] fileContent) { int PEHeaderOffset = BitConverter.ToInt32(fileContent, 60); short Characteristics = BitConverter.ToInt16(fileContent, PEHeaderOffset + 22); @@ -94,7 +93,7 @@ namespace BurnOutSharp return true; } - private static string[] CopyDependentDlls(string file, byte[] fileContent) + internal static string[] CopyDependentDlls(string file, byte[] fileContent) { Section[] sections = ReadSections(fileContent); @@ -152,7 +151,7 @@ namespace BurnOutSharp return saDependentDLLs; } - private static Section[] ReadSections(byte[] fileContent) + internal static Section[] ReadSections(byte[] fileContent) { if (fileContent == null) return null; @@ -184,7 +183,7 @@ namespace BurnOutSharp return sections; } - private static uint RVA2Offset(uint RVA, Section[] sections) + internal static uint RVA2Offset(uint RVA, Section[] sections) { int i = 0; while (i != sections.Length) @@ -195,256 +194,5 @@ namespace BurnOutSharp } return 0; } - - // TODO: These should either be wrapped into their respective protections - // or they should be replaced entirely so they don't try to run on the - // machine when scanning. 16-bit applications are likely going to fail - // on nearly every machine that would be using this - #region EVORE version-search-functions - - public static string SearchProtectDiscVersion(string file, byte[] fileContent) - { - string version = ""; - DateTime timestart; - if (!IsEXE(fileContent)) - return ""; - - string tempexe = MakeTempFile(fileContent); - string[] DependentDlls = CopyDependentDlls(file, fileContent); - try - { - File.Delete(Path.Combine(Path.GetTempPath(), "a*.tmp")); - } - catch { } - try - { - File.Delete(Path.Combine(Path.GetTempPath(), "PCD*.sys")); - } - catch { } - if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) - { - try - { - File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc", "p*.dll")); - } - catch { } - } - - Process exe = StartSafe(tempexe); - if (exe == null) - return ""; - - Process[] processes = new Process[0]; - timestart = DateTime.Now; - do - { - exe.Refresh(); - string[] files = null; - - //check for ProtectDisc 8.2-x - if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) - { - files = Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"), "p*.dll"); - } - - if (files != null) - { - if (files.Length > 0) - { - FileVersionInfo fvinfo = FileVersionInfo.GetVersionInfo(files[0]); - if (fvinfo.FileVersion != "") - { - version = fvinfo.FileVersion.Replace(" ", "").Replace(",", "."); - //ProtectDisc 9 uses a ProtectDisc-Core dll version 8.0.x - if (version.StartsWith("8.0")) - version = ""; - fvinfo = null; - break; - } - } - } - - //check for ProtectDisc 7.1-8.1 - files = Directory.GetFiles(Path.GetTempPath(), "a*.tmp"); - if (files.Length > 0) - { - FileVersionInfo fvinfo = FileVersionInfo.GetVersionInfo(files[0]); - if (fvinfo.FileVersion != "") - { - version = fvinfo.FileVersion.Replace(" ", "").Replace(",", "."); - fvinfo = null; - break; - } - } - - if (exe.HasExited) - break; - - processes = Process.GetProcessesByName(exe.ProcessName); - if (processes.Length == 2) - { - processes[0].Refresh(); - processes[1].Refresh(); - if (processes[1].WorkingSet64 > exe.WorkingSet64) - exe = processes[1]; - else if (processes[0].WorkingSet64 > exe.WorkingSet64) //else if (processes[0].Modules.Count > exe.Modules.Count) - exe = processes[0]; - } - } while (processes.Length > 0 && DateTime.Now.Subtract(timestart).TotalSeconds < WaitSeconds); - - Thread.Sleep(500); - if (!exe.HasExited) - { - processes = Process.GetProcessesByName(exe.ProcessName); - if (processes.Length == 2) - { - try - { - processes[0].Kill(); - } - catch { } - processes[0].Close(); - try - { - processes[1].Kill(); - } - catch { } - } - else - { - exe.Refresh(); - try - { - exe.Kill(); - } - catch { } - } - } - - exe.Close(); - Thread.Sleep(500); - if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) - { - try - { - File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc", "p*.dll")); - } - catch { } - } - - try - { - File.Delete(Path.Combine(Path.GetTempPath(), "a*.tmp")); - } - catch { } - - try - { - File.Delete(Path.Combine(Path.GetTempPath(), "PCD*.sys")); - } - catch { } - File.Delete(tempexe); - if (DependentDlls != null) - { - for (int i = 0; i < DependentDlls.Length; i++) - { - try - { - File.Delete(DependentDlls[i]); - } - catch (Exception ex) - { - Console.WriteLine("!error while deleting file " + DependentDlls[i] + "; " + ex.Message); - } - } - } - - return version; - } - - public static string SearchSafeDiscVersion(string file, byte[] fileContent) - { - Process exe = new Process(); - string version = ""; - DateTime timestart; - if (!IsEXE(fileContent)) - return ""; - - string tempexe = MakeTempFile(fileContent); - string[] DependentDlls = CopyDependentDlls(file, fileContent); - try - { - Directory.Delete(Path.Combine(Path.GetTempPath(), "~e*"), true); - } - catch { } - try - { - File.Delete(Path.Combine(Path.GetTempPath(), "~e*")); - } - catch { } - - exe = StartSafe(tempexe); - if (exe == null) - return ""; - - timestart = DateTime.Now; - do - { - if (Directory.GetDirectories(Path.GetTempPath(), "~e*").Length > 0) - { - string[] files = Directory.GetFiles(Directory.GetDirectories(Path.GetTempPath(), "~e*")[0], "~de*.tmp"); - if (files.Length > 0) - { - StreamReader sr; - try - { - sr = new StreamReader(files[0], Encoding.Default); - string FileContent = sr.ReadToEnd(); - sr.Close(); - int position = FileContent.IndexOf("%ld.%ld.%ld, %ld, %s,") - 1; - if (position > -1) - version = FileContent.Substring(position + 28, 12); - break; - } - catch { } - } - } - } while (!exe.HasExited && DateTime.Now.Subtract(timestart).TotalSeconds < WaitSeconds); - - if (!exe.HasExited) - exe.Kill(); - exe.Close(); - - try - { - Directory.Delete(Path.Combine(Path.GetTempPath(), "~e*"), true); - } - catch { } - try - { - File.Delete(Path.Combine(Path.GetTempPath(), "~e*")); - File.Delete(tempexe); - } - catch { } - - if (DependentDlls != null) - { - for (int i = 0; i < DependentDlls.Length; i--) - { - try - { - File.Delete(DependentDlls[i]); - } - catch (Exception ex) - { - Console.WriteLine("!error while deleting file " + DependentDlls[i] + "; " + ex.Message); - } - } - } - - return version; - } - - #endregion } } diff --git a/BurnOutSharp/ProtectionType/ProtectDisc.cs b/BurnOutSharp/ProtectionType/ProtectDisc.cs index 0a543e0f..d99d6400 100644 --- a/BurnOutSharp/ProtectionType/ProtectDisc.cs +++ b/BurnOutSharp/ProtectionType/ProtectDisc.cs @@ -1,5 +1,8 @@ using System; +using System.Diagnostics; +using System.IO; using System.Linq; +using System.Threading; namespace BurnOutSharp.ProtectionType { @@ -11,7 +14,7 @@ namespace BurnOutSharp.ProtectionType byte[] check = new byte[] { 0x48, 0xFA, 0x4D, 0x45, 0x54, 0x49, 0x4E, 0x46 }; if (fileContent.Contains(check, out int position)) { - string version = EVORE.SearchProtectDiscVersion(file, fileContent); + string version = SearchProtectDiscVersion(file, fileContent); if (version.Length > 0) { string[] astrVersionArray = version.Split('.'); @@ -31,7 +34,7 @@ namespace BurnOutSharp.ProtectionType check = new byte[] { 0x41, 0x43, 0x45, 0x2D, 0x50, 0x43, 0x44 }; if (fileContent.Contains(check, out position)) { - string version = EVORE.SearchProtectDiscVersion(file, fileContent); + string version = SearchProtectDiscVersion(file, fileContent); if (version.Length > 0) { string[] astrVersionArray = version.Split('.'); @@ -168,5 +171,166 @@ namespace BurnOutSharp.ProtectionType return ""; } + + // TODO: Analyze this method and figure out if this can be done without attempting execution + private static string SearchProtectDiscVersion(string file, byte[] fileContent) + { + string version = ""; + DateTime timestart; + if (!EVORE.IsEXE(fileContent)) + return ""; + + string tempexe = EVORE.MakeTempFile(fileContent); + string[] DependentDlls = EVORE.CopyDependentDlls(file, fileContent); + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "a*.tmp")); + } + catch { } + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "PCD*.sys")); + } + catch { } + if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) + { + try + { + File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc", "p*.dll")); + } + catch { } + } + + Process exe = EVORE.StartSafe(tempexe); + if (exe == null) + return ""; + + Process[] processes = new Process[0]; + timestart = DateTime.Now; + do + { + exe.Refresh(); + string[] files = null; + + //check for ProtectDisc 8.2-x + if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) + { + files = Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"), "p*.dll"); + } + + if (files != null) + { + if (files.Length > 0) + { + FileVersionInfo fvinfo = FileVersionInfo.GetVersionInfo(files[0]); + if (fvinfo.FileVersion != "") + { + version = fvinfo.FileVersion.Replace(" ", "").Replace(",", "."); + //ProtectDisc 9 uses a ProtectDisc-Core dll version 8.0.x + if (version.StartsWith("8.0")) + version = ""; + fvinfo = null; + break; + } + } + } + + //check for ProtectDisc 7.1-8.1 + files = Directory.GetFiles(Path.GetTempPath(), "a*.tmp"); + if (files.Length > 0) + { + FileVersionInfo fvinfo = FileVersionInfo.GetVersionInfo(files[0]); + if (fvinfo.FileVersion != "") + { + version = fvinfo.FileVersion.Replace(" ", "").Replace(",", "."); + fvinfo = null; + break; + } + } + + if (exe.HasExited) + break; + + processes = Process.GetProcessesByName(exe.ProcessName); + if (processes.Length == 2) + { + processes[0].Refresh(); + processes[1].Refresh(); + if (processes[1].WorkingSet64 > exe.WorkingSet64) + exe = processes[1]; + else if (processes[0].WorkingSet64 > exe.WorkingSet64) //else if (processes[0].Modules.Count > exe.Modules.Count) + exe = processes[0]; + } + } while (processes.Length > 0 && DateTime.Now.Subtract(timestart).TotalSeconds < EVORE.WaitSeconds); + + Thread.Sleep(500); + if (!exe.HasExited) + { + processes = Process.GetProcessesByName(exe.ProcessName); + if (processes.Length == 2) + { + try + { + processes[0].Kill(); + } + catch { } + processes[0].Close(); + try + { + processes[1].Kill(); + } + catch { } + } + else + { + exe.Refresh(); + try + { + exe.Kill(); + } + catch { } + } + } + + exe.Close(); + Thread.Sleep(500); + if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) + { + try + { + File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc", "p*.dll")); + } + catch { } + } + + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "a*.tmp")); + } + catch { } + + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "PCD*.sys")); + } + catch { } + File.Delete(tempexe); + if (DependentDlls != null) + { + for (int i = 0; i < DependentDlls.Length; i++) + { + try + { + File.Delete(DependentDlls[i]); + } + catch (Exception ex) + { + Console.WriteLine("!error while deleting file " + DependentDlls[i] + "; " + ex.Message); + } + } + } + + return version; + } } } diff --git a/BurnOutSharp/ProtectionType/SafeDisc.cs b/BurnOutSharp/ProtectionType/SafeDisc.cs index ca666724..8661fe07 100644 --- a/BurnOutSharp/ProtectionType/SafeDisc.cs +++ b/BurnOutSharp/ProtectionType/SafeDisc.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; +using System.Text; namespace BurnOutSharp.ProtectionType { @@ -25,7 +27,7 @@ namespace BurnOutSharp.ProtectionType check = new byte[] { 0x00, 0x00, 0x42, 0x6F, 0x47, 0x5F }; if (fileContent.Contains(check, out position)) { - string version = EVORE.SearchSafeDiscVersion(file, fileContent); + string version = SearchSafeDiscVersion(file, fileContent); if (version.Length > 0) return $"SafeDisc {version}" + (includePosition ? $" (Index {position})" : string.Empty); @@ -36,7 +38,7 @@ namespace BurnOutSharp.ProtectionType check = new byte[] { 0x73, 0x74, 0x78, 0x74, 0x37, 0x37, 0x34 }; if (fileContent.Contains(check, out position)) { - string version = EVORE.SearchSafeDiscVersion(file, fileContent); + string version = SearchSafeDiscVersion(file, fileContent); if (version.Length > 0) return $"SafeDisc {version}" + (includePosition ? $" (Index {position})" : string.Empty); @@ -47,7 +49,7 @@ namespace BurnOutSharp.ProtectionType check = new byte[] { 0x73, 0x74, 0x78, 0x74, 0x33, 0x37, 0x31 }; if (fileContent.Contains(check, out position)) { - string version = EVORE.SearchSafeDiscVersion(file, fileContent); + string version = SearchSafeDiscVersion(file, fileContent); if (version.Length > 0) return $"SafeDisc {version}" + (includePosition ? $" (Index {position})" : string.Empty); @@ -239,5 +241,89 @@ namespace BurnOutSharp.ProtectionType return $"{version}.{subVersion:00}.{subsubVersion:000}"; } + + // TODO: Analyze this method and figure out if this can be done without attempting execution + private static string SearchSafeDiscVersion(string file, byte[] fileContent) + { + Process exe; + string version = ""; + DateTime timestart; + if (!EVORE.IsEXE(fileContent)) + return ""; + + string tempexe = EVORE.MakeTempFile(fileContent); + string[] DependentDlls = EVORE.CopyDependentDlls(file, fileContent); + try + { + Directory.Delete(Path.Combine(Path.GetTempPath(), "~e*"), true); + } + catch { } + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "~e*")); + } + catch { } + + exe = EVORE.StartSafe(tempexe); + if (exe == null) + return ""; + + timestart = DateTime.Now; + do + { + if (Directory.GetDirectories(Path.GetTempPath(), "~e*").Length > 0) + { + string[] files = Directory.GetFiles(Directory.GetDirectories(Path.GetTempPath(), "~e*")[0], "~de*.tmp"); + if (files.Length > 0) + { + StreamReader sr; + try + { + sr = new StreamReader(files[0], Encoding.Default); + string FileContent = sr.ReadToEnd(); + sr.Close(); + int position = FileContent.IndexOf("%ld.%ld.%ld, %ld, %s,") - 1; + if (position > -1) + version = FileContent.Substring(position + 28, 12); + break; + } + catch { } + } + } + } while (!exe.HasExited && DateTime.Now.Subtract(timestart).TotalSeconds < EVORE.WaitSeconds); + + if (!exe.HasExited) + exe.Kill(); + exe.Close(); + + try + { + Directory.Delete(Path.Combine(Path.GetTempPath(), "~e*"), true); + } + catch { } + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "~e*")); + File.Delete(tempexe); + } + catch { } + + if (DependentDlls != null) + { + for (int i = 0; i < DependentDlls.Length; i--) + { + try + { + File.Delete(DependentDlls[i]); + } + catch (Exception ex) + { + Console.WriteLine("!error while deleting file " + DependentDlls[i] + "; " + ex.Message); + } + } + } + + return version; + } } } diff --git a/BurnOutSharp/ProtectionType/VOBProtectCDDVD.cs b/BurnOutSharp/ProtectionType/VOBProtectCDDVD.cs index 1b3366f1..e4f68806 100644 --- a/BurnOutSharp/ProtectionType/VOBProtectCDDVD.cs +++ b/BurnOutSharp/ProtectionType/VOBProtectCDDVD.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; +using System.Threading; namespace BurnOutSharp.ProtectionType { @@ -22,7 +24,7 @@ namespace BurnOutSharp.ProtectionType if (version.Length > 0) return $"VOB ProtectCD/DVD {version}" + (includePosition ? $" (Index {position})" : string.Empty); - version = EVORE.SearchProtectDiscVersion(file, fileContent); + version = SearchProtectDiscVersion(file, fileContent); if (version.Length > 0) { if (version.StartsWith("2")) @@ -89,5 +91,166 @@ namespace BurnOutSharp.ProtectionType return ""; } + + // TODO: Analyze this method and figure out if this can be done without attempting execution + private static string SearchProtectDiscVersion(string file, byte[] fileContent) + { + string version = ""; + DateTime timestart; + if (!EVORE.IsEXE(fileContent)) + return ""; + + string tempexe = EVORE.MakeTempFile(fileContent); + string[] DependentDlls = EVORE.CopyDependentDlls(file, fileContent); + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "a*.tmp")); + } + catch { } + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "PCD*.sys")); + } + catch { } + if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) + { + try + { + File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc", "p*.dll")); + } + catch { } + } + + Process exe = EVORE.StartSafe(tempexe); + if (exe == null) + return ""; + + Process[] processes = new Process[0]; + timestart = DateTime.Now; + do + { + exe.Refresh(); + string[] files = null; + + //check for ProtectDisc 8.2-x + if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) + { + files = Directory.GetFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"), "p*.dll"); + } + + if (files != null) + { + if (files.Length > 0) + { + FileVersionInfo fvinfo = FileVersionInfo.GetVersionInfo(files[0]); + if (fvinfo.FileVersion != "") + { + version = fvinfo.FileVersion.Replace(" ", "").Replace(",", "."); + //ProtectDisc 9 uses a ProtectDisc-Core dll version 8.0.x + if (version.StartsWith("8.0")) + version = ""; + fvinfo = null; + break; + } + } + } + + //check for ProtectDisc 7.1-8.1 + files = Directory.GetFiles(Path.GetTempPath(), "a*.tmp"); + if (files.Length > 0) + { + FileVersionInfo fvinfo = FileVersionInfo.GetVersionInfo(files[0]); + if (fvinfo.FileVersion != "") + { + version = fvinfo.FileVersion.Replace(" ", "").Replace(",", "."); + fvinfo = null; + break; + } + } + + if (exe.HasExited) + break; + + processes = Process.GetProcessesByName(exe.ProcessName); + if (processes.Length == 2) + { + processes[0].Refresh(); + processes[1].Refresh(); + if (processes[1].WorkingSet64 > exe.WorkingSet64) + exe = processes[1]; + else if (processes[0].WorkingSet64 > exe.WorkingSet64) //else if (processes[0].Modules.Count > exe.Modules.Count) + exe = processes[0]; + } + } while (processes.Length > 0 && DateTime.Now.Subtract(timestart).TotalSeconds < EVORE.WaitSeconds); + + Thread.Sleep(500); + if (!exe.HasExited) + { + processes = Process.GetProcessesByName(exe.ProcessName); + if (processes.Length == 2) + { + try + { + processes[0].Kill(); + } + catch { } + processes[0].Close(); + try + { + processes[1].Kill(); + } + catch { } + } + else + { + exe.Refresh(); + try + { + exe.Kill(); + } + catch { } + } + } + + exe.Close(); + Thread.Sleep(500); + if (Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc"))) + { + try + { + File.Delete(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ProtectDisc", "p*.dll")); + } + catch { } + } + + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "a*.tmp")); + } + catch { } + + try + { + File.Delete(Path.Combine(Path.GetTempPath(), "PCD*.sys")); + } + catch { } + File.Delete(tempexe); + if (DependentDlls != null) + { + for (int i = 0; i < DependentDlls.Length; i++) + { + try + { + File.Delete(DependentDlls[i]); + } + catch (Exception ex) + { + Console.WriteLine("!error while deleting file " + DependentDlls[i] + "; " + ex.Message); + } + } + } + + return version; + } } }