Fix porting mistakes
This commit is contained in:
parent
ea001865c9
commit
6d45a3499f
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
2
dot10
|
@ -1 +1 @@
|
||||||
Subproject commit 14a78f2ac7cf2460afede0dc63f867ec841c82f7
|
Subproject commit 83714ec1536ec43ca5dd1ef139f767e20902cd02
|
Loading…
Reference in New Issue
Block a user