From 6d45a3499fb72b1a92a0a625ee467fc91c273544 Mon Sep 17 00:00:00 2001 From: de4dot Date: Mon, 5 Nov 2012 19:21:33 +0100 Subject: [PATCH] Fix porting mistakes --- .../methodsrewriter/AssemblyResolver.cs | 11 ++++++---- .../methodsrewriter/MethodsRewriter.cs | 10 ++++----- AssemblyData/methodsrewriter/Resolver.cs | 21 ++++++++++--------- de4dot.code/deobfuscators/TypesRestorer.cs | 2 +- de4dot.code/renamer/TypeNames.cs | 2 +- dot10 | 2 +- 6 files changed, 26 insertions(+), 22 deletions(-) diff --git a/AssemblyData/methodsrewriter/AssemblyResolver.cs b/AssemblyData/methodsrewriter/AssemblyResolver.cs index a52cc7ce..5295995b 100644 --- a/AssemblyData/methodsrewriter/AssemblyResolver.cs +++ b/AssemblyData/methodsrewriter/AssemblyResolver.cs @@ -49,20 +49,23 @@ namespace AssemblyData.methodsrewriter { } TypeResolver getTypeResolver(ITypeDefOrRef typeRef) { - var key = typeRef.Namespace + "." + typeRef.TypeName; + if (typeRef == null) + return null; + var scopeType = typeRef.ScopeType; + var key = scopeType.Namespace + "." + scopeType.TypeName; List list; if (!types.TryGetValue(key, out list)) return null; - if (typeRef is TypeDef) { + if (scopeType is TypeDef) { foreach (var resolver in list) { - if (resolver.type.MetadataToken == typeRef.MDToken.Raw) + if (resolver.type.MetadataToken == scopeType.MDToken.Raw) return resolver; } } foreach (var resolver in list) { - if (ResolverUtils.compareTypes(resolver.type, typeRef)) + if (ResolverUtils.compareTypes(resolver.type, scopeType)) return resolver; } diff --git a/AssemblyData/methodsrewriter/MethodsRewriter.cs b/AssemblyData/methodsrewriter/MethodsRewriter.cs index cc4affb3..7186c41d 100644 --- a/AssemblyData/methodsrewriter/MethodsRewriter.cs +++ b/AssemblyData/methodsrewriter/MethodsRewriter.cs @@ -287,8 +287,8 @@ namespace AssemblyData.methodsrewriter { for (int j = mparams.Count - 1; j >= 0; j--) { var argType = mparams[j]; - if (argType.ElementType == ElementType.ValueType) - block.insert(n++, Instruction.Create(OpCodes.Box, ((ValueTypeSig)argType).TypeDefOrRef)); + if (argType.RemovePinnedAndModifiers().IsValueType) + block.insert(n++, Instruction.Create(OpCodes.Box, ((TypeDefOrRefSig)argType).TypeDefOrRef)); block.insert(n++, create(OpCodes.Stloc, new Operand(Operand.Type.TempObj))); block.insert(n++, create(OpCodes.Ldloc, new Operand(Operand.Type.TempObjArray))); block.insert(n++, Instruction.Create(OpCodes.Ldc_I4, j)); @@ -310,14 +310,14 @@ namespace AssemblyData.methodsrewriter { block.insert(n++, Instruction.Create(OpCodes.Ldc_I4, j)); block.insert(n++, Instruction.Create(OpCodes.Ldelem_Ref)); var argType = mparams[j]; - if (argType.ElementType == ElementType.ValueType) - block.insert(n++, Instruction.Create(OpCodes.Unbox_Any, ((ValueTypeSig)argType).TypeDefOrRef)); + if (argType.RemovePinnedAndModifiers().IsValueType) + block.insert(n++, Instruction.Create(OpCodes.Unbox_Any, ((TypeDefOrRefSig)argType).TypeDefOrRef)); else { // Don't cast it to its correct type. This will sometimes cause // an exception in some EF obfuscated assembly since we'll be // trying to cast a System.Reflection.AssemblyName type to some // other type. - // block.insert(n++, Instruction.Create(OpCodes.Castclass, argType)); + // block.insert(n++, Instruction.Create(OpCodes.Castclass, argType.ToTypeDefOrRef())); } } } diff --git a/AssemblyData/methodsrewriter/Resolver.cs b/AssemblyData/methodsrewriter/Resolver.cs index fd9af88f..9d593089 100644 --- a/AssemblyData/methodsrewriter/Resolver.cs +++ b/AssemblyData/methodsrewriter/Resolver.cs @@ -94,12 +94,15 @@ namespace AssemblyData.methodsrewriter { public static object getRtObject(ITokenOperand memberRef) { if (memberRef == null) return null; - else if (memberRef is ITypeDefOrRef) - return getRtType((ITypeDefOrRef)memberRef); - else if (memberRef is IField) - return getRtField((IField)memberRef); - else if (memberRef is IMethod) - return getRtMethod((IMethod)memberRef); + var tdr = memberRef as ITypeDefOrRef; + if (tdr != null) + return getRtType(tdr); + var field = memberRef as IField; + if (field != null && field.FieldSig != null) + return getRtField(field); + var method = memberRef as IMethod; + if (method != null && method.MethodSig != null) + return getRtMethod(method); throw new ApplicationException(string.Format("Unknown MemberReference: {0}", memberRef)); } @@ -144,9 +147,7 @@ namespace AssemblyData.methodsrewriter { var resolvedType = resolver.resolve(scopeType); if (resolvedType != null) return fixType(typeRef, resolvedType); - var tdr = typeRef as ITypeDefOrRef; - uint token = tdr == null ? 0 : tdr.MDToken.Raw; - throw new ApplicationException(string.Format("Could not resolve type {0} ({1:X8}) in assembly {2}", typeRef, token, resolver)); + throw new ApplicationException(string.Format("Could not resolve type {0} ({1:X8}) in assembly {2}", typeRef, typeRef.MDToken.Raw, resolver)); } static FieldInfo resolve(IField fieldRef) { @@ -171,7 +172,7 @@ namespace AssemblyData.methodsrewriter { static Type fixType(IType typeRef, Type type) { var sig = typeRef as TypeSig; - if (sig != null) { + if (sig == null) { var ts = typeRef as TypeSpec; if (ts != null) sig = ts.TypeSig; diff --git a/de4dot.code/deobfuscators/TypesRestorer.cs b/de4dot.code/deobfuscators/TypesRestorer.cs index f7454e90..f7e065fb 100644 --- a/de4dot.code/deobfuscators/TypesRestorer.cs +++ b/de4dot.code/deobfuscators/TypesRestorer.cs @@ -617,7 +617,7 @@ namespace de4dot.code.deobfuscators { protected override bool isValidType(IGenericParameterProvider gpp, TypeSig type) { if (type == null) return false; - if (type.ElementType == ElementType.ValueType) + if (type.IsValueType) return false; if (type.ElementType == ElementType.Object) return false; diff --git a/de4dot.code/renamer/TypeNames.cs b/de4dot.code/renamer/TypeNames.cs index 0b2a7c0c..82ed6626 100644 --- a/de4dot.code/renamer/TypeNames.cs +++ b/de4dot.code/renamer/TypeNames.cs @@ -55,7 +55,7 @@ namespace de4dot.code.renamer { if (typeNames.TryGetValue(typeFullName, out nc)) return nc.create(); - var fullName = elementType.FullName; + var fullName = elementType == null ? typeRef.FullName : elementType.FullName; string shortName; var dict = prefix == "" ? fullNameToShortName : fullNameToShortNamePrefix; if (!dict.TryGetValue(fullName, out shortName)) { diff --git a/dot10 b/dot10 index 14a78f2a..83714ec1 160000 --- a/dot10 +++ b/dot10 @@ -1 +1 @@ -Subproject commit 14a78f2ac7cf2460afede0dc63f867ec841c82f7 +Subproject commit 83714ec1536ec43ca5dd1ef139f767e20902cd02