Fix porting mistakes

This commit is contained in:
de4dot 2012-11-05 19:21:33 +01:00
parent ea001865c9
commit 6d45a3499f
6 changed files with 26 additions and 22 deletions

View File

@ -49,20 +49,23 @@ namespace AssemblyData.methodsrewriter {
} }
TypeResolver getTypeResolver(ITypeDefOrRef typeRef) { 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<TypeResolver> list; List<TypeResolver> list;
if (!types.TryGetValue(key, out list)) if (!types.TryGetValue(key, out list))
return null; return null;
if (typeRef is TypeDef) { if (scopeType is TypeDef) {
foreach (var resolver in list) { foreach (var resolver in list) {
if (resolver.type.MetadataToken == typeRef.MDToken.Raw) if (resolver.type.MetadataToken == scopeType.MDToken.Raw)
return resolver; return resolver;
} }
} }
foreach (var resolver in list) { foreach (var resolver in list) {
if (ResolverUtils.compareTypes(resolver.type, typeRef)) if (ResolverUtils.compareTypes(resolver.type, scopeType))
return resolver; return resolver;
} }

View File

@ -287,8 +287,8 @@ namespace AssemblyData.methodsrewriter {
for (int j = mparams.Count - 1; j >= 0; j--) { for (int j = mparams.Count - 1; j >= 0; j--) {
var argType = mparams[j]; var argType = mparams[j];
if (argType.ElementType == ElementType.ValueType) if (argType.RemovePinnedAndModifiers().IsValueType)
block.insert(n++, Instruction.Create(OpCodes.Box, ((ValueTypeSig)argType).TypeDefOrRef)); 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.Stloc, new Operand(Operand.Type.TempObj)));
block.insert(n++, create(OpCodes.Ldloc, new Operand(Operand.Type.TempObjArray))); block.insert(n++, create(OpCodes.Ldloc, new Operand(Operand.Type.TempObjArray)));
block.insert(n++, Instruction.Create(OpCodes.Ldc_I4, j)); 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.Ldc_I4, j));
block.insert(n++, Instruction.Create(OpCodes.Ldelem_Ref)); block.insert(n++, Instruction.Create(OpCodes.Ldelem_Ref));
var argType = mparams[j]; var argType = mparams[j];
if (argType.ElementType == ElementType.ValueType) if (argType.RemovePinnedAndModifiers().IsValueType)
block.insert(n++, Instruction.Create(OpCodes.Unbox_Any, ((ValueTypeSig)argType).TypeDefOrRef)); block.insert(n++, Instruction.Create(OpCodes.Unbox_Any, ((TypeDefOrRefSig)argType).TypeDefOrRef));
else { else {
// Don't cast it to its correct type. This will sometimes cause // Don't cast it to its correct type. This will sometimes cause
// an exception in some EF obfuscated assembly since we'll be // an exception in some EF obfuscated assembly since we'll be
// trying to cast a System.Reflection.AssemblyName type to some // trying to cast a System.Reflection.AssemblyName type to some
// other type. // other type.
// block.insert(n++, Instruction.Create(OpCodes.Castclass, argType)); // block.insert(n++, Instruction.Create(OpCodes.Castclass, argType.ToTypeDefOrRef()));
} }
} }
} }

View File

@ -94,12 +94,15 @@ namespace AssemblyData.methodsrewriter {
public static object getRtObject(ITokenOperand memberRef) { public static object getRtObject(ITokenOperand memberRef) {
if (memberRef == null) if (memberRef == null)
return null; return null;
else if (memberRef is ITypeDefOrRef) var tdr = memberRef as ITypeDefOrRef;
return getRtType((ITypeDefOrRef)memberRef); if (tdr != null)
else if (memberRef is IField) return getRtType(tdr);
return getRtField((IField)memberRef); var field = memberRef as IField;
else if (memberRef is IMethod) if (field != null && field.FieldSig != null)
return getRtMethod((IMethod)memberRef); 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)); throw new ApplicationException(string.Format("Unknown MemberReference: {0}", memberRef));
} }
@ -144,9 +147,7 @@ namespace AssemblyData.methodsrewriter {
var resolvedType = resolver.resolve(scopeType); var resolvedType = resolver.resolve(scopeType);
if (resolvedType != null) if (resolvedType != null)
return fixType(typeRef, resolvedType); return fixType(typeRef, resolvedType);
var tdr = typeRef as ITypeDefOrRef; throw new ApplicationException(string.Format("Could not resolve type {0} ({1:X8}) in assembly {2}", typeRef, typeRef.MDToken.Raw, resolver));
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));
} }
static FieldInfo resolve(IField fieldRef) { static FieldInfo resolve(IField fieldRef) {
@ -171,7 +172,7 @@ namespace AssemblyData.methodsrewriter {
static Type fixType(IType typeRef, Type type) { static Type fixType(IType typeRef, Type type) {
var sig = typeRef as TypeSig; var sig = typeRef as TypeSig;
if (sig != null) { if (sig == null) {
var ts = typeRef as TypeSpec; var ts = typeRef as TypeSpec;
if (ts != null) if (ts != null)
sig = ts.TypeSig; sig = ts.TypeSig;

View File

@ -617,7 +617,7 @@ namespace de4dot.code.deobfuscators {
protected override bool isValidType(IGenericParameterProvider gpp, TypeSig type) { protected override bool isValidType(IGenericParameterProvider gpp, TypeSig type) {
if (type == null) if (type == null)
return false; return false;
if (type.ElementType == ElementType.ValueType) if (type.IsValueType)
return false; return false;
if (type.ElementType == ElementType.Object) if (type.ElementType == ElementType.Object)
return false; return false;

View File

@ -55,7 +55,7 @@ namespace de4dot.code.renamer {
if (typeNames.TryGetValue(typeFullName, out nc)) if (typeNames.TryGetValue(typeFullName, out nc))
return nc.create(); return nc.create();
var fullName = elementType.FullName; var fullName = elementType == null ? typeRef.FullName : elementType.FullName;
string shortName; string shortName;
var dict = prefix == "" ? fullNameToShortName : fullNameToShortNamePrefix; var dict = prefix == "" ? fullNameToShortName : fullNameToShortNamePrefix;
if (!dict.TryGetValue(fullName, out shortName)) { if (!dict.TryGetValue(fullName, out shortName)) {

2
dot10

@ -1 +1 @@
Subproject commit 14a78f2ac7cf2460afede0dc63f867ec841c82f7 Subproject commit 83714ec1536ec43ca5dd1ef139f767e20902cd02