From b2801872d79893d5d0359960bd81aa82a1e7cc17 Mon Sep 17 00:00:00 2001 From: de4dot Date: Sun, 4 Dec 2011 20:01:02 +0100 Subject: [PATCH] Update detection of invalid types when restoring field/method arg types --- de4dot.code/deobfuscators/TypesRestorer.cs | 40 +++++++++++++--------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/de4dot.code/deobfuscators/TypesRestorer.cs b/de4dot.code/deobfuscators/TypesRestorer.cs index ffed6806..c5a896d9 100644 --- a/de4dot.code/deobfuscators/TypesRestorer.cs +++ b/de4dot.code/deobfuscators/TypesRestorer.cs @@ -708,24 +708,32 @@ namespace de4dot.deobfuscators { if (MemberReferenceHelper.verifyType(type, "mscorlib", "System.Void")) return false; - switch (MemberReferenceHelper.getMemberReferenceType(type)) { - case CecilType.ArrayType: - case CecilType.GenericInstanceType: - case CecilType.PointerType: - case CecilType.TypeDefinition: - case CecilType.TypeReference: - return true; + while (type != null) { + switch (MemberReferenceHelper.getMemberReferenceType(type)) { + case CecilType.ArrayType: + case CecilType.GenericInstanceType: + case CecilType.PointerType: + case CecilType.TypeDefinition: + case CecilType.TypeReference: + break; - case CecilType.ByReferenceType: - case CecilType.FunctionPointerType: - case CecilType.GenericParameter: - case CecilType.OptionalModifierType: - case CecilType.PinnedType: - case CecilType.RequiredModifierType: - case CecilType.SentinelType: - default: - return false; + case CecilType.ByReferenceType: + case CecilType.FunctionPointerType: + case CecilType.GenericParameter: + case CecilType.OptionalModifierType: + case CecilType.PinnedType: + case CecilType.RequiredModifierType: + case CecilType.SentinelType: + default: + return false; + } + + if (!(type is TypeSpecification)) + break; + type = ((TypeSpecification)type).ElementType; } + + return type != null; } static TypeReference getCommonBaseClass(ModuleDefinition module, TypeReference a, TypeReference b) {