Esempio n. 1
0
        NameCreator getNameCreator(TypeDefinition typeDefinition, string newBaseTypeName)
        {
            var nameCreator = createUnknownTypeName;

            if (typeDefinition.IsEnum)
            {
                nameCreator = createEnumName;
            }
            else if (typeDefinition.IsValueType)
            {
                nameCreator = createStructName;
            }
            else if (typeDefinition.IsClass)
            {
                if (typeDefinition.BaseType != null)
                {
                    if (MemberReferenceHelper.verifyType(typeDefinition.BaseType, "mscorlib", "System.Delegate"))
                    {
                        nameCreator = createDelegateName;
                    }
                    else if (MemberReferenceHelper.verifyType(typeDefinition.BaseType, "mscorlib", "System.MulticastDelegate"))
                    {
                        nameCreator = createDelegateName;
                    }
                    else
                    {
                        nameCreator = nameInfos.find(newBaseTypeName ?? typeDefinition.BaseType.Name);
                        if (nameCreator == null)
                        {
                            nameCreator = createClassName;
                        }
                    }
                }
                else
                {
                    nameCreator = createClassName;
                }
            }
            else if (typeDefinition.IsInterface)
            {
                nameCreator = createInterfaceName;
            }
            return(nameCreator);
        }
Esempio n. 2
0
        void update(Block block, NewMethodInfo currentMethodInfo)
        {
            var instrs = block.Instructions;

            for (int i = 0; i < instrs.Count; i++)
            {
                var instr = instrs[i];
                if (instr.OpCode == OpCodes.Newobj)
                {
                    var ctor = (MethodReference)instr.Operand;
                    if (MemberReferenceHelper.verifyType(ctor.DeclaringType, "mscorlib", "System.Diagnostics.StackTrace"))
                    {
                        insertLoadThis(block, i + 1);
                        insertCallOurMethod(block, i + 2, "static_rtFixStackTrace");
                        i += 2;
                        continue;
                    }
                    else if (MemberReferenceHelper.verifyType(ctor.DeclaringType, "mscorlib", "System.Diagnostics.StackFrame"))
                    {
                        insertLoadThis(block, i + 1);
                        insertCallOurMethod(block, i + 2, "static_rtFixStackFrame");
                        i += 2;
                        continue;
                    }
                }

                if (instr.OpCode == OpCodes.Call || instr.OpCode == OpCodes.Callvirt)
                {
                    var calledMethod = (MethodReference)instr.Operand;
                    if (DotNetUtils.isSameAssembly(calledMethod.DeclaringType, "mscorlib"))
                    {
                        if (calledMethod.ToString() == "System.Reflection.Assembly System.Reflection.Assembly::GetAssembly(System.Type)")
                        {
                            block.replace(i, 1, Instruction.Create(OpCodes.Nop));
                            insertLoadThis(block, i + 1);
                            insertCallOurMethod(block, i + 2, "static_rtGetAssembly_TypeArg");
                            i += 2;
                            continue;
                        }
                        else if (calledMethod.ToString() == "System.Reflection.Assembly System.Reflection.Assembly::GetCallingAssembly()" ||
                                 calledMethod.ToString() == "System.Reflection.Assembly System.Reflection.Assembly::GetEntryAssembly()" ||
                                 calledMethod.ToString() == "System.Reflection.Assembly System.Reflection.Assembly::GetExecutingAssembly()")
                        {
                            block.replace(i, 1, Instruction.Create(OpCodes.Nop));
                            insertLoadThis(block, i + 1);
                            block.insert(i + 2, Instruction.Create(OpCodes.Ldc_I4, currentMethodInfo.delegateIndex));
                            insertCallOurMethod(block, i + 3, "rtGetAssembly");
                            i += 3;
                            continue;
                        }
                    }

                    var method = Resolver.getMethod((MethodReference)instr.Operand);
                    if (method != null)
                    {
                        createMethod(method.methodBase);
                        var newMethodInfo = realMethodToNewMethod[method.methodBase];

                        block.replace(i, 1, Instruction.Create(OpCodes.Nop));
                        int n = i + 1;

                        // Pop all pushed args to a temp array
                        var mparams = getParameters(method.methodDefinition);
                        if (mparams.Count > 0)
                        {
                            block.insert(n++, Instruction.Create(OpCodes.Ldc_I4, mparams.Count));
                            var objectType = method.methodDefinition.Module.TypeSystem.Object;
                            block.insert(n++, Instruction.Create(OpCodes.Newarr, objectType));
                            block.insert(n++, create(OpCodes.Stloc, new Operand(Operand.Type.TempObjArray)));

                            for (int j = mparams.Count - 1; j >= 0; j--)
                            {
                                var argType = mparams[j];
                                if (argType.IsValueType)
                                {
                                    block.insert(n++, Instruction.Create(OpCodes.Box, argType));
                                }
                                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));
                                block.insert(n++, create(OpCodes.Ldloc, new Operand(Operand.Type.TempObj)));
                                block.insert(n++, Instruction.Create(OpCodes.Stelem_Ref));
                            }
                        }

                        // Push delegate instance
                        insertLoadThis(block, n++);
                        block.insert(n++, Instruction.Create(OpCodes.Ldc_I4, newMethodInfo.delegateIndex));
                        insertCallOurMethod(block, n++, "rtGetDelegateInstance");
                        block.insert(n++, create(OpCodes.Castclass, new Operand(Operand.Type.ReflectionType, newMethodInfo.delegateType)));

                        // Push all popped args
                        if (mparams.Count > 0)
                        {
                            for (int j = 0; j < mparams.Count; j++)
                            {
                                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.Ldelem_Ref));
                                var argType = mparams[j];
                                if (argType.IsValueType)
                                {
                                    block.insert(n++, Instruction.Create(OpCodes.Unbox_Any, argType));
                                }
                                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));
                                }
                            }
                        }

                        insertLoadThis(block, n++);
                        block.insert(n++, create(OpCodes.Call, new Operand(Operand.Type.NewMethod, method.methodBase)));
                        i = n - 1;
                        continue;
                    }
                }
            }
        }