예제 #1
0
 public static Boolean Is_Ldelem(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_1, Code.Castclass, Code.Callvirt, Code.Stloc_0, Code.Ldarg_0, Code.Ldloc_0,
         Code.Call, Code.Stloc_1, Code.Ldarg_0, Code.Ldloc_1, Code.Call, Code.Ret
     }) && _Is_Ldelem(ins));
 }
예제 #2
0
 public static Boolean Is_Throw(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Call, Code.Stloc_0, Code.Ldloc_0,
         Code.Callvirt, Code.Call, Code.Ret
     }) && _Is_Throw(ins, ((MethodDef)ins.DelegateMethod.Body.Instructions[5].Operand)));
 }
예제 #3
0
 public static Boolean Is_Ldelem_Ref(this VirtualOpCode ins)
 {
     // Is exact same as Ldelem_I except for the field reference
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Ldsfld, Code.Call, Code.Ret
     }) && _Is_Ldelem(ins) && !ins.Is_Ldelem_I());
 }
예제 #4
0
 public static Boolean Is_Ret(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Call, Code.Ret
     }) && ((MethodDef)ins.DelegateMethod.Body.Instructions[1].Operand).MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Ldc_I4_1, Code.Stfld, Code.Ret
     }));
 }
예제 #5
0
 private static Boolean _Is_Ldelem_T(VirtualOpCode ins, String typeName)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Ldtoken, Code.Call, Code.Call, Code.Ret
     }) && ((ITypeDefOrRef)ins.DelegateMethod.Body.Instructions[1].Operand)
            .FullName.Equals(typeName) &&
            _Is_Ldelem(ins));
 }
예제 #6
0
 private static Boolean Is_Stloc_C(VirtualOpCode ins, Code code)
 {
     return(ins.MatchesEntire(ins.ModifyPattern(Pattern_Stloc_C, Code.Ldc_I4, code)) &&
            Helpers.FindOpCodePatterns(                 // Check called method against Pattern_Helper_Stloc_C
                ((MethodDef)ins.DelegateMethod.Body.Instructions[2].Operand).Body.Instructions,
                Pattern_Helper_Stloc_C
                ).Count > 0);
 }
예제 #7
0
        public static Boolean _Is_Ldc(VirtualOpCode ins, OperandType expectedOperandType)
        {
            OperandType operandType;

            return(ins.MatchesEntire(Pattern_Ldc) &&
                   ins.TryGetOperandType(out operandType) &&
                   operandType == expectedOperandType);
        }
예제 #8
0
		private static Boolean _Is_Ldelem_T(VirtualOpCode ins, String typeName)
		{
			return ins.MatchesEntire(new Code[] {
				Code.Ldarg_0, Code.Ldtoken, Code.Call, Code.Call, Code.Ret
			}) && ((ITypeDefOrRef)ins.DelegateMethod.Body.Instructions[1].Operand)
				  .FullName.Equals(typeName)
				&& _Is_Ldelem(ins);
		}
예제 #9
0
 public static Boolean Is_Ldloc_S(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(Pattern_Ldloc) &&
            ((MethodDef)ins.DelegateMethod.Body.Instructions[7].Operand)
            .ReturnType.FullName.Equals("System.Byte") &&
            ((FieldDef)ins.DelegateMethod.Body.Instructions[5].Operand)
            .MDToken == ins.VType.LocalsField.MDToken);
 }
예제 #10
0
 public static Boolean Is_Ldlen(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Call, Code.Callvirt, Code.Castclass, Code.Stloc_0, Code.Ldarg_0,
         Code.Newobj, Code.Stloc_1, Code.Ldloc_1, Code.Ldloc_0, Code.Callvirt, Code.Callvirt,
         Code.Ldloc_1, Code.Call, Code.Ret
     }) && ((IMethod)ins.DelegateMethod.Body.Instructions[10].Operand)
            .FullName.Contains("System.Array::get_Length"));
 }
예제 #11
0
 public static Boolean Is_Ldstr(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_1, Code.Castclass, Code.Callvirt, Code.Stloc_0, Code.Ldarg_0,
         Code.Ldloc_0, Code.Call, Code.Stloc_1, Code.Ldarg_0, Code.Newobj,
         Code.Stloc_2, Code.Ldloc_2, Code.Ldloc_1, Code.Callvirt, Code.Ldloc_2,
         Code.Call, Code.Ret
     }) && ((MethodDef)ins.DelegateMethod.Body.Instructions[6].Operand)
            .ReturnType.FullName.Equals("System.String"));
 }
