hazzik / DelegateDecompiler

A library which is able to decompile a delegate or a method body to its lambda representation
MIT License
526 stars 62 forks source link

Can we use DelegateDecomiler when we obfuscate the code? #103

Closed jojose closed 7 years ago

jojose commented 7 years ago

We are using 'Dotfuscator' to obfuscate the dlls. We started using DelegateDecompiler for supporting some functionality when using entity framework. The issue is that after obfuscation, the EF method call fails. We tried to Exclude the classes used in the EF calls from obfuscation but still the issue is there.

The following is the error we are getting

jojose commented 7 years ago
System.AggregateException: One or more errors occurred. ---> System.ArgumentException: metadataToken
Parameter name: Token 0x5d07727e is not a valid MemberInfo token in the scope of module RBS.Advisor.BusinessEntities.dll.
   at System.Reflection.RuntimeModule.ResolveMember(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
   at Mono.Reflection.MethodBodyReader.ReadOperand(Instruction instruction)
   at Mono.Reflection.MethodBodyReader.ReadInstructions()
   at Mono.Reflection.MethodBodyReader.GetInstructions(MethodBase method)
   at Mono.Reflection.Disassembler.GetInstructions(MethodBase self)
   at DelegateDecompiler.MethodBodyDecompiler.Decompile()
   at DelegateDecompiler.DecompileExtensions.<>c__DisplayClass2_0.<Decompile>b__0(MethodInfo m)
   at DelegateDecompiler.Cache`2.GetOrAdd(TKey key, Func`2 func)
   at DelegateDecompiler.DecompileExtensions.Decompile(MethodInfo method)
   at DelegateDecompiler.DecompileExpressionVisitor.Decompile(MethodInfo method, Expression instance, IList`1 arguments)
   at DelegateDecompiler.DecompileExpressionVisitor.VisitMember(MemberExpression node)
   at System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberAssignment(MemberAssignment node)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding node)
   at System.Linq.Expressions.ExpressionVisitor.Visit[T](ReadOnlyCollection`1 nodes, Func`2 elementVisitor)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberInit(MemberInitExpression node)
   at System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node)
   at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node)
   at System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes)
   at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
   at DelegateDecompiler.DecompileExpressionVisitor.VisitMethodCall(MethodCallExpression node)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at DelegateDecompiler.DecompiledQueryProvider.CreateQuery[TElement](Expression expression)
   at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector)
   at RBS.Advisor.AppServices.Households.HouseholdAppService.GetAuditEntries(Int32 householdId)
   at RBS.Advisor.Presentation.Modules.HouseholdModule.HouseholdView.AuditEntryController.<>c__DisplayClass8_0.<LoadData>b__0()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.ArgumentException: metadataToken
Parameter name: Token 0x5d07727e is not a valid MemberInfo token in the scope of module RBS.Advisor.BusinessEntities.dll.
   at System.Reflection.RuntimeModule.ResolveMember(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
   at Mono.Reflection.MethodBodyReader.ReadOperand(Instruction instruction)
   at Mono.Reflection.MethodBodyReader.ReadInstructions()
   at Mono.Reflection.MethodBodyReader.GetInstructions(MethodBase method)
   at Mono.Reflection.Disassembler.GetInstructions(MethodBase self)
   at DelegateDecompiler.MethodBodyDecompiler.Decompile()
   at DelegateDecompiler.DecompileExtensions.<>c__DisplayClass2_0.<Decompile>b__0(MethodInfo m)
   at DelegateDecompiler.Cache`2.GetOrAdd(TKey key, Func`2 func)
   at DelegateDecompiler.DecompileExtensions.Decompile(MethodInfo method)
   at DelegateDecompiler.DecompileExpressionVisitor.Decompile(MethodInfo method, Expression instance, IList`1 arguments)
   at DelegateDecompiler.DecompileExpressionVisitor.VisitMember(MemberExpression node)
   at System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberAssignment(MemberAssignment node)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberBinding(MemberBinding node)
   at System.Linq.Expressions.ExpressionVisitor.Visit[T](ReadOnlyCollection`1 nodes, Func`2 elementVisitor)
   at System.Linq.Expressions.ExpressionVisitor.VisitMemberInit(MemberInitExpression node)
   at System.Linq.Expressions.MemberInitExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node)
   at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node)
   at System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes)
   at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
   at DelegateDecompiler.DecompileExpressionVisitor.VisitMethodCall(MethodCallExpression node)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at DelegateDecompiler.DecompiledQueryProvider.CreateQuery[TElement](Expression expression)
   at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector)
   at RBS.Advisor.AppServices.Households.HouseholdAppService.GetAuditEntries(Int32 householdId)
   at RBS.Advisor.Presentation.Modules.HouseholdModule.HouseholdView.AuditEntryController.<>c__DisplayClass8_0.<LoadData>b__0()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()<---
 One or more errors occurred.    Source: 
hazzik commented 7 years ago

DelegateDecompiler depends on Mono.Reflection to read the bytecode of bodies of methods. It seems that Mono.Reflection does not understand the bytecode produced by Dotfuscator.

Please direct your questions to Mono.Reflection: https://github.com/jbevain/mono.reflection

From my point of view it's not supported.