From b116e487d34fd3e4863d19b4ee224610d0b1313b Mon Sep 17 00:00:00 2001 From: TheRogueArchivist Date: Sun, 6 Nov 2022 22:30:59 -0700 Subject: [PATCH] Overhaul Freelock (#170) * Overhaul Freelock * Overhaul Freelock, including notes and new checks, along with confirming the existing checks. * Add text-based checks for Freelock. * Update README. * Fix whitespace and re-add return * Fix whitespace and re-add return --- BurnOutSharp/FileType/Textfile.cs | 17 +++++++ BurnOutSharp/ProtectionType/FreeLock.cs | 63 +++++++++++++++++++++++-- README.md | 2 +- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/BurnOutSharp/FileType/Textfile.cs b/BurnOutSharp/FileType/Textfile.cs index 56457fde..6b596fa2 100644 --- a/BurnOutSharp/FileType/Textfile.cs +++ b/BurnOutSharp/FileType/Textfile.cs @@ -47,6 +47,10 @@ namespace BurnOutSharp.FileType if (magic.StartsWith(new byte?[] { 0x3F, 0x5F, 0x03, 0x00 })) return true; + // "Description in Zip" + if (string.Equals(extension?.TrimStart('.'), "diz", StringComparison.OrdinalIgnoreCase)) + return true; + // Setup information if (string.Equals(extension?.TrimStart('.'), "inf", StringComparison.OrdinalIgnoreCase)) return true; @@ -104,6 +108,19 @@ namespace BurnOutSharp.FileType else if (fileContent.Contains("serial number is located")) Utilities.AppendToDictionary(protections, file, "CD-Key / Serial"); + // Freelock + // Found in "FILE_ID.DIZ" distributed with Freelock. + if (fileContent.Contains("FREELOCK 1.0")) + Utilities.AppendToDictionary(protections, file, "Freelock 1.0"); + else if (fileContent.Contains("FREELOCK 1.2")) + Utilities.AppendToDictionary(protections, file, "Freelock 1.2"); + else if (fileContent.Contains("FREELOCK 1.2a")) + Utilities.AppendToDictionary(protections, file, "Freelock 1.2a"); + else if (fileContent.Contains("FREELOCK 1.3")) + Utilities.AppendToDictionary(protections, file, "Freelock 1.3"); + else if (fileContent.Contains("FREELOCK")) + Utilities.AppendToDictionary(protections, file, "Freelock"); + // MediaCloQ if (fileContent.Contains("SunnComm MediaCloQ")) Utilities.AppendToDictionary(protections, file, "MediaCloQ"); diff --git a/BurnOutSharp/ProtectionType/FreeLock.cs b/BurnOutSharp/ProtectionType/FreeLock.cs index d7e1ec82..5c83f459 100644 --- a/BurnOutSharp/ProtectionType/FreeLock.cs +++ b/BurnOutSharp/ProtectionType/FreeLock.cs @@ -5,14 +5,55 @@ using BurnOutSharp.Matching; namespace BurnOutSharp.ProtectionType { - public class FreeLock : IPathCheck + /// + /// Freelock is software intended to allow users to burn a copy protected PSX CD-R. + /// It accomplishes this by adding additional dummy tracks to an image before burning, and then attempting to use a corrupted file to burn to these tracks, causing the write process to fail at the end. + /// Freelock versions 1.0-1.2a were intended solely to be copied to a floppy disk and then used, as the main executable itself was intentionally corrupted in these versions. + /// Freelock version 1.3 intentionally corrupts a different file, allowing you to run the program without a floppy disk. + /// + /// Official websites: + /// https://web.archive.org/web/20010801181527/http://www.geocities.com/freelock_psx/ + /// https://web.archive.org/web/19991001075001/http://www.geocities.com/SiliconValley/Code/6061/ + /// + /// Versions: + /// Freelock 1.0: https://web.archive.org/web/20040615215309/http://www.geocities.com/SiliconValley/Code/6061/programs/flock10.zip + /// Freelock 1.2: https://web.archive.org/web/20091027114741/http://geocities.com/siliconvalley/code/6061/programs/flock12.zip + /// Freelock 1.2a: https://web.archive.org/web/20040613085437/http://www.geocities.com/SiliconValley/Code/6061/programs/Flock12a.zip + /// Freelock 1.3: https://web.archive.org/web/20040606222542/http://www.geocities.com/SiliconValley/Code/6061/programs/flock13.zip + /// + public class Freelock : IPathCheck { + // TODO: Add an MS-DOS executable check for "FREELOCK.EXE". + /// public ConcurrentQueue CheckDirectoryPath(string path, IEnumerable files) { var matchers = new List { - new PathMatchSet(new PathMatch("FREELOCK.IMG", useEndsWith: true), "FreeLock (Unconfirmed - Please report to us on Github)"), + // The disk image that every version of Freelock is distributed through. + new PathMatchSet(new PathMatch("FREELOCK.IMG", useEndsWith: true), "Freelock Disk Image"), + + // Found in every "FREELOCK.IMG". + new PathMatchSet(new PathMatch("FREELOCK.EXE", useEndsWith: true), "Freelock"), + new PathMatchSet(new PathMatch("FREELOCK.TXT", useEndsWith: true), "Freelock"), + + // Found in "FREELOCK.IMG" from Freelock 1.0-1.2. + new PathMatchSet(new PathMatch("FREELOCK", useEndsWith: true), "Freelock 1.0-1.2"), + + // Found in "FREELOCK.IMG" from Freelock 1.2+. + new PathMatchSet(new PathMatch("GENLOCK.EXE", useEndsWith: true), "Freelock 1.2-1.3"), + new PathMatchSet(new PathMatch("freelock.ico", useEndsWith: true), "Freelock 1.2-1.3"), + new PathMatchSet(new PathMatch("freelock.pif", useEndsWith: true), "Freelock 1.2-1.3"), + + // Found in "FREELOCK.IMG" From Freelock 1.3. + new PathMatchSet(new PathMatch("FREELOCK.13", useEndsWith: true), "Freelock 1.3"), + + // Found in "FREELOCK.IMG" From Freelock 1.3. + new PathMatchSet(new List + { + new PathMatch("FREELOCK.13", useEndsWith: true), + new PathMatch("FL.DAT", useEndsWith: true), + }, "Freelock 1.3"), }; return MatchUtil.GetAllMatches(files, matchers, any: true); @@ -23,7 +64,23 @@ namespace BurnOutSharp.ProtectionType { var matchers = new List { - new PathMatchSet(new PathMatch("FREELOCK.IMG", useEndsWith: true), "FreeLock (Unconfirmed - Please report to us on Github)"), + // The disk image that every version of Freelock is distributed through. + new PathMatchSet(new PathMatch("FREELOCK.IMG", useEndsWith: true), "Freelock Disk Image"), + + // Found in every "FREELOCK.IMG". + new PathMatchSet(new PathMatch("FREELOCK.EXE", useEndsWith: true), "Freelock"), + new PathMatchSet(new PathMatch("FREELOCK.TXT", useEndsWith: true), "Freelock"), + + // Found in "FREELOCK.IMG" from Freelock 1.0-1.2. + new PathMatchSet(new PathMatch("FREELOCK", useEndsWith: true), "Freelock 1.0-1.2"), + + // Found in "FREELOCK.IMG" from Freelock 1.2+. + new PathMatchSet(new PathMatch("GENLOCK.EXE", useEndsWith: true), "Freelock 1.2-1.3"), + new PathMatchSet(new PathMatch("freelock.ico", useEndsWith: true), "Freelock 1.2-1.3"), + new PathMatchSet(new PathMatch("freelock.pif", useEndsWith: true), "Freelock 1.2-1.3"), + + // Found in "FREELOCK.IMG" From Freelock 1.3. + new PathMatchSet(new PathMatch("FREELOCK.13", useEndsWith: true), "Freelock 1.3"), }; return MatchUtil.GetFirstMatch(path, matchers, any: true); diff --git a/README.md b/README.md index 41c57ed4..a96b82b4 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Below is a list of protections detected by BurnOutSharp. The two columns explain | Easy Anti-Cheat | True | True | | | ~~Executable-Based CD Check~~ | True | False | Disabled due to overly-broad checks | | Executable-Based Online Registration | True | False | Possibly too broad | -| Freelock | False | True | Unconfirmed¹ | +| Freelock | False | True | | | Games for Windows - Live | True | True | | | Hexalock AutoLock | True | True | | | Impulse Reactor / Stardock Product Activation | True | True | |