MethodDef.Parameters contains the hidden 'this' param, so add some fixes to old code
This commit is contained in:
parent
6a8e8dcb78
commit
c9f1f8073e
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
2
dot10
|
@ -1 +1 @@
|
||||||
Subproject commit e532b444e4f3fbf7a84702d3fc30063d4973790f
|
Subproject commit ebd41734e89ab48d63f317958e8a5741aad1f431
|
Loading…
Reference in New Issue
Block a user