Preserve tokens if necessary

This commit is contained in:
de4dot 2012-11-04 23:24:12 +01:00
parent c9f1f8073e
commit 2aedcc730c
2 changed files with 13 additions and 4 deletions

View File

@ -51,10 +51,12 @@ namespace de4dot.code {
return module;
}
public void save(string newFilename, bool updateMaxStack, IModuleWriterListener writerListener) {
public void save(string newFilename, bool preserveTokens, bool updateMaxStack, IModuleWriterListener writerListener) {
var writerOptions = new ModuleWriterOptions(module, writerListener);
if (!updateMaxStack)
writerOptions.MetaDataOptions.Flags |= MetaDataFlags.KeepOldMaxStack;
if (preserveTokens)
writerOptions.MetaDataOptions.Flags |= MetaDataFlags.PreserveTokens | MetaDataFlags.PreserveUSOffsets | MetaDataFlags.PreserveExtraSignatureData;
module.Write(newFilename, writerOptions);
}

View File

@ -304,9 +304,13 @@ namespace de4dot.code {
return detected;
}
bool ShouldPreserveTokens() {
return options.KeepObfuscatorTypes || deob.Type == "un";
}
public void save() {
Log.n("Saving {0}", options.NewFilename);
assemblyModule.save(options.NewFilename, options.ControlFlowDeobfuscation, deob as IModuleWriterListener);
assemblyModule.save(options.NewFilename, ShouldPreserveTokens(), options.ControlFlowDeobfuscation, deob as IModuleWriterListener);
}
IList<MethodDef> getAllMethods() {
@ -524,7 +528,7 @@ namespace de4dot.code {
if (!options.ControlFlowDeobfuscation) {
// If it's the unknown type, we don't remove any types that could cause Mono.Cecil
// to throw an exception.
if (deob.Type == "un" || options.KeepObfuscatorTypes)
if (ShouldPreserveTokens())
return;
}
@ -590,7 +594,10 @@ namespace de4dot.code {
cflowDeobfuscator.deobfuscate();
if (options.ControlFlowDeobfuscation) {
numRemovedLocals = blocks.optimizeLocals();
// Don't remove any locals if we should preserve tokens or we won't be able
// to always preserve StandAloneSig tokens.
if (!ShouldPreserveTokens())
numRemovedLocals = blocks.optimizeLocals();
blocks.repartitionBlocks();
}