diff --git a/de4dot.code/IObfuscatedFile.cs b/de4dot.code/IObfuscatedFile.cs index 2923d683..d02c900b 100644 --- a/de4dot.code/IObfuscatedFile.cs +++ b/de4dot.code/IObfuscatedFile.cs @@ -32,6 +32,7 @@ namespace de4dot.code { INameChecker NameChecker { get; } bool RenameResourcesInCode { get; } bool RemoveNamespaceWithOneType { get; } + bool RenameResourceKeys { get; } void deobfuscateBegin(); void deobfuscate(); diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index 563938a7..b4fc276b 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -95,7 +95,7 @@ namespace de4dot.code.renamer { void renameResourceKeys() { foreach (var module in modules.TheModules) { - if (!module.ObfuscatedFile.RenameResourcesInCode) + if (!module.ObfuscatedFile.RenameResourceKeys) continue; new ResourceKeysRenamer(module.ModuleDefinition, module.ObfuscatedFile.NameChecker).rename(); } diff --git a/de4dot.code/renamer/ResourceKeysRenamer.cs b/de4dot.code/renamer/ResourceKeysRenamer.cs index d725c304..fcf42007 100644 --- a/de4dot.code/renamer/ResourceKeysRenamer.cs +++ b/de4dot.code/renamer/ResourceKeysRenamer.cs @@ -40,15 +40,15 @@ namespace de4dot.code.renamer { } public void rename() { - Log.v("Renaming resource keys..."); + Log.v("Renaming resource keys ({0})", module); Log.indent(); foreach (var type in module.GetTypes()) { string resourceName = getResourceName(type); if (resourceName == null) continue; - var resource = DotNetUtils.getResource(module, resourceName) as EmbeddedResource; + var resource = getResource(resourceName); if (resource == null) { - Log.w("Could not find resource {0}", Utils.removeNewlines(resource)); + Log.w("Could not find resource {0}", Utils.removeNewlines(resourceName)); continue; } Log.v("Resource: {0}", Utils.toCsharpString(resource.Name)); @@ -59,6 +59,23 @@ namespace de4dot.code.renamer { Log.deIndent(); } + EmbeddedResource getResource(string resourceName) { + var resource = DotNetUtils.getResource(module, resourceName + ".resources") as EmbeddedResource; + if (resource != null) + return resource; + + string name = ""; + var pieces = resourceName.Split('.'); + Array.Reverse(pieces); + foreach (var piece in pieces) { + name = piece + name; + resource = DotNetUtils.getResource(module, name + ".resources") as EmbeddedResource; + if (resource != null) + return resource; + } + return null; + } + static string getResourceName(TypeDefinition type) { foreach (var method in type.Methods) { if (method.Body == null) @@ -81,7 +98,7 @@ namespace de4dot.code.renamer { continue; } - return resourceName + ".resources"; + return resourceName; } } } @@ -174,10 +191,8 @@ namespace de4dot.code.renamer { } RenameInfo info; - if (!nameToInfo.TryGetValue(name, out info)) { - Log.w("Could not find resource key '{0}'", Utils.removeNewlines(name)); - continue; - } + if (!nameToInfo.TryGetValue(name, out info)) + continue; // should not be renamed ldstr.Operand = info.newName; Log.v("Renamed resource key {0} => {1}", Utils.toCsharpString(info.element.Name), Utils.toCsharpString(info.newName)); @@ -196,7 +211,7 @@ namespace de4dot.code.renamer { if (elem.ResourceData.Code != ResourceTypeCode.String) return createDefaultName(); var stringData = (BuiltInResourceData)elem.ResourceData; - return createName(createPrefixFromStringData((string)stringData.Data), false); + return createPrefixFromStringData((string)stringData.Data); } string createPrefixFromStringData(string data) {