diff --git a/.vscode/launch.json b/.vscode/launch.json
index f8821671..2ea04a6e 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -11,7 +11,9 @@
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/ProtectionScan/bin/Debug/net9.0/ProtectionScan.dll",
- "args": [],
+ "args": [
+ "/home/matt/Downloads/_BADEXE/"
+ ],
"cwd": "${workspaceFolder}/ProtectionScan",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
diff --git a/BinaryObjectScanner/FileType/Textfile.cs b/BinaryObjectScanner/FileType/Textfile.cs
index acf25391..cfadb5e8 100644
--- a/BinaryObjectScanner/FileType/Textfile.cs
+++ b/BinaryObjectScanner/FileType/Textfile.cs
@@ -78,6 +78,13 @@ namespace BinaryObjectScanner.FileType
else if (fileContent.Contains("FREELOCK"))
protections.Add("Freelock");
+ // Hudson huPPPX
+ // Found in setup.inx
+ if (fileContent.Contains("HVRCD_IS_"))
+ return "Hudson huPPPX";
+ else if (fileContent.Contains("HVCDISSR"))
+ return "Hudson huPPPX";
+
// MediaCloQ
if (fileContent.Contains("SunnComm MediaCloQ"))
protections.Add("MediaCloQ");
diff --git a/BinaryObjectScanner/Protection/HudsonHuPPPX.cs b/BinaryObjectScanner/Protection/HudsonHuPPPX.cs
new file mode 100644
index 00000000..958cca8d
--- /dev/null
+++ b/BinaryObjectScanner/Protection/HudsonHuPPPX.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using BinaryObjectScanner.Interfaces;
+using SabreTools.Matching;
+using SabreTools.Matching.Paths;
+using SabreTools.Serialization.Wrappers;
+
+namespace BinaryObjectScanner.Protection
+{
+ ///
+ /// Hudson huPPPX device control library
+ ///
+ ///
+ /// Basically unknown copy protection scheme found in Bomberman Vol 2 (Japan).
+ /// Within the installshield program (setup.inx), there's a call to a disc check (using HVCDISSR.DLL)
+ /// that fails even for mounted bin/cue with intentional errors.
+ ///
+ public class HudsonHuPPPX : IExecutableCheck, IPathCheck
+ {
+ ///
+ public string? CheckExecutable(string file, PortableExecutable exe, bool includeDebug)
+ {
+ var exportTable = exe.ExportTable;
+ if (exportTable != null)
+ {
+ // Found in Bomberman Vol 2 (Japan)
+ if (exportTable.ExportDirectoryTable?.Name == "HVCDISSR.DLL")
+ return "Hudson huPPPX";
+
+ // Found in Bomberman Vol 2 (Japan)
+ if (Array.Exists(exportTable.ExportNameTable?.Strings, s => s.StartsWith("HVRCD_IS_")))
+ return "Hudson huPPPX";
+ }
+
+ return null;
+ }
+
+ ///
+ public List CheckDirectoryPath(string path, List? files)
+ {
+ var matchers = new List
+ {
+ new(new FilePathMatch("HVCDISSR.DLL"), "Hudson huPPPX"),
+ };
+
+ return MatchUtil.GetAllMatches(files, matchers, any: true);
+ }
+
+ ///
+ public string? CheckFilePath(string path)
+ {
+ var matchers = new List
+ {
+ new(new FilePathMatch("HVCDISSR.DLL"), "Hudson huPPPX"),
+ };
+
+ return MatchUtil.GetFirstMatch(path, matchers, any: true);
+ }
+ }
+}
diff --git a/README.md b/README.md
index 74008a1b..e1cc2634 100644
--- a/README.md
+++ b/README.md
@@ -81,6 +81,7 @@ Below is a list of protections detected by BinaryObjectScanner. The two columns
| Games for Windows - Live | True | True | |
| Gefest Protection System | True | False | |
| Hexalock AutoLock | True | True | |
+| Hudson huPPPX | True | True | Basically unknown protection |
| Impulse Reactor / Stardock Product Activation | True | True | |
| IndyVCD | False | True | Unconfirmed¹ |
| INTENIUM Trial & Buy Protection | True | False | |