Skip to content
This repository has been archived by the owner on Jan 27, 2019. It is now read-only.

Commit

Permalink
Add support for mixed mode assemblies
Browse files Browse the repository at this point in the history
  • Loading branch information
yck1509 committed Jan 7, 2015
1 parent d607949 commit 4f83c6a
Show file tree
Hide file tree
Showing 11 changed files with 51 additions and 41 deletions.
4 changes: 4 additions & 0 deletions Confuser.Core/ConfuserEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,10 @@ static void BeginModule(ConfuserContext context) {
context.CurrentModuleWriterListener = new ModuleWriterListener();
context.CurrentModuleWriterListener.OnWriterEvent += (sender, e) => context.CheckCancellation();
context.CurrentModuleWriterOptions = new ModuleWriterOptions(context.CurrentModule, context.CurrentModuleWriterListener);

if (!context.CurrentModule.IsILOnly)
context.RequestNative();

var snKey = context.Annotations.Get<StrongNameKey>(context.CurrentModule, Marker.SNKey);
context.CurrentModuleWriterOptions.InitializeStrongNameSigning(context.CurrentModule, snKey);

Expand Down
27 changes: 15 additions & 12 deletions Confuser.Protections/AntiTamper/JITMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public void HandleMD(AntiTamperProtection parent, ConfuserContext context, Prote
}

void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDBeginWriteMethodBodies) {
context.Logger.Debug("Extracting method bodies...");
CreateSection(writer);
Expand All @@ -162,7 +162,7 @@ void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
}
}

