예제 #1
0
 /// <summary>
 /// Gets the children.
 /// </summary>
 /// <value>
 /// The children.
 /// </value>
 protected override IEnumerable <ReflectionNode> LoadChildren()
 {
     foreach (var propertyDefinition in _typeDefinition.Properties.OrderBy(p => p.Name))
     {
         yield return(new PropertyReflectionNode(propertyDefinition, this));
     }
     foreach (var constructorMethodDefinition in _typeDefinition.FindConstructors())
     {
         yield return(new MethodReflectionNode(constructorMethodDefinition, this));
     }
     foreach (var methodDefinition in _typeDefinition.Methods.OrderBy(m => m.Name).Where(m => !m.IsSpecialName))
     {
         yield return(new MethodReflectionNode(methodDefinition, this));
     }
 }
        public void AddInitializer(Action <object> initializer, bool once)
        {
            bool error      = false;
            var  methodInfo = initializer.Method;

            if (!methodInfo.IsStatic)
            {
                _logging.WriteError("The method {0}.{1} must be static", methodInfo.DeclaringType.FullName, methodInfo.Name);
                error = true;
            }
            if (!methodInfo.IsPublic)
            {
                _logging.WriteError("The method {0}.{1} must be public", methodInfo.DeclaringType.FullName, methodInfo.Name);
                error = true;
            }
            if (error)
            {
                return;
            }

            var methodReference = _typeDefinition.Module.SafeImport(methodInfo);

            foreach (var ctor in _typeDefinition.FindConstructors().ToArray())
            {
                // the initializer is never inserted in cctor
                if (ctor.IsStaticConstructor)
                {
                    continue;
                }

                if (once && ctor.Body.Instructions.Any(i => i.OpCode == OpCodes.Call && methodReference.SafeEquivalent(i.Operand as IMethod, true)))
                {
                    continue;
                }

                var instructions = new Instructions(ctor.Body.Instructions, _typeDefinition.Module);
                // last instruction is a RET, so move just before it
                instructions.Cursor = instructions.Count - 1;
                instructions.Emit(OpCodes.Ldarg_0);
                instructions.Emit(OpCodes.Call, methodReference);
            }
        }
예제 #3
0
파일: Helpers.cs 프로젝트: jorik041/dnSpy
 private static MethodDef GetTypeConstructor(TypeDef type)
 {
     return(type.FindConstructors().FirstOrDefault());
 }
예제 #4
0
파일: Helpers.cs 프로젝트: soolafsen/dnSpy
 static MethodDef GetTypeConstructor(TypeDef type) => type.FindConstructors().FirstOrDefault();
예제 #5
0
파일: Helpers.cs 프로젝트: arkanoid1/dnSpy
		private static MethodDef GetTypeConstructor(TypeDef type) {
			return type.FindConstructors().FirstOrDefault();
		}