예제 #12
0
 private static Boolean _Is_Stloc(VirtualOpCode ins, String indexTypeName)
 {
     return(ins.MatchesEntire(Pattern_Stloc) &&
            ((MethodDef)ins.DelegateMethod.Body.Instructions[5].Operand)
            .ReturnType.FullName.Equals(indexTypeName) &&
            Helpers.FindOpCodePatterns(                 // Check called method against Pattern_Helper_Stloc_C
                ((MethodDef)ins.DelegateMethod.Body.Instructions[6].Operand).Body.Instructions,
                Pattern_Helper_Stloc_C
                ).Count > 0);
 }
예제 #13
0
        public static Boolean Is_Br(this VirtualOpCode ins)
        {
            MethodDef called;

            return(ins.MatchesEntire(new Code[] {
                Code.Ldarg_1, Code.Castclass, Code.Callvirt, Code.Stloc_0, Code.Ldarg_0,
                Code.Ldloc_0, Code.Call, Code.Ret
            }) && (called = (MethodDef)ins.DelegateMethod.Calls().ToArray()[1]).MatchesEntire(new Code[] {
                Code.Ldarg_0, Code.Ldarg_1, Code.Newobj, Code.Stfld, Code.Ret
            }) && ((IMethod)called.Body.Instructions[2].Operand).FullName.Contains("System.Nullable"));
        }
예제 #14
0
        public static Boolean Is_Pop(this VirtualOpCode ins)
        {
            MethodDef method = null;

            return(ins.MatchesEntire(new Code[] {
                Code.Ldarg_0, Code.Call, Code.Pop, Code.Ret
            }) && (method = ins.DelegateMethod.Body.Instructions[1].Operand as MethodDef) != null &&
                   method.MatchesEntire(new Code[] {
                Code.Ldarg_0, Code.Ldfld, Code.Callvirt, Code.Ret
            }));
        }
예제 #15
0
 public static Boolean Is_Conv_Ovf_I4(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Ldc_I4_1, Code.Call, Code.Ret
     }) && ins.DelegateMethod.MatchesIndirect(Pattern_Conv_I4));
 }
예제 #16
0
 private static Boolean Is_Ldloc_C(VirtualOpCode ins, Code code)
 {
     return(ins.MatchesEntire(ins.ModifyPattern(Pattern_Ldloc_C, Code.Ldc_I4, code)) &&
            ((FieldDef)ins.DelegateMethod.Body.Instructions[2].Operand).MDToken == ins.VType.LocalsField.MDToken);
 }
예제 #17
0
		private static Boolean Is_Stloc_C(VirtualOpCode ins, Code code)
		{
			return ins.MatchesEntire(ins.ModifyPattern(Pattern_Stloc_C, Code.Ldc_I4, code))
				&& Helpers.FindOpCodePatterns( // Check called method against Pattern_Helper_Stloc_C
					 ((MethodDef)ins.DelegateMethod.Body.Instructions[2].Operand).Body.Instructions,
					 Pattern_Helper_Stloc_C
				   ).Count > 0;
		}
예제 #18
0
		private static Boolean _Is_Stloc(VirtualOpCode ins, String indexTypeName)
		{
			return ins.MatchesEntire(Pattern_Stloc)
				&& ((MethodDef)ins.DelegateMethod.Body.Instructions[5].Operand)
				   .ReturnType.FullName.Equals(indexTypeName)
				&& Helpers.FindOpCodePatterns( // Check called method against Pattern_Helper_Stloc_C
					 ((MethodDef)ins.DelegateMethod.Body.Instructions[6].Operand).Body.Instructions,
					 Pattern_Helper_Stloc_C
				   ).Count > 0;
		}
예제 #19
0
		private static Boolean Is_Ldloc_C(VirtualOpCode ins, Code code)
		{
			return ins.MatchesEntire(ins.ModifyPattern(Pattern_Ldloc_C, Code.Ldc_I4, code))
				&& ((FieldDef)ins.DelegateMethod.Body.Instructions[2].Operand).MDToken == ins.VType.LocalsField.MDToken;
		}
예제 #20
0
		private static Boolean Is_Ldc_I4_C(VirtualOpCode ins, Code code)
		{
			return ins.MatchesEntire(ins.ModifyPattern(Pattern_Ldc_I4_C, Code.Ldc_I4, code));
		}
예제 #21
0
 public static Boolean Is_Ldnull(this VirtualOpCode ins)
 {
     return(ins.MatchesEntire(new Code[] {
         Code.Ldarg_0, Code.Newobj, Code.Call, Code.Ret
     }));
 }
예제 #22
0
 private static Boolean Is_Ldc_I4_C(VirtualOpCode ins, Code code)
 {
     return(ins.MatchesEntire(ins.ModifyPattern(Pattern_Ldc_I4_C, Code.Ldc_I4, code)));
 }
예제 #23
0
		public static Boolean _Is_Ldc(VirtualOpCode ins, OperandType expectedOperandType)
		{
			OperandType operandType;
			return ins.MatchesEntire(Pattern_Ldc)
				&& ins.TryGetOperandType(out operandType)
				&& operandType == expectedOperandType;
		}