Dispose() of all modules we don't need

This commit is contained in:
de4dot 2012-11-18 03:17:53 +01:00
parent 1c4b3a7382
commit 0e16e3e51b
4 changed files with 26 additions and 5 deletions

View File

@ -44,6 +44,8 @@ namespace de4dot.code {
} }
ModuleDefMD setModule(ModuleDefMD newModule) { ModuleDefMD setModule(ModuleDefMD newModule) {
if (module != null)
module.Dispose();
module = newModule; module = newModule;
TheAssemblyResolver.Instance.addModule(module); TheAssemblyResolver.Instance.addModule(module);
module.EnableTypeDefFindCache = true; module.EnableTypeDefFindCache = true;

View File

@ -17,13 +17,14 @@
along with de4dot. If not, see <http://www.gnu.org/licenses/>. along with de4dot. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System;
using System.Collections.Generic; using System.Collections.Generic;
using de4dot.code.deobfuscators; using de4dot.code.deobfuscators;
using dot10.DotNet; using dot10.DotNet;
using de4dot.code.renamer; using de4dot.code.renamer;
namespace de4dot.code { namespace de4dot.code {
public interface IObfuscatedFile { public interface IObfuscatedFile : IDisposable {
ModuleDefMD ModuleDefMD { get; } ModuleDefMD ModuleDefMD { get; }
IDeobfuscator Deobfuscator { get; } IDeobfuscator Deobfuscator { get; }
IDeobfuscatorContext DeobfuscatorContext { get; set; } IDeobfuscatorContext DeobfuscatorContext { get; set; }

View File

@ -778,5 +778,13 @@ namespace de4dot.code {
void IDeobfuscatedFile.setDeobfuscator(IDeobfuscator deob) { void IDeobfuscatedFile.setDeobfuscator(IDeobfuscator deob) {
this.deob = deob; this.deob = deob;
} }
public void Dispose() {
deobfuscateCleanUp();
if (module != null)
module.Dispose();
module = null;
deob = null;
}
} }
} }

View File

@ -85,6 +85,7 @@ namespace de4dot.cui {
void detectObfuscators() { void detectObfuscators() {
foreach (var file in loadAllFiles(true)) { foreach (var file in loadAllFiles(true)) {
removeModule(file.ModuleDefMD); removeModule(file.ModuleDefMD);
file.Dispose();
deobfuscatorContext.clear(); deobfuscatorContext.clear();
} }
} }
@ -108,7 +109,7 @@ namespace de4dot.cui {
Program.printStackTrace(ex, LoggerEvent.Verbose); Program.printStackTrace(ex, LoggerEvent.Verbose);
} }
finally { finally {
file.deobfuscateCleanUp(); file.Dispose();
Logger.Instance.IndentLevel = oldIndentLevel; Logger.Instance.IndentLevel = oldIndentLevel;
} }
} }
@ -116,10 +117,18 @@ namespace de4dot.cui {
void deobfuscateAll() { void deobfuscateAll() {
var allFiles = new List<IObfuscatedFile>(loadAllFiles()); var allFiles = new List<IObfuscatedFile>(loadAllFiles());
try {
deobfuscateAllFiles(allFiles); deobfuscateAllFiles(allFiles);
rename(allFiles); rename(allFiles);
saveAllFiles(allFiles); saveAllFiles(allFiles);
} }
finally {
foreach (var file in allFiles) {
if (file != null)
file.Dispose();
}
}
}
IEnumerable<IObfuscatedFile> loadAllFiles() { IEnumerable<IObfuscatedFile> loadAllFiles() {
return loadAllFiles(false); return loadAllFiles(false);
@ -310,6 +319,7 @@ namespace de4dot.cui {
var obfuscatedFile = new ObfuscatedFile(fileOptions, options.ModuleContext, options.AssemblyClientFactory); var obfuscatedFile = new ObfuscatedFile(fileOptions, options.ModuleContext, options.AssemblyClientFactory);
if (add(obfuscatedFile, searchDir.SkipUnknownObfuscators, false)) if (add(obfuscatedFile, searchDir.SkipUnknownObfuscators, false))
return obfuscatedFile; return obfuscatedFile;
obfuscatedFile.Dispose();
return null; return null;
} }