예제 #6
0
		static MethodDef GetTypeConstructor(TypeDef type) => type.FindConstructors().FirstOrDefault();
        public static void ResolveCalls(ModuleDefMD module)
        {
            foreach (DelegateInfo2 info2 in ListedDelegateInfo2s)
            {
                MethodDef methods = info2.callingMethodDef;
                FieldDef  fields  = info2.fieldDef;
                int       byteVal = info2.byteVal;
                if (methods.MDToken.ToInt32() == 0x0600000A && byteVal == 9)
                {
                }

                if (EncryptedDelegateMethod(methods))
                {
                    continue;
                }
                var       boolean = module.Metadata.TablesStream.TryReadFieldRow(fields.Rid, out RawFieldRow rw);
                byte[]    data    = module.Metadata.BlobStream.Read(rw.Signature);
                Emulation emu     = new Emulation(methods);
                var       mdtoken = 0;
                if (methods.MDToken.ToInt32() == 100663336 && byteVal == 4)
                {
                }
                emu.ValueStack.Parameters[methods.Parameters[0]] = null;
                emu.ValueStack.Parameters[methods.Parameters[1]] = (byte)byteVal;
                emu.OnInstructionPrepared = (sender, e) =>
                {
                    if (e.Instruction.OpCode != OpCodes.Callvirt || !e.Instruction.Operand.ToString()
                        .Contains("System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)"))
                    {
                        return;
                    }
                    mdtoken = sender.ValueStack.CallStack.Pop();
                    if (0x806EC032 == (uint)mdtoken)
                    {
                    }
                    e.Break = true;
                };
                emu.OnCallPrepared = (sender, e) =>
                {
                    var ebc = e.Instruction;
                    if (ebc.Operand.ToString().Contains("System.Byte[] System.Reflection.Module::ResolveSignature(System.Int32)"))
                    {
                        sender.ValueStack.CallStack.Pop();
                        sender.ValueStack.CallStack.Pop();
                        sender.ValueStack.CallStack.Push(data);
                        e.bypassCall = true;
                    }
                    else if (ebc.Operand.ToString().Contains("System.Type[] System.Reflection.FieldInfo::GetOptionalCustomModifiers()"))
                    {
                        sender.ValueStack.CallStack.Pop();

                        sender.ValueStack.CallStack.Push(new Type[500]);
                        e.bypassCall = true;
                    }
                    else if (ebc.Operand.ToString().Contains("System.Int32 System.Reflection.MemberInfo::get_MetadataToken()"))
                    {
                        sender.ValueStack.CallStack.Pop();
                        CModOptSig sig      = (CModOptSig)fields.FieldSig.Type;
                        int        modToken = sig.Modifier.MDToken.ToInt32();
                        sender.ValueStack.CallStack.Push(modToken);
                        e.bypassCall = true;
                    }
                    else if (ebc.Operand.ToString().Contains("System.String System.Reflection.MemberInfo::get_Name()"))
                    {
                        sender.ValueStack.CallStack.Pop();

                        string sig = fields.Name;

                        sender.ValueStack.CallStack.Push(sig);
                        e.bypassCall = true;
                    }
                    else if (ebc.Operand.ToString().Contains("System.Char System.String::get_Chars(System.Int32)"))
                    {
                        var one = sender.ValueStack.CallStack.Pop();
                        var two = sender.ValueStack.CallStack.Pop();
                        sender.ValueStack.CallStack.Push(two[one]);
                        e.bypassCall = true;
                    }
                    else if (ebc.Operand.ToString().Contains("System.Object[] System.Reflection.MemberInfo::GetCustomAttributes(System.Boolean)"))
                    {
                        var one = sender.ValueStack.CallStack.Pop();
                        var two = sender.ValueStack.CallStack.Pop();
                        sender.ValueStack.CallStack.Push(new object[500]);
                        e.bypassCall = true;
                    }
                    else if (ebc.Operand.ToString().Contains("System.Int32 System.Object::GetHashCode()"))
                    {
                        var one = sender.ValueStack.CallStack.Pop();
                        //			var two = sender.ValueStack.CallStack.Pop();
                        TypeDef   caType    = fields.CustomAttributes[0].AttributeType.ResolveTypeDef();
                        int       caCtorNum = (int)fields.CustomAttributes[0].ConstructorArguments[0].Value;
                        MethodDef meth      = First(caType.FindConstructors());
                        int       caKey     = MathResolver.GetResult(caCtorNum, meth);
                        sender.ValueStack.CallStack.Push(caKey);
                        e.bypassCall = true;
                    }
                    else
                    {
                        e.AllowCall  = false;
                        e.bypassCall = false;
                    }
                };
                emu.Emulate();

                info2.mdtoken = (uint)mdtoken;
                var ins = findInstruction(methods);
                var ab  = fields.Name.String[ins] ^ byteVal;
                var aa  = OpCodes.Call.Value;
                var v   = OpCodes.Callvirt.Value;
                var t   = OpCodes.Newobj.Value;

                OpCode te;
                if (ab == aa)
                {
                    te = OpCodes.Call;
                }
                else if (ab == v)
                {
                    te = OpCodes.Callvirt;
                }
                else
                {
                    te = OpCodes.Newobj;
                }
                info2.opcode = te;
            }
        }