2021-08-29 21:40:25 -07:00
using System ;
using System.Collections.Generic ;
2021-08-30 14:24:16 -07:00
using System.Linq ;
using System.Text ;
using BurnOutSharp.ExecutableType.Microsoft ;
2021-03-31 19:07:00 -07:00
using BurnOutSharp.Matching ;
2021-08-25 15:09:42 -07:00
using BurnOutSharp.Tools ;
2021-03-31 19:07:00 -07:00
namespace BurnOutSharp.ProtectionType
{
public class CDKey : IContentCheck
{
/// <inheritdoc/>
2021-08-30 14:24:16 -07:00
public List < ContentMatchSet > GetContentMatchSets ( ) = > null ;
2021-07-17 23:40:16 -07:00
2021-08-25 19:37:32 -07:00
/// <inheritdoc/>
2021-08-29 21:40:25 -07:00
public string CheckContents ( string file , byte [ ] fileContent , bool includeDebug = false )
{
// TODO: Implement resource finding instead of using the built in methods
// Assembly information lives in the .rsrc section
// I need to find out how to navigate the resources in general
// as well as figure out the specific resources for both
// file info and MUI (XML) info. Once I figure this out,
// that also opens the doors to easier assembly XML checks.
var fvinfo = Utilities . GetFileVersionInfo ( file ) ;
string name = fvinfo ? . InternalName ? . Trim ( ) ;
if ( ! string . IsNullOrWhiteSpace ( name ) & & name . Equals ( "CDKey" , StringComparison . OrdinalIgnoreCase ) )
return "CD-Key / Serial" ;
2021-08-30 14:24:16 -07:00
// Get the sections from the executable, if possible
PortableExecutable pex = PortableExecutable . Deserialize ( fileContent , 0 ) ;
var sections = pex ? . SectionTable ;
if ( sections = = null )
return null ;
// Get the .rsrc section, if it exists
var rsrcSection = sections . FirstOrDefault ( s = > Encoding . ASCII . GetString ( s . Name ) . StartsWith ( ".rsrc" ) ) ;
if ( rsrcSection ! = null )
{
int sectionAddr = ( int ) rsrcSection . PointerToRawData ;
int sectionEnd = sectionAddr + ( int ) rsrcSection . VirtualSize ;
var matchers = new List < ContentMatchSet >
{
// I + (char)0x00 + n + (char)0x00 + t + (char)0x00 + e + (char)0x00 + r + (char)0x00 + n + (char)0x00 + a + (char)0x00 + l + (char)0x00 + N + (char)0x00 + a + (char)0x00 + m + (char)0x00 + e + (char)0x00 + + (char)0x00 + + (char)0x00 + C + (char)0x00 + D + (char)0x00 + K + (char)0x00 + e + (char)0x00 + y + (char)0x00
new ContentMatchSet (
new ContentMatch ( new byte? [ ]
{
0x49 , 0x00 , 0x6E , 0x00 , 0x74 , 0x00 , 0x65 , 0x00 ,
0x72 , 0x00 , 0x6E , 0x00 , 0x61 , 0x00 , 0x6C , 0x00 ,
0x4E , 0x00 , 0x61 , 0x00 , 0x6D , 0x00 , 0x65 , 0x00 ,
0x00 , 0x00 , 0x43 , 0x00 , 0x44 , 0x00 , 0x4B , 0x00 ,
0x65 , 0x00 , 0x79 , 0x00 ,
} , start : sectionAddr , end : sectionEnd ) ,
"CD-Key / Serial" ) ,
} ;
string match = MatchUtil . GetFirstMatch ( file , fileContent , matchers , includeDebug ) ;
if ( ! string . IsNullOrWhiteSpace ( match ) )
return match ;
}
2021-08-29 21:40:25 -07:00
return null ;
}
2021-03-31 19:07:00 -07:00
}
}