diff --git a/de4dot.code/deobfuscators/MethodStack.cs b/de4dot.code/deobfuscators/MethodStack.cs index 780cf0b9..e52c3262 100644 --- a/de4dot.code/deobfuscators/MethodStack.cs +++ b/de4dot.code/deobfuscators/MethodStack.cs @@ -160,6 +160,7 @@ namespace de4dot.code.deobfuscators { return null; TypeReference fieldType; + VariableDefinition local; switch (pushInstr.OpCode.Code) { case Code.Ldstr: fieldType = method.Module.TypeSystem.String; @@ -211,12 +212,25 @@ namespace de4dot.code.deobfuscators { case Code.Ldloc_1: case Code.Ldloc_2: case Code.Ldloc_3: - var local = DotNetUtils.getLocalVar(method.Body.Variables, pushInstr); + local = DotNetUtils.getLocalVar(method.Body.Variables, pushInstr); if (local == null) return null; fieldType = local.VariableType; break; + case Code.Ldloca: + case Code.Ldloca_S: + local = pushInstr.Operand as VariableDefinition; + if (local == null) + return null; + fieldType = createByReferenceType(local.VariableType); + break; + + case Code.Ldarga: + case Code.Ldarga_S: + fieldType = createByReferenceType(DotNetUtils.getArgType(method, pushInstr)); + break; + case Code.Ldfld: case Code.Ldsfld: var field2 = pushInstr.Operand as FieldReference;