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) {
var key = typeRef.Namespace + "." + typeRef.TypeName;
if (typeRef == null)
return null;
var scopeType = typeRef.ScopeType;
var key = scopeType.Namespace + "." + scopeType.TypeName;
List<TypeResolver> 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;
}

View File

@ -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()));
}
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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)) {

2
dot10

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