void CreateSection(ModuleWriter writer) {
void CreateSection(ModuleWriterBase writer) {
// move some PE parts to separate section to prevent it from being hashed
var peSection = new PESection("", 0x60000020);
bool moved = false;
Expand All @@ -172,15 +172,18 @@ void CreateSection(ModuleWriter writer) {
peSection.Add(writer.StrongNameSignature, alignment);
moved = true;
}
if (writer.ImportAddressTable != null) {
alignment = writer.TextSection.Remove(writer.ImportAddressTable).Value;
peSection.Add(writer.ImportAddressTable, alignment);
moved = true;
}
if (writer.StartupStub != null) {
alignment = writer.TextSection.Remove(writer.StartupStub).Value;
peSection.Add(writer.StartupStub, alignment);
moved = true;
var managedWriter = writer as ModuleWriter;
if (managedWriter != null) {
if (managedWriter.ImportAddressTable != null) {
alignment = writer.TextSection.Remove(managedWriter.ImportAddressTable).Value;
peSection.Add(managedWriter.ImportAddressTable, alignment);
moved = true;
}
if (managedWriter.StartupStub != null) {
alignment = writer.TextSection.Remove(managedWriter.StartupStub).Value;
peSection.Add(managedWriter.StartupStub, alignment);
moved = true;
}
}
if (moved)
writer.Sections.Add(peSection);
Expand Down Expand Up @@ -228,7 +231,7 @@ void CreateSection(ModuleWriter writer) {
newSection.Add(new ByteArrayChunk(new byte[4]), 4);
}

void EncryptSection(ModuleWriter writer) {
void EncryptSection(ModuleWriterBase writer) {
Stream stream = writer.DestinationStream;
var reader = new BinaryReader(writer.DestinationStream);
stream.Position = 0x3C;
Expand Down
27 changes: 15 additions & 12 deletions Confuser.Protections/AntiTamper/NormalMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public void HandleMD(AntiTamperProtection parent, ConfuserContext context, Prote
}

void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDEndCreateTables) {
CreateSections(writer);
}
Expand All @@ -109,7 +109,7 @@ void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
}
}

void CreateSections(ModuleWriter writer) {
void CreateSections(ModuleWriterBase writer) {
var nameBuffer = new byte[8];
nameBuffer[0] = (byte)(name1 >> 0);
nameBuffer[1] = (byte)(name1 >> 8);
Expand Down Expand Up @@ -141,15 +141,18 @@ void CreateSections(ModuleWriter writer) {
peSection.Add(writer.StrongNameSignature, alignment);
moved = true;
}
if (writer.ImportAddressTable != null) {
alignment = writer.TextSection.Remove(writer.ImportAddressTable).Value;
peSection.Add(writer.ImportAddressTable, alignment);
moved = true;
}
if (writer.StartupStub != null) {
alignment = writer.TextSection.Remove(writer.StartupStub).Value;
peSection.Add(writer.StartupStub, alignment);
moved = true;
var managedWriter = writer as ModuleWriter;
if (managedWriter != null) {
if (managedWriter.ImportAddressTable != null) {
alignment = writer.TextSection.Remove(managedWriter.ImportAddressTable).Value;
peSection.Add(managedWriter.ImportAddressTable, alignment);
moved = true;
}
if (managedWriter.StartupStub != null) {
alignment = writer.TextSection.Remove(managedWriter.StartupStub).Value;
peSection.Add(managedWriter.StartupStub, alignment);
moved = true;
}
}
if (moved)
writer.Sections.Add(peSection);
Expand All @@ -169,7 +172,7 @@ void CreateSections(ModuleWriter writer) {
newSection.Add(new ByteArrayChunk(new byte[4]), 4);
}

void EncryptSection(ModuleWriter writer) {
void EncryptSection(ModuleWriterBase writer) {
Stream stream = writer.DestinationStream;
var reader = new BinaryReader(writer.DestinationStream);
stream.Position = 0x3C;
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Protections/Compress/ExtractPhase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public ResourceRecorder(CompressorContext ctx, ModuleDef module) {

public void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
if (e.WriterEvent == ModuleWriterEvent.MDEndAddResources) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
ctx.ManifestResources = new List<Tuple<uint, uint, string>>();
Dictionary<uint, byte[]> stringDict = writer.MetaData.StringsHeap.GetAllRawData().ToDictionary(pair => pair.Key, pair => pair.Value);
foreach (RawManifestResourceRow resource in writer.MetaData.TablesHeap.ManifestResourceTable)
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Protections/Compress/StubProtection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ protected override void Execute(ConfuserContext context, ProtectionParameters pa
context.CurrentModuleWriterListener.OnWriterEvent += (sender, e) => {
if (e.WriterEvent == ModuleWriterEvent.MDBeginCreateTables) {
// Add key signature
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
var prot = (StubProtection)Parent;
uint blob = writer.MetaData.BlobHeap.Add(prot.ctx.KeySig);
uint rid = writer.MetaData.TablesHeap.StandAloneSigTable.Add(new RawStandAloneSigRow(blob));
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Protections/Constants/x86Mode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ public void Compile(CEContext ctx) {
}

void InjectNativeCode(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDEndWriteMethodBodies) {
codeChunk = writer.MethodBodies.Add(new MethodBody(code));
}
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Protections/ControlFlow/x86Predicate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public void Compile(CFContext ctx) {
}

void InjectNativeCode(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDEndWriteMethodBodies) {
codeChunk = writer.MethodBodies.Add(new MethodBody(code));
}
Expand Down
14 changes: 7 additions & 7 deletions Confuser.Protections/InvalidMetadataProtection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ void Randomize<T>(MDTable<T> table) where T : IRawRow {
}

void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDEndCreateTables) {
// These hurts reflection

Expand Down Expand Up @@ -112,13 +112,13 @@ void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
Randomize(writer.MetaData.TablesHeap.ManifestResourceTable);
//Randomize(writer.MetaData.TablesHeap.GenericParamConstraintTable);

writer.Options.MetaDataOptions.TablesHeapOptions.ExtraData = random.NextUInt32();
writer.Options.MetaDataOptions.TablesHeapOptions.UseENC = false;
writer.Options.MetaDataOptions.MetaDataHeaderOptions.VersionString += "\0\0\0\0";
writer.TheOptions.MetaDataOptions.TablesHeapOptions.ExtraData = random.NextUInt32();
writer.TheOptions.MetaDataOptions.TablesHeapOptions.UseENC = false;
writer.TheOptions.MetaDataOptions.MetaDataHeaderOptions.VersionString += "\0\0\0\0";

writer.Options.MetaDataOptions.OtherHeapsEnd.Add(new RawHeap("#Strings", new byte[1]));
writer.Options.MetaDataOptions.OtherHeapsEnd.Add(new RawHeap("#Blob", new byte[1]));
writer.Options.MetaDataOptions.OtherHeapsEnd.Add(new RawHeap("#Schema", new byte[1]));
writer.TheOptions.MetaDataOptions.OtherHeapsEnd.Add(new RawHeap("#Strings", new byte[1]));
writer.TheOptions.MetaDataOptions.OtherHeapsEnd.Add(new RawHeap("#Blob", new byte[1]));
writer.TheOptions.MetaDataOptions.OtherHeapsEnd.Add(new RawHeap("#Schema", new byte[1]));
}
else if (e.WriterEvent == ModuleWriterEvent.MDOnAllTablesSorted) {
writer.MetaData.TablesHeap.DeclSecurityTable.Add(new RawDeclSecurityRow(
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Protections/ReferenceProxy/StrongMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ public override void Finalize(RPContext ctx) {
}

void EncodeField(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDMemberDefRidsAllocated) {
Dictionary<TypeDef, Func<int, int>> keyFuncs = keyAttrs
.Where(entry => entry != null)
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Protections/ReferenceProxy/x86Encoding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ void Compile(RPContext ctx, out Func<int, int> expCompiled, out MethodDef native
}

void InjectNativeCode(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDEndWriteMethodBodies) {
for (int n = 0; n < nativeCodes.Count; n++)
nativeCodes[n] = new Tuple<MethodDef, byte[], MethodBody>(
Expand Down
8 changes: 4 additions & 4 deletions Confuser.Protections/Resources/MDPhase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void Hook() {
}

void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
var writer = (ModuleWriter)sender;
var writer = (ModuleWriterBase)sender;
if (e.WriterEvent == ModuleWriterEvent.MDBeginAddResources) {
ctx.Context.CheckCancellation();
ctx.Context.Logger.Debug("Encrypting resources...");
Expand All @@ -37,8 +37,8 @@ void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
// move resources
string asmName = ctx.Name.RandomName(RenameMode.Letters);
PublicKey pubKey = null;
if (writer.Options.StrongNameKey != null)
pubKey = PublicKeyBase.CreatePublicKey(writer.Options.StrongNameKey.PublicKey);
if (writer.TheOptions.StrongNameKey != null)
pubKey = PublicKeyBase.CreatePublicKey(writer.TheOptions.StrongNameKey.PublicKey);
var assembly = new AssemblyDefUser(asmName, new Version(0, 0), pubKey);
assembly.Modules.Add(new ModuleDefUser(asmName + ".dll"));
ModuleDef module = assembly.ManifestModule;
Expand All @@ -53,7 +53,7 @@ void OnWriterEvent(object sender, ModuleWriterListenerEventArgs e) {
}
byte[] moduleBuff;
using (var ms = new MemoryStream()) {
module.Write(ms, new ModuleWriterOptions { StrongNameKey = writer.Options.StrongNameKey });
module.Write(ms, new ModuleWriterOptions { StrongNameKey = writer.TheOptions.StrongNameKey });
moduleBuff = ms.ToArray();
}

Expand Down

0 comments on commit 4f83c6a

Please sign in to comment.