/// <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); } }
private static MethodDef GetTypeConstructor(TypeDef type) { return(type.FindConstructors().FirstOrDefault()); }
static MethodDef GetTypeConstructor(TypeDef type) => type.FindConstructors().FirstOrDefault();
private static MethodDef GetTypeConstructor(TypeDef type) { return 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; } }