From 88582053441d5db05b82a9d0deff33521f55841a Mon Sep 17 00:00:00 2001 From: de4dot Date: Wed, 21 Nov 2012 13:57:13 +0100 Subject: [PATCH] IDeobfuscator now implements IDisposable --- de4dot.code/IObfuscatedFile.cs | 2 +- de4dot.code/ObfuscatedFile.cs | 26 +++++++++++++------ de4dot.code/deobfuscators/DeobfuscatorBase.cs | 8 ++++++ de4dot.code/deobfuscators/IDeobfuscator.cs | 2 +- .../deobfuscators/MaxtoCode/Deobfuscator.cs | 6 +++++ .../dotNET_Reactor/v4/Deobfuscator.cs | 6 +++++ de4dot.cui/FilesDeobfuscator.cs | 4 +-- 7 files changed, 42 insertions(+), 12 deletions(-) diff --git a/de4dot.code/IObfuscatedFile.cs b/de4dot.code/IObfuscatedFile.cs index e47dc3c9..ccde1f7d 100644 --- a/de4dot.code/IObfuscatedFile.cs +++ b/de4dot.code/IObfuscatedFile.cs @@ -40,7 +40,7 @@ namespace de4dot.code { void deobfuscateEnd(); void deobfuscateCleanUp(); - void load(IEnumerable deobfuscators); + void load(IList deobfuscators); void save(); } } diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs index b0118313..d04bb6cd 100644 --- a/de4dot.code/ObfuscatedFile.cs +++ b/de4dot.code/ObfuscatedFile.cs @@ -160,14 +160,22 @@ namespace de4dot.code { return noExt + "-cleaned" + ext; } - public void load(IEnumerable deobfuscators) { - loadModule(deobfuscators); - TheAssemblyResolver.Instance.addSearchDirectory(Utils.getDirName(Filename)); - TheAssemblyResolver.Instance.addSearchDirectory(Utils.getDirName(NewFilename)); - detectObfuscator(deobfuscators); - if (deob == null) - throw new ApplicationException("Could not detect obfuscator!"); - initializeDeobfuscator(); + public void load(IList deobfuscators) { + try { + loadModule(deobfuscators); + TheAssemblyResolver.Instance.addSearchDirectory(Utils.getDirName(Filename)); + TheAssemblyResolver.Instance.addSearchDirectory(Utils.getDirName(NewFilename)); + detectObfuscator(deobfuscators); + if (deob == null) + throw new ApplicationException("Could not detect obfuscator!"); + initializeDeobfuscator(); + } + finally { + foreach (var d in deobfuscators) { + if (d != deob && d != null) + d.Dispose(); + } + } } void loadModule(IEnumerable deobfuscators) { @@ -793,6 +801,8 @@ namespace de4dot.code { deobfuscateCleanUp(); if (module != null) module.Dispose(); + if (deob != null) + deob.Dispose(); module = null; deob = null; } diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index ef696f4b..66bbcca0 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -782,5 +782,13 @@ namespace de4dot.code.deobfuscators { protected static int toInt32(bool b) { return b ? 1 : 0; } + + public void Dispose() { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) { + } } } diff --git a/de4dot.code/deobfuscators/IDeobfuscator.cs b/de4dot.code/deobfuscators/IDeobfuscator.cs index 535f185e..6920144e 100644 --- a/de4dot.code/deobfuscators/IDeobfuscator.cs +++ b/de4dot.code/deobfuscators/IDeobfuscator.cs @@ -52,7 +52,7 @@ namespace de4dot.code.deobfuscators { RenameResourceKeys = 2, } - public interface IDeobfuscator : INameChecker { + public interface IDeobfuscator : INameChecker, IDisposable { string Type { get; } string TypeLong { get; } string Name { get; } diff --git a/de4dot.code/deobfuscators/MaxtoCode/Deobfuscator.cs b/de4dot.code/deobfuscators/MaxtoCode/Deobfuscator.cs index f13606ca..aca01176 100644 --- a/de4dot.code/deobfuscators/MaxtoCode/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/MaxtoCode/Deobfuscator.cs @@ -250,5 +250,11 @@ namespace de4dot.code.deobfuscators.MaxtoCode { list.Add(stringDecrypter.Method.MDToken.ToInt32()); return list; } + + protected override void Dispose(bool disposing) { + if (disposing) + freePEImage(); + base.Dispose(disposing); + } } } diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs index bee646ce..b0eae60e 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs @@ -614,5 +614,11 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v4 { break; } } + + protected override void Dispose(bool disposing) { + if (disposing) + freePEImage(); + base.Dispose(disposing); + } } } diff --git a/de4dot.cui/FilesDeobfuscator.cs b/de4dot.cui/FilesDeobfuscator.cs index 84306a18..f84dd0e2 100644 --- a/de4dot.cui/FilesDeobfuscator.cs +++ b/de4dot.cui/FilesDeobfuscator.cs @@ -162,7 +162,7 @@ namespace de4dot.cui { public ModuleContext ModuleContext { get; set; } public IEnumerable PossibleFiles { get; set; } public IEnumerable SearchDirs { get; set; } - public Func> CreateDeobfuscators { get; set; } + public Func> CreateDeobfuscators { get; set; } public DecrypterType? DefaultStringDecrypterType { get; set; } public List DefaultStringDecrypterMethods { get; set; } public IAssemblyClientFactory AssemblyClientFactory { get; set; } @@ -358,7 +358,7 @@ namespace de4dot.cui { file.save(); } - IEnumerable createDeobfuscators() { + IList createDeobfuscators() { var list = new List(options.DeobfuscatorInfos.Count); foreach (var info in options.DeobfuscatorInfos) list.Add(info.createDeobfuscator());