Skip to content

Commit 37daea2

Browse files
committed
Add strong name signing option '--strong-name-key' #229
1 parent 5a99e45 commit 37daea2

6 files changed

Lines changed: 39 additions & 3 deletions

File tree

src/BitMono.CLI/Modules/Options.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@ internal class Options
2828

2929
[Option("no-watermark", Required = false, HelpText = "Disable watermarking (overrides obfuscation.json setting).")]
3030
public bool NoWatermark { get; set; }
31+
32+
[Option("strong-name-key", Required = false, HelpText = "Path to strong name key (.snk) file for assembly signing.")]
33+
public string? StrongNameKey { get; set; }
3134
}

src/BitMono.CLI/Modules/OptionsObfuscationNeedsFactory.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public OptionsObfuscationNeedsFactory(string[] args)
4242
{
4343
obfuscationSettings.Watermark = false;
4444
}
45+
46+
if (obfuscationSettings != null)
47+
{
48+
obfuscationSettings.StrongNameKeyFile = options.StrongNameKey;
49+
}
4550
}
4651
catch (Exception ex)
4752
{

src/BitMono.Obfuscation/BitMonoObfuscator.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,15 @@ private async Task<bool> WriteModuleAsync()
283283
fileBuilder
284284
.CreateFile(_imageBuild!.ConstructedImage!)
285285
.Write(memoryStream);
286+
287+
if (!string.IsNullOrEmpty(_obfuscationSettings.StrongNameKeyFile) && File.Exists(_obfuscationSettings.StrongNameKeyFile))
288+
{
289+
_logger.Information("Applying strong name signature to PE image");
290+
var privateKey = StrongNamePrivateKey.FromFile(_obfuscationSettings.StrongNameKeyFile);
291+
var signer = new StrongNameSigner(privateKey);
292+
signer.SignImage(memoryStream, _context.Module.Assembly.HashAlgorithm);
293+
}
294+
286295
await _dataWriter.WriteAsync(_context.BitMonoContext.OutputFile, memoryStream.ToArray());
287296
_logger.Information("The protected module was saved in {0}", _context.BitMonoContext.OutputDirectoryName);
288297
}

src/BitMono.Obfuscation/GlobalUsings.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
global using System.Text;
1515
global using System.Threading;
1616
global using System.Threading.Tasks;
17+
global using AsmResolver.DotNet.Signatures;
1718
global using AsmResolver.PE;
1819
global using AsmResolver.PE.Builder;
1920
global using AsmResolver.PE.DotNet;
2021
global using AsmResolver.PE.DotNet.ReadyToRun;
22+
global using AsmResolver.PE.DotNet.StrongName;
2123
global using AsmResolver.PE.File;
2224
global using BitMono.API;
2325
global using BitMono.API.Protections;
@@ -33,6 +35,7 @@
3335
global using BitMono.Obfuscation.Protections;
3436
global using BitMono.Obfuscation.Referencing;
3537
global using BitMono.Obfuscation.Stripping;
38+
global using BitMono.Runtime;
3639
global using BitMono.Utilities.AsmResolver;
3740
global using BitMono.Utilities.Runtime;
3841
global using BitMono.Utilities.Time;

src/BitMono.Obfuscation/Modules/ModuleFactory.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,24 @@ public ModuleFactoryResult Create()
4646
throw;
4747
}
4848

49-
var managedPEImageBuilder =
50-
new ManagedPEImageBuilder(new DotNetDirectoryFactory(_metadataBuilderFlags), _errorListener);
51-
49+
var factory = new DotNetDirectoryFactory(_metadataBuilderFlags);
50+
51+
if (!string.IsNullOrEmpty(_obfuscationSettings.StrongNameKeyFile))
52+
{
53+
if (File.Exists(_obfuscationSettings.StrongNameKeyFile))
54+
{
55+
_logger.Information("Loading strong name key from: {KeyFile}", _obfuscationSettings.StrongNameKeyFile);
56+
var privateKey = StrongNamePrivateKey.FromFile(_obfuscationSettings.StrongNameKeyFile);
57+
factory.StrongNamePrivateKey = privateKey;
58+
_logger.Information("Configured DotNetDirectoryFactory with strong name private key");
59+
}
60+
else
61+
{
62+
_logger.Error("Strong name key file not found: {KeyFile}", _obfuscationSettings.StrongNameKeyFile);
63+
}
64+
}
65+
66+
var managedPEImageBuilder = new ManagedPEImageBuilder(factory, _errorListener);
5267
return new ModuleFactoryResult
5368
{
5469
Module = module,

src/BitMono.Shared/Models/ObfuscationSettings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ public class ObfuscationSettings
2222
public bool SpecificNamespacesObfuscationOnly { get; set; }
2323
public string[]? SpecificNamespaces { get; set; }
2424
public string[]? RandomStrings { get; set; }
25+
public string? StrongNameKeyFile { get; set; }
2526
}

0 commit comments

Comments
 (0)