From c9d4dc226891c15a761cc363d22e31eac4c4f4e6 Mon Sep 17 00:00:00 2001 From: de4dot Date: Sat, 3 Dec 2011 14:28:10 +0100 Subject: [PATCH] Update renamer code so a compiler can compile the decompiled output - property Byte[]_0 => Byte_0 - property ICollection.Boolean_0 => ICollection.IsSynchronized - property pByte_0 => PByte_0 - property T_0 => Prop_0 - property indexer => Item --- de4dot.code/renamer/MemberInfos.cs | 8 ++ de4dot.code/renamer/Renamer.cs | 90 +++++++++++++++---- de4dot.code/renamer/TypeInfo.cs | 8 +- de4dot.code/renamer/TypeNames.cs | 4 +- de4dot.code/renamer/asmmodules/Modules.cs | 2 +- de4dot.code/renamer/asmmodules/PropertyDef.cs | 8 ++ 6 files changed, 100 insertions(+), 20 deletions(-) diff --git a/de4dot.code/renamer/MemberInfos.cs b/de4dot.code/renamer/MemberInfos.cs index 79833a3c..f46313b9 100644 --- a/de4dot.code/renamer/MemberInfos.cs +++ b/de4dot.code/renamer/MemberInfos.cs @@ -222,6 +222,14 @@ namespace de4dot.renamer { return allTypeInfos.TryGetValue(t, out info); } + public bool tryGetEvent(EventDef e, out EventInfo info) { + return allEventInfos.TryGetValue(e, out info); + } + + public bool tryGetProperty(PropertyDef p, out PropertyInfo info) { + return allPropertyInfos.TryGetValue(p, out info); + } + public PropertyInfo prop(PropertyDef prop) { return allPropertyInfos[prop]; } diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index 49ce826e..6cb8b0da 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -983,19 +983,26 @@ namespace de4dot.renamer { string newEventName, oldEventName; var eventInfo = memberInfos.evt(eventDef); + bool mustUseOldEventName = false; if (overridePrefix == "") oldEventName = eventInfo.oldName; else { var overriddenEventDef = getOverriddenEvent(eventMethod); if (overriddenEventDef == null) oldEventName = getRealName(eventInfo.oldName); - else - oldEventName = getRealName(memberInfos.evt(overriddenEventDef).newName); + else { + mustUseOldEventName = true; + EventInfo info; + if (memberInfos.tryGetEvent(overriddenEventDef, out info)) + oldEventName = getRealName(info.newName); + else + oldEventName = getRealName(overriddenEventDef.EventDefinition.Name); + } } if (eventInfo.renamed) newEventName = getRealName(eventInfo.newName); - else if (eventDef.Owner.Module.ObfuscatedFile.NameChecker.isValidEventName(oldEventName)) + else if (mustUseOldEventName || eventDef.Owner.Module.ObfuscatedFile.NameChecker.isValidEventName(oldEventName)) newEventName = oldEventName; else { mergeStateHelper.merge(MergeStateFlags.Events, scope); @@ -1016,10 +1023,20 @@ namespace de4dot.renamer { } EventDef getOverriddenEvent(MethodDef overrideMethod) { - var overriddenMethod = modules.resolve(overrideMethod.MethodDefinition.Overrides[0]); - if (overriddenMethod == null) + var theMethod = overrideMethod.MethodDefinition.Overrides[0]; + var overriddenMethod = modules.resolve(theMethod); + if (overriddenMethod != null) + return overriddenMethod.Event; + + var extType = theMethod.DeclaringType; + if (extType == null) return null; - return overriddenMethod.Event; + var extTypeDef = modules.resolveOther(extType); + var theMethodDef = extTypeDef.find(theMethod); + if (theMethodDef != null) + return theMethodDef.Event; + + return null; } MethodDef getEventMethod(MethodNameScope scope) { @@ -1069,20 +1086,29 @@ namespace de4dot.renamer { var propDef = propMethod.Property; var propInfo = memberInfos.prop(propDef); + bool mustUseOldPropName = false; if (overridePrefix == "") oldPropName = propInfo.oldName; else { var overriddenPropDef = getOverriddenProperty(propMethod); if (overriddenPropDef == null) oldPropName = getRealName(propInfo.oldName); - else - oldPropName = getRealName(memberInfos.prop(overriddenPropDef).newName); + else { + mustUseOldPropName = true; + PropertyInfo info; + if (memberInfos.tryGetProperty(overriddenPropDef, out info)) + oldPropName = getRealName(info.newName); + else + oldPropName = getRealName(overriddenPropDef.PropertyDefinition.Name); + } } if (propInfo.renamed) newPropName = getRealName(propInfo.newName); - else if (propDef.Owner.Module.ObfuscatedFile.NameChecker.isValidPropertyName(oldPropName)) + else if (mustUseOldPropName || propDef.Owner.Module.ObfuscatedFile.NameChecker.isValidPropertyName(oldPropName)) newPropName = oldPropName; + else if (isItemProperty(scope)) + newPropName = "Item"; else { var propPrefix = getSuggestedPropertyName(scope) ?? getNewPropertyNamePrefix(scope); mergeStateHelper.merge(MergeStateFlags.Properties, scope); @@ -1102,11 +1128,29 @@ namespace de4dot.renamer { return newPropName; } + bool isItemProperty(MethodNameScope scope) { + foreach (var method in scope.Methods) { + if (method.Property != null && method.Property.isItemProperty()) + return true; + } + return false; + } + PropertyDef getOverriddenProperty(MethodDef overrideMethod) { - var overriddenMethod = modules.resolve(overrideMethod.MethodDefinition.Overrides[0]); - if (overriddenMethod == null) + var theMethod = overrideMethod.MethodDefinition.Overrides[0]; + var overriddenMethod = modules.resolve(theMethod); + if (overriddenMethod != null) + return overriddenMethod.Property; + + var extType = theMethod.DeclaringType; + if (extType == null) return null; - return overriddenMethod.Property; + var extTypeDef = modules.resolveOther(extType); + var theMethodDef = extTypeDef.find(theMethod); + if (theMethodDef != null) + return theMethodDef.Property; + + return null; } MethodDef getPropertyMethod(MethodNameScope scope) { @@ -1132,10 +1176,12 @@ namespace de4dot.renamer { const string defaultVal = "Prop_"; var propType = getPropertyType(scope); - if (propType == null || propType is GenericInstanceType) + if (propType == null || propType is GenericInstanceType || propType is GenericParameter) return defaultVal; - string name = propType.Name; + var prefix = getPrefix(propType); + + string name = propType.GetElementType().Name; int i; if ((i = name.IndexOf('`')) >= 0) name = name.Substring(0, i); @@ -1143,7 +1189,21 @@ namespace de4dot.renamer { name = name.Substring(i + 1); if (name == "") return defaultVal; - return name + "_"; + + return prefix.ToUpperInvariant() + upperFirst(name) + "_"; + } + + static string upperFirst(string s) { + return s.Substring(0, 1).ToUpperInvariant() + s.Substring(1); + } + + static string getPrefix(TypeReference typeRef) { + string prefix = ""; + while (typeRef is PointerType) { + typeRef = ((PointerType)typeRef).ElementType; + prefix += "p"; + } + return prefix; } enum PropertyMethodType { diff --git a/de4dot.code/renamer/TypeInfo.cs b/de4dot.code/renamer/TypeInfo.cs index 7844dddf..47a988eb 100644 --- a/de4dot.code/renamer/TypeInfo.cs +++ b/de4dot.code/renamer/TypeInfo.cs @@ -216,8 +216,12 @@ namespace de4dot.renamer { string propName = propInfo.oldName; if (!NameChecker.isValidPropertyName(propName)) propName = propInfo.suggestedName; - if (!NameChecker.isValidPropertyName(propName)) - propName = variableNameState.getNewPropertyName(propDef.PropertyDefinition); + if (!NameChecker.isValidPropertyName(propName)) { + if (propDef.isItemProperty()) + propName = "Item"; + else + propName = variableNameState.getNewPropertyName(propDef.PropertyDefinition); + } variableNameState.addPropertyName(propName); propInfo.rename(propName); diff --git a/de4dot.code/renamer/TypeNames.cs b/de4dot.code/renamer/TypeNames.cs index 76adc1bd..20cdd09e 100644 --- a/de4dot.code/renamer/TypeNames.cs +++ b/de4dot.code/renamer/TypeNames.cs @@ -56,7 +56,7 @@ namespace de4dot.renamer { return addTypeName(typeFullName, newName, prefix).create(); } - string getPrefix(TypeReference typeRef) { + static string getPrefix(TypeReference typeRef) { string prefix = ""; while (typeRef is PointerType) { typeRef = ((PointerType)typeRef).ElementType; @@ -153,7 +153,7 @@ namespace de4dot.renamer { class PropertyNameCreator : TypeNames { protected override string fixName(string prefix, string name) { - return prefix + upperFirst(name); + return prefix.ToUpperInvariant() + upperFirst(name); } } } diff --git a/de4dot.code/renamer/asmmodules/Modules.cs b/de4dot.code/renamer/asmmodules/Modules.cs index 917bc74b..02eef038 100644 --- a/de4dot.code/renamer/asmmodules/Modules.cs +++ b/de4dot.code/renamer/asmmodules/Modules.cs @@ -324,7 +324,7 @@ namespace de4dot.renamer.asmmodules { AssemblyKeyDictionary typeToTypeDefDict = new AssemblyKeyDictionary(); ExternalAssemblies externalAssemblies = new ExternalAssemblies(); - TypeDef resolveOther(TypeReference type) { + public TypeDef resolveOther(TypeReference type) { if (type == null) return null; type = type.GetElementType(); diff --git a/de4dot.code/renamer/asmmodules/PropertyDef.cs b/de4dot.code/renamer/asmmodules/PropertyDef.cs index 8edb2800..d6b8cbd3 100644 --- a/de4dot.code/renamer/asmmodules/PropertyDef.cs +++ b/de4dot.code/renamer/asmmodules/PropertyDef.cs @@ -51,5 +51,13 @@ namespace de4dot.renamer.asmmodules { } return false; } + + public bool isItemProperty() { + if (GetMethod != null && GetMethod.ParamDefs.Count >= 1) + return true; + if (SetMethod != null && SetMethod.ParamDefs.Count >= 2) + return true; + return false; + } } }