Reflection

This change eliminates the need to explicitly list out every single protection in the same way now that we have interfaces that we can rely on.
This commit is contained in:
Matt Nadareski
2021-03-02 15:10:52 -08:00
parent 2867ce2e9a
commit 633fe23b80
3 changed files with 69 additions and 480 deletions

View File

@@ -1,13 +1,19 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using BurnOutSharp.PackerType;
using BurnOutSharp.ProtectionType;
namespace BurnOutSharp.FileType
{
internal class Executable : IScannable
{
/// <summary>
/// Cache for all IContentCheck types
/// </summary>
private static IEnumerable<Type> contentCheckClasses = null;
/// <inheritdoc/>
public bool ShouldScan(byte[] magic)
{
@@ -70,269 +76,40 @@ namespace BurnOutSharp.FileType
// Files can be protected in multiple ways
var protections = new Dictionary<string, List<string>>();
string protection;
#region Protections
// 3PLock
protection = new ThreePLock().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// 321Studios Online Activation
protection = new ThreeTwoOneStudios().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// ActiveMARK
protection = new ActiveMARK().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Alpha-ROM
protection = new AlphaROM().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Cactus Data Shield
protection = new CactusDataShield().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// CD-Cops
protection = new CDCops().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// CD-Lock
protection = new CDLock().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// CDSHiELD SE
protection = new CDSHiELDSE().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// CD Check
protection = new CDCheck().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Cenega ProtectDVD
protection = new CengaProtectDVD().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Code Lock
protection = new CodeLock().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// CopyKiller
protection = new CopyKiller().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// DVD-Cops
protection = new DVDCops().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// EA Protections
protection = new ElectronicArts().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Games for Windows - Live
protection = new GFWL().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Impulse Reactor
protection = new ImpulseReactor().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// INTENIUM Trial & Buy Protection
protection = new Intenium().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// JoWooD X-Prot
protection = new JoWooDXProt().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Key-Lock (Dongle)
protection = new KeyLock().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// LaserLock
protection = new LaserLock().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// MediaMax CD-3
protection = new MediaMaxCD3().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Origin
protection = new Origin().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// ProtectDisc
protection = new ProtectDisc().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Ring PROTECH
protection = new RingPROTECH().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// SafeDisc / SafeCast
protection = new SafeDisc().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// SafeLock
protection = new SafeLock().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// SecuROM
protection = new SecuROM().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// SmartE
protection = new SmartE().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// SolidShield
protection = new SolidShield().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// StarForce
protection = new StarForce().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// SVK Protector
protection = new SVKProtector().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Sysiphus / Sysiphus DVD
protection = new Sysiphus().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// TAGES
protection = new Tages().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// VOB ProtectCD/DVD
protection = new VOBProtectCDDVD().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// WTM CD Protect
protection = new WTMCDProtect().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// XCP 1/2
protection = new XCP().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Xtreme-Protector
protection = new XtremeProtector().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
#endregion
#region Archive-as-Executable Formats / Installers
// If we're looking for archives too, run scans
if (scanner.ScanArchives)
// Get all IContentCheck implementations
if (contentCheckClasses == null)
{
// Inno Setup
if (file != null && !string.IsNullOrEmpty(new InnoSetup().CheckContents(file, fileContent, scanner.IncludePosition)))
{
var subProtections = new InnoSetup().Scan(scanner, null, file);
Utilities.PrependToKeys(subProtections, file);
Utilities.AppendToDictionary(protections, subProtections);
}
// Wise Installer
if (file != null && !string.IsNullOrEmpty(new WiseInstaller().CheckContents(file, fileContent, scanner.IncludePosition)))
{
var subProtections = new WiseInstaller().Scan(scanner, null, file);
Utilities.PrependToKeys(subProtections, file);
Utilities.AppendToDictionary(protections, subProtections);
}
contentCheckClasses = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.GetInterface("IContentCheck") != null);
}
#endregion
#region Packers
// If we're looking for packers too, run scans
if (scanner.ScanPackers)
// Iterate through all content checks
foreach (var contentCheckClass in contentCheckClasses)
{
// Armadillo
protection = new Armadillo().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
IContentCheck contentCheck = Activator.CreateInstance(contentCheckClass) as IContentCheck;
string protection = contentCheck.CheckContents(file, fileContent, scanner.IncludePosition);
// dotFuscator
protection = new dotFuscator().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// If we have a valid cotnent check based on settings
if (!contentCheckClass.Namespace.ToLowerInvariant().Contains("packertype") || scanner.ScanPackers)
{
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
}
// EXE Stealth
protection = new EXEStealth().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Inno Setup
protection = new InnoSetup().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// NSIS
protection = new NSIS().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// PE Compact
protection = new PECompact().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// UPX
protection = new UPX().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// Wise Installer
protection = new WiseInstaller().CheckContents(file, fileContent, scanner.IncludePosition);
if (!string.IsNullOrWhiteSpace(protection))
Utilities.AppendToDictionary(protections, file, protection);
// If we have an IScannable implementation
if (contentCheckClass.GetInterface("IScannable") != null)
{
IScannable scannable = Activator.CreateInstance(contentCheckClass) as IScannable;
if (file != null && !string.IsNullOrEmpty(protection))
{
var subProtections = scannable.Scan(scanner, null, file);
Utilities.PrependToKeys(subProtections, file);
Utilities.AppendToDictionary(protections, subProtections);
}
}
}
#endregion
return protections;
}
}

View File

@@ -21,18 +21,21 @@ namespace BurnOutSharp.ProtectionType
/// <inheritdoc/>
public string CheckPath(string path, bool isDirectory, IEnumerable<string> files)
{
if (isDirectory)
{
if (files.Any(f => Path.GetFileName(f).Equals("Autorun.dat", StringComparison.OrdinalIgnoreCase)))
return "CopyKiller";
}
else
{
if (Path.GetFileName(path).Equals("Autorun.dat", StringComparison.OrdinalIgnoreCase))
return "CopyKiller";
}
return null;
// TODO: The following checks are overly broad and should be refined
//if (isDirectory)
//{
// if (files.Any(f => Path.GetFileName(f).Equals("Autorun.dat", StringComparison.OrdinalIgnoreCase)))
// return "CopyKiller";
//}
//else
//{
// if (Path.GetFileName(path).Equals("Autorun.dat", StringComparison.OrdinalIgnoreCase))
// return "CopyKiller";
//}
//return null;
}
}
}

View File

@@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using BurnOutSharp.FileType;
using BurnOutSharp.ProtectionType;
namespace BurnOutSharp
{
@@ -34,6 +34,11 @@ namespace BurnOutSharp
/// </summary>
public bool ScanPackers { get; set; } = false;
/// <summary>
/// Cache for all IPathCheck types
/// </summary>
private static IEnumerable<Type> pathCheckClasses = null;
/// <summary>
/// Constructor
/// </summary>
@@ -179,220 +184,24 @@ namespace BurnOutSharp
/// <returns>Dictionary of list of strings representing the found protections</returns>
private Dictionary<string, List<string>> GetPathProtections(string path, bool isDirectory, List<string> files = null)
{
// Create an empty list for protections
List<string> protections = new List<string>();
string protection;
// AACS
protection = new AACS().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Get all IPathCheck implementations
if (pathCheckClasses == null)
{
pathCheckClasses = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.GetInterface("IPathCheck") != null);
}
// Alpha-DVD
protection = new AlphaDVD().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Bitpool
protection = new Bitpool().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// ByteShield
protection = new ByteShield().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Cactus Data Shield
protection = new CactusDataShield().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// CD-Cops
protection = new CDCops().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// CD-Lock
protection = new CDLock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// CD-Protector
protection = new CDProtector().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// CD-X
protection = new CDX().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
/*
// CopyKiller
protection = new CopyKiller().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
*/
// DiscGuard
protection = new DiscGuard().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// DVD Crypt
protection = new DVDCrypt().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// DVD-Movie-PROTECT
protection = new DVDMoviePROTECT().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// FreeLock
protection = new FreeLock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Games for Windows - Live
protection = new GFWL().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Hexalock AutoLock
protection = new HexalockAutoLock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Impulse Reactor
protection = new ImpulseReactor().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// IndyVCD
protection = new IndyVCD().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Key2Audio XS
protection = new Key2AudioXS().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// LaserLock
protection = new LaserLock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// MediaCloQ
protection = new MediaCloQ().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// MediaMax CD3
protection = new MediaMaxCD3().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Origin
protection = new Origin().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Protect DVD-Video
protection = new ProtectDVDVideo().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SafeCast
protection = new SafeCast().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SafeDisc
protection = new SafeDisc().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SafeDisc Lite
protection = new SafeDiscLite().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SafeLock
protection = new SafeLock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SecuROM
protection = new SecuROM().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SmartE
protection = new SmartE().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SoftLock
protection = new SoftLock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// SolidShield
protection = new SolidShield().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// StarForce
protection = new StarForce().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Steam
protection = new Steam().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// TAGES
protection = new Tages().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// TZCopyProtector
protection = new TZCopyProtector().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Uplay
protection = new Uplay().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// VOB ProtectCD/DVD
protection = new VOBProtectCDDVD().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Winlock
protection = new Winlock().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// WTM CD Protect
protection = new WTMCDProtect().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// XCP
protection = new XCP().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Zzxzz
protection = new Zzxzz().CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
// Iterate through all path checks
foreach (var pathCheckClass in pathCheckClasses)
{
IPathCheck pathCheck = Activator.CreateInstance(pathCheckClass) as IPathCheck;
string protection = pathCheck.CheckPath(path, isDirectory, files);
if (!string.IsNullOrWhiteSpace(protection))
protections.Add(protection);
}
// Create and return the dictionary
return new Dictionary<string, List<string>>