diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index eab3a3c9..751018ac 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -704,6 +704,10 @@ namespace de4dot.code.deobfuscators { return name != null && checkValidName(name); } + public virtual bool isValidMethodReturnArgName(string name) { + return string.IsNullOrEmpty(name) || checkValidName(name); + } + public virtual bool isValidResourceKeyName(string name) { return name != null && checkValidName(name); } diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v3/Deobfuscator.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v3/Deobfuscator.cs index 19921c0b..5a4bb32b 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v3/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v3/Deobfuscator.cs @@ -218,6 +218,10 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v3 { return name != null && checkValidName(name, isRandomNameMembers); } + public override bool isValidMethodReturnArgName(string name) { + return string.IsNullOrEmpty(name) || checkValidName(name, isRandomNameMembers); + } + public override bool isValidResourceKeyName(string name) { return name != null && checkValidName(name, isRandomNameMembers); } diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs index b000c6eb..050a7d52 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs @@ -223,6 +223,10 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v4 { return name != null && checkValidName(name, isRandomNameMembers); } + public override bool isValidMethodReturnArgName(string name) { + return string.IsNullOrEmpty(name) || checkValidName(name, isRandomNameMembers); + } + public override bool isValidResourceKeyName(string name) { return name != null && checkValidName(name, isRandomNameMembers); } diff --git a/de4dot.code/renamer/INameChecker.cs b/de4dot.code/renamer/INameChecker.cs index 2edd05f0..f271bb9f 100644 --- a/de4dot.code/renamer/INameChecker.cs +++ b/de4dot.code/renamer/INameChecker.cs @@ -27,6 +27,7 @@ namespace de4dot.code.renamer { bool isValidFieldName(string name); bool isValidGenericParamName(string name); bool isValidMethodArgName(string name); + bool isValidMethodReturnArgName(string name); bool isValidResourceKeyName(string name); } } diff --git a/de4dot.code/renamer/MemberInfos.cs b/de4dot.code/renamer/MemberInfos.cs index e9ae420b..22918903 100644 --- a/de4dot.code/renamer/MemberInfos.cs +++ b/de4dot.code/renamer/MemberInfos.cs @@ -282,7 +282,7 @@ namespace de4dot.code.renamer { allMethodInfos[method] = new MethodInfo(method); foreach (var gp in method.GenericParams) allGenericParamInfos[gp] = new GenericParamInfo(gp); - foreach (var param in method.ParamDefs) + foreach (var param in method.AllParamDefs) allParamInfos[param] = new ParamInfo(param); } } diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index 915aaea2..b872d292 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -303,12 +303,16 @@ namespace de4dot.code.renamer { } if (RenameMethodArgs) { - foreach (var param in methodDef.ParamDefs) { + foreach (var param in methodDef.AllParamDefs) { var paramInfo = memberInfos.param(param); if (!paramInfo.gotNewName()) continue; + param.ParameterDefinition.CreateParamDef(); param.ParameterDefinition.Name = paramInfo.newName; - Log.v("Param ({0}/{1}): {2} => {3}", param.Index + 1, methodDef.ParamDefs.Count, Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); + if (param.IsReturnParameter) + Log.v("RetParam: {0} => {1}", Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); + else + Log.v("Param ({0}/{1}): {2} => {3}", param.Index + 1, methodDef.ParamDefs.Count, Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); } } diff --git a/de4dot.code/renamer/TypeInfo.cs b/de4dot.code/renamer/TypeInfo.cs index cbb9107f..f5668ccc 100644 --- a/de4dot.code/renamer/TypeInfo.cs +++ b/de4dot.code/renamer/TypeInfo.cs @@ -293,10 +293,10 @@ namespace de4dot.code.renamer { } void prepareRenameMethodArgs(MMethodDef methodDef) { + VariableNameState newVariableNameState = null; + ParamInfo info; if (methodDef.ParamDefs.Count > 0) { if (isEventHandler(methodDef)) { - ParamInfo info; - info = param(methodDef.ParamDefs[0]); if (!info.gotNewName()) info.newName = "sender"; @@ -306,10 +306,10 @@ namespace de4dot.code.renamer { info.newName = "e"; } else { - var newVariableNameState = variableNameState.cloneParamsOnly(); + newVariableNameState = variableNameState.cloneParamsOnly(); var checker = NameChecker; foreach (var paramDef in methodDef.ParamDefs) { - var info = param(paramDef); + info = param(paramDef); if (info.gotNewName()) continue; if (!checker.isValidMethodArgName(info.oldName)) @@ -318,6 +318,15 @@ namespace de4dot.code.renamer { } } + info = param(methodDef.ReturnParamDef); + if (!info.gotNewName()) { + if (!NameChecker.isValidMethodReturnArgName(info.oldName)) { + if (newVariableNameState == null) + newVariableNameState = variableNameState.cloneParamsOnly(); + info.newName = newVariableNameState.getNewParamName(info.oldName, methodDef.ReturnParamDef.ParameterDefinition); + } + } + if ((methodDef.Property != null && methodDef == methodDef.Property.SetMethod) || (methodDef.Event != null && (methodDef == methodDef.Event.AddMethod || methodDef == methodDef.Event.RemoveMethod))) { if (methodDef.ParamDefs.Count > 0) { diff --git a/de4dot.code/renamer/asmmodules/MethodDef.cs b/de4dot.code/renamer/asmmodules/MethodDef.cs index 81419f43..24d844dd 100644 --- a/de4dot.code/renamer/asmmodules/MethodDef.cs +++ b/de4dot.code/renamer/asmmodules/MethodDef.cs @@ -24,6 +24,7 @@ namespace de4dot.code.renamer.asmmodules { class MMethodDef : Ref { IList genericParams; IList paramDefs = new List(); + MParamDef returnParamDef; public MPropertyDef Property { get; set; } public MEventDef Event { get; set; } @@ -32,6 +33,18 @@ namespace de4dot.code.renamer.asmmodules { get { return paramDefs; } } + public IEnumerable AllParamDefs { + get { + yield return returnParamDef; + foreach (var paramDef in paramDefs) + yield return paramDef; + } + } + + public MParamDef ReturnParamDef { + get { return returnParamDef; } + } + public IList GenericParams { get { return genericParams; } } @@ -47,6 +60,7 @@ namespace de4dot.code.renamer.asmmodules { var param = methodDefinition.Parameters[i]; paramDefs.Add(new MParamDef(param, i)); } + returnParamDef = new MParamDef(methodDefinition.Parameters.ReturnParameter, -1); } public bool isPublic() { diff --git a/de4dot.code/renamer/asmmodules/ParamDef.cs b/de4dot.code/renamer/asmmodules/ParamDef.cs index 252ff377..d831ecd7 100644 --- a/de4dot.code/renamer/asmmodules/ParamDef.cs +++ b/de4dot.code/renamer/asmmodules/ParamDef.cs @@ -23,6 +23,9 @@ namespace de4dot.code.renamer.asmmodules { class MParamDef { public Parameter ParameterDefinition { get; set; } public int Index { get; private set; } + public bool IsReturnParameter { + get { return Index < 0; } + } public MParamDef(Parameter parameterDefinition, int index) { this.ParameterDefinition = parameterDefinition; diff --git a/dot10 b/dot10 index e203b3f5..9386800a 160000 --- a/dot10 +++ b/dot10 @@ -1 +1 @@ -Subproject commit e203b3f5b67d7c0e737cb953c62ae99dde1340e7 +Subproject commit 9386800adc7057e8b90e7ac6af7d5725794d23d3