MethodDef.Parameters contains the hidden 'this' param, so add some fixes to old code

This commit is contained in:
de4dot 2012-11-04 22:41:45 +01:00
parent 6a8e8dcb78
commit c9f1f8073e
12 changed files with 57 additions and 32 deletions

View File

@ -332,7 +332,7 @@ namespace AssemblyData.methodsrewriter {
} }
static IList<TypeSig> getParameters(MethodDef method) { static IList<TypeSig> getParameters(MethodDef method) {
var list = new List<TypeSig>(method.Parameters.Count + 1); var list = new List<TypeSig>(method.Parameters.Count);
for (int i = 0; i < method.Parameters.Count; i++) for (int i = 0; i < method.Parameters.Count; i++)
list.Add(method.Parameters[i].Type); list.Add(method.Parameters[i].Type);
return list; return list;

View File

@ -436,15 +436,16 @@ namespace de4dot.code {
if (methodName != null && methodName != method.Name) if (methodName != null && methodName != method.Name)
continue; continue;
var sig = method.MethodSig;
if (argsStrings == null) { if (argsStrings == null) {
if (method.Parameters.Count == 0) if (sig.Params.Count == 0)
continue; continue;
} }
else { else {
if (argsStrings.Length != method.Parameters.Count) if (argsStrings.Length != sig.Params.Count)
continue; continue;
for (int i = 0; i < argsStrings.Length; i++) { for (int i = 0; i < argsStrings.Length; i++) {
if (argsStrings[i] != method.Parameters[i].Type.FullName) if (argsStrings[i] != sig.Params[i].FullName)
continue; continue;
} }
} }

View File

@ -260,6 +260,8 @@ namespace de4dot.code.deobfuscators {
argInfos.Clear(); argInfos.Clear();
foreach (var arg in method.Parameters) { foreach (var arg in method.Parameters) {
if (arg.IsHiddenThisParameter)
continue;
if (!isUnknownType(arg)) if (!isUnknownType(arg))
continue; continue;
argInfos[arg] = new TypeInfo<Parameter>(arg); argInfos[arg] = new TypeInfo<Parameter>(arg);

View File

@ -312,7 +312,7 @@ namespace de4dot.code.renamer {
if (param.IsReturnParameter) if (param.IsReturnParameter)
Log.v("RetParam: {0} => {1}", Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); Log.v("RetParam: {0} => {1}", Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName));
else else
Log.v("Param ({0}/{1}): {2} => {3}", param.Index + 1, methodDef.ParamDefs.Count, Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); Log.v("Param ({0}/{1}): {2} => {3}", param.ParameterDefinition.MethodSigIndex + 1, methodDef.MethodDef.MethodSig.Params.Count, Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName));
} }
} }
@ -600,10 +600,10 @@ namespace de4dot.code.renamer {
if (propMethod.Property != null) if (propMethod.Property != null)
return null; return null;
var method = propMethod.MethodDef; var sig = propMethod.MethodDef.MethodSig;
if (method.Parameters.Count == 0) if (sig.Params.Count == 0)
return null; return null;
var propType = method.Parameters[method.Parameters.Count - 1].Type; var propType = sig.Params[sig.Params.Count - 1];
var propDef = createProperty(ownerType, name, propType, null, propMethod.MethodDef); var propDef = createProperty(ownerType, name, propType, null, propMethod.MethodDef);
if (propDef == null) if (propDef == null)
return null; return null;
@ -912,7 +912,7 @@ namespace de4dot.code.renamer {
void restoreMethodArgs(MethodNameGroups groups) { void restoreMethodArgs(MethodNameGroups groups) {
foreach (var group in groups.getAllGroups()) { foreach (var group in groups.getAllGroups()) {
if (group.Methods[0].ParamDefs.Count == 0) if (group.Methods[0].VisibleParameterCount == 0)
continue; continue;
var argNames = getValidArgNames(group); var argNames = getValidArgNames(group);
@ -949,7 +949,7 @@ namespace de4dot.code.renamer {
if (overrideDef == null) if (overrideDef == null)
continue; continue;
} }
if (overrideDef.ParamDefs.Count != method.ParamDefs.Count) if (overrideDef.VisibleParameterCount != method.VisibleParameterCount)
continue; continue;
methods.Add(overrideDef); methods.Add(overrideDef);
} }
@ -1373,7 +1373,7 @@ namespace de4dot.code.renamer {
static PropertyMethodType getPropertyMethodType(MMethodDef method) { static PropertyMethodType getPropertyMethodType(MMethodDef method) {
if (DotNetUtils.hasReturnValue(method.MethodDef)) if (DotNetUtils.hasReturnValue(method.MethodDef))
return PropertyMethodType.Getter; return PropertyMethodType.Getter;
if (method.ParamDefs.Count > 0) if (method.VisibleParameterCount > 0)
return PropertyMethodType.Setter; return PropertyMethodType.Setter;
return PropertyMethodType.Other; return PropertyMethodType.Other;
} }

View File

@ -295,13 +295,13 @@ namespace de4dot.code.renamer {
void prepareRenameMethodArgs(MMethodDef methodDef) { void prepareRenameMethodArgs(MMethodDef methodDef) {
VariableNameState newVariableNameState = null; VariableNameState newVariableNameState = null;
ParamInfo info; ParamInfo info;
if (methodDef.ParamDefs.Count > 0) { if (methodDef.VisibleParameterCount > 0) {
if (isEventHandler(methodDef)) { if (isEventHandler(methodDef)) {
info = param(methodDef.ParamDefs[0]); info = param(methodDef.ParamDefs[methodDef.VisibleParameterBaseIndex]);
if (!info.gotNewName()) if (!info.gotNewName())
info.newName = "sender"; info.newName = "sender";
info = param(methodDef.ParamDefs[1]); info = param(methodDef.ParamDefs[methodDef.VisibleParameterBaseIndex + 1]);
if (!info.gotNewName()) if (!info.gotNewName())
info.newName = "e"; info.newName = "e";
} }
@ -309,6 +309,8 @@ namespace de4dot.code.renamer {
newVariableNameState = variableNameState.cloneParamsOnly(); newVariableNameState = variableNameState.cloneParamsOnly();
var checker = NameChecker; var checker = NameChecker;
foreach (var paramDef in methodDef.ParamDefs) { foreach (var paramDef in methodDef.ParamDefs) {
if (paramDef.IsHiddenThisParameter)
continue;
info = param(paramDef); info = param(paramDef);
if (info.gotNewName()) if (info.gotNewName())
continue; continue;
@ -329,7 +331,7 @@ namespace de4dot.code.renamer {
if ((methodDef.Property != null && methodDef == methodDef.Property.SetMethod) || if ((methodDef.Property != null && methodDef == methodDef.Property.SetMethod) ||
(methodDef.Event != null && (methodDef == methodDef.Event.AddMethod || methodDef == methodDef.Event.RemoveMethod))) { (methodDef.Event != null && (methodDef == methodDef.Event.AddMethod || methodDef == methodDef.Event.RemoveMethod))) {
if (methodDef.ParamDefs.Count > 0) { if (methodDef.VisibleParameterCount > 0) {
var paramDef = methodDef.ParamDefs[methodDef.ParamDefs.Count - 1]; var paramDef = methodDef.ParamDefs[methodDef.ParamDefs.Count - 1];
param(paramDef).newName = "value"; param(paramDef).newName = "value";
} }
@ -403,17 +405,14 @@ namespace de4dot.code.renamer {
} }
static bool isEventHandler(MMethodDef methodDef) { static bool isEventHandler(MMethodDef methodDef) {
var md = methodDef.MethodDef; var sig = methodDef.MethodDef.MethodSig;
if (md.Parameters.Count != 2) if (sig == null || sig.Params.Count != 2)
return false;
var sig = md.MethodSig;
if (sig == null)
return false; return false;
if (sig.RetType.ElementType != ElementType.Void) if (sig.RetType.ElementType != ElementType.Void)
return false; return false;
if (md.Parameters[0].Type.ElementType != ElementType.Object) if (sig.Params[0].ElementType != ElementType.Object)
return false; return false;
if (!md.Parameters[1].Type.FullName.Contains("EventArgs")) if (!sig.Params[1].FullName.Contains("EventArgs"))
return false; return false;
return true; return true;
} }
@ -588,7 +587,7 @@ namespace de4dot.code.renamer {
return null; return null;
if (sig.RetType.ElementType != ElementType.Void) if (sig.RetType.ElementType != ElementType.Void)
return null; return null;
if (method.Parameters.Count != 1) if (sig.Params.Count != 1)
return null; return null;
if (method.CilBody.LocalList.Count != 1) if (method.CilBody.LocalList.Count != 1)
return null; return null;

View File

@ -67,7 +67,7 @@ namespace de4dot.code.renamer {
bool isGenericParam(ITypeDefOrRef tdr) { bool isGenericParam(ITypeDefOrRef tdr) {
var ts = tdr as TypeSpec; var ts = tdr as TypeSpec;
if (ts != null) if (ts == null)
return false; return false;
var sig = ts.TypeSig.RemovePinnedAndModifiers(); var sig = ts.TypeSig.RemovePinnedAndModifiers();
return sig is GenericSig; return sig is GenericSig;

View File

@ -25,10 +25,20 @@ namespace de4dot.code.renamer.asmmodules {
IList<MGenericParamDef> genericParams; IList<MGenericParamDef> genericParams;
IList<MParamDef> paramDefs = new List<MParamDef>(); IList<MParamDef> paramDefs = new List<MParamDef>();
MParamDef returnParamDef; MParamDef returnParamDef;
int visibleParamCount;
int visibleBaseIndex;
public MPropertyDef Property { get; set; } public MPropertyDef Property { get; set; }
public MEventDef Event { get; set; } public MEventDef Event { get; set; }
public int VisibleParameterCount {
get { return visibleParamCount; }
}
public int VisibleParameterBaseIndex {
get { return visibleBaseIndex; }
}
public IList<MParamDef> ParamDefs { public IList<MParamDef> ParamDefs {
get { return paramDefs; } get { return paramDefs; }
} }
@ -56,8 +66,11 @@ namespace de4dot.code.renamer.asmmodules {
public MMethodDef(MethodDef methodDefinition, MTypeDef owner, int index) public MMethodDef(MethodDef methodDefinition, MTypeDef owner, int index)
: base(methodDefinition, owner, index) { : base(methodDefinition, owner, index) {
genericParams = MGenericParamDef.createGenericParamDefList(MethodDef.GenericParams); genericParams = MGenericParamDef.createGenericParamDefList(MethodDef.GenericParams);
visibleBaseIndex = methodDefinition.MethodSig.HasThis ? 1 : 0;
for (int i = 0; i < methodDefinition.Parameters.Count; i++) { for (int i = 0; i < methodDefinition.Parameters.Count; i++) {
var param = methodDefinition.Parameters[i]; var param = methodDefinition.Parameters[i];
if (param.IsNormalMethodParameter)
visibleParamCount++;
paramDefs.Add(new MParamDef(param, i)); paramDefs.Add(new MParamDef(param, i));
} }
returnParamDef = new MParamDef(methodDefinition.Parameters.ReturnParameter, -1); returnParamDef = new MParamDef(methodDefinition.Parameters.ReturnParameter, -1);

View File

@ -225,6 +225,10 @@ namespace de4dot.code.renamer.asmmodules {
newTypes.add(typeDef); newTypes.add(typeDef);
} }
types = newTypes; types = newTypes;
bool old = ModuleDefMD.EnableTypeDefFindCache;
ModuleDefMD.EnableTypeDefFindCache = false;
ModuleDefMD.EnableTypeDefFindCache = old;
} }
static ITypeDefOrRef getNonGenericTypeReference(ITypeDefOrRef typeRef) { static ITypeDefOrRef getNonGenericTypeReference(ITypeDefOrRef typeRef) {

View File

@ -377,30 +377,33 @@ namespace de4dot.code.renamer.asmmodules {
if (scope == null) if (scope == null)
return null; return null;
if (scope.ScopeType == ScopeType.AssemblyRef) var scopeType = scope.ScopeType;
if (scopeType == ScopeType.AssemblyRef)
return findModules((AssemblyRef)scope); return findModules((AssemblyRef)scope);
if (scope.ScopeType == ScopeType.ModuleDef) { if (scopeType == ScopeType.ModuleDef) {
var modules = findModules((ModuleDef)scope); var modules = findModules((ModuleDef)scope);
if (modules != null) if (modules != null)
return modules; return modules;
} }
if (scope.ScopeType == ScopeType.ModuleRef) { if (scopeType == ScopeType.ModuleRef) {
var moduleRef = (ModuleRef)scope; var moduleRef = (ModuleRef)scope;
if (moduleRef.Name == type.OwnerModule.Name) { if (moduleRef.Name == type.OwnerModule.Name) {
var modules = findModules(type.OwnerModule); var modules = findModules(type.OwnerModule);
if (modules != null) if (modules != null)
return modules; return modules;
} }
}
if (scopeType == ScopeType.ModuleRef || scopeType == ScopeType.ModuleDef) {
var asm = type.OwnerModule.Assembly; var asm = type.OwnerModule.Assembly;
if (asm == null) if (asm == null)
return null; return null;
var moduleHash = assemblyHash.lookup(asm.FullName); var moduleHash = assemblyHash.lookup(asm.FullName);
if (moduleHash == null) if (moduleHash == null)
return null; return null;
var module = moduleHash.lookup(moduleRef.Name.String); var module = moduleHash.lookup(scope.ScopeName);
if (module == null) if (module == null)
return null; return null;
return new List<Module> { module }; return new List<Module> { module };

View File

@ -24,7 +24,10 @@ namespace de4dot.code.renamer.asmmodules {
public Parameter ParameterDefinition { get; set; } public Parameter ParameterDefinition { get; set; }
public int Index { get; private set; } public int Index { get; private set; }
public bool IsReturnParameter { public bool IsReturnParameter {
get { return Index < 0; } get { return ParameterDefinition.IsReturnTypeParameter; }
}
public bool IsHiddenThisParameter {
get { return ParameterDefinition.IsHiddenThisParameter; }
} }
public MParamDef(Parameter parameterDefinition, int index) { public MParamDef(Parameter parameterDefinition, int index) {

View File

@ -53,9 +53,9 @@ namespace de4dot.code.renamer.asmmodules {
} }
public bool isItemProperty() { public bool isItemProperty() {
if (GetMethod != null && GetMethod.ParamDefs.Count >= 1) if (GetMethod != null && GetMethod.VisibleParameterCount >= 1)
return true; return true;
if (SetMethod != null && SetMethod.ParamDefs.Count >= 2) if (SetMethod != null && SetMethod.VisibleParameterCount >= 2)
return true; return true;
return false; return false;
} }

2
dot10

@ -1 +1 @@
Subproject commit e532b444e4f3fbf7a84702d3fc30063d4973790f Subproject commit ebd41734e89ab48d63f317958e8a5741aad1f431