public static Boolean Is_Newobj(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Ldarg_0, Code.Ldloc_2, Code.Ldnull, Code.Ldloc_3, Code.Ldc_I4_0, Code.Call, Code.Stloc_S, Code.Leave_S })); }
private static Boolean Is_Ldarg_C(VirtualOpCode ins, Code code) { // Ldarg_C delegates will reference the arguments field in their Ldfld, which sets them apart from // other very similar delegates return(ins.Matches(ins.ModifyPattern(Pattern_Ldarg_C, Code.Ldc_I4, code)) && ((FieldDef)ins.DelegateMethod.Body.Instructions[2].Operand).MDToken == ins.VType.ArgumentsField.MDToken); }
public static Boolean Is_Box(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Ldarg_1, Code.Castclass, Code.Callvirt, Code.Stloc_2, Code.Ldarg_0, Code.Ldloc_2, Code.Call, Code.Stloc_0, Code.Ldarg_0, Code.Call })); }
private static Boolean Is_Ldarg_C(VirtualOpCode ins, Code code) { // Ldarg_C delegates will reference the arguments field in their Ldfld, which sets them apart from // other very similar delegates return ins.Matches(ins.ModifyPattern(Pattern_Ldarg_C, Code.Ldc_I4, code)) && ((FieldDef)ins.DelegateMethod.Body.Instructions[2].Operand).MDToken == ins.VType.ArgumentsField.MDToken; }
public static Boolean Is_Starg_S(this VirtualOpCode ins) { var sub = ins.Find(Pattern_Starg); return(sub != null && sub[3].Operand is MethodDef && ((MethodDef)sub[3].Operand).ReturnType.FullName.Equals("System.Byte") && ins.Matches(Pattern_Tail_Starg)); }
public static Boolean Is_Bge(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Call, Code.Brtrue_S, Code.Ldarg_1, Code.Castclass }) && ins.MatchesIndirect(new Code[] { Code.Ldarg_0, Code.Castclass, Code.Callvirt, Code.Ldarg_1, Code.Castclass, Code.Callvirt, Code.Clt, Code.Stloc_0, Code.Ldloc_0, Code.Ret })); }
public static Boolean Is_Bgt_Un(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Call, Code.Brfalse_S, Code.Ldarg_1, Code.Castclass }) && ins.MatchesIndirect(new Code[] { Code.Ldloc_2, Code.Ldloc_3, Code.Bgt_S, Code.Ldloc_2, Code.Call, Code.Brtrue_S, Code.Ldloc_3, Code.Call, Code.Br_S })); }
public static Boolean Is_Stsfld(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Ldloc_1, Code.Ldnull, Code.Ldloc_3, Code.Callvirt, Code.Callvirt, Code.Ret }) && ins.DelegateMethod.Calls().Any((called) => { return called.FullName.Contains("System.Reflection.FieldInfo::SetValue"); })); }
public static Boolean Is_Brtrue(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Ldloc_0, Code.Callvirt, Code.Ldnull, Code.Cgt_Un, Code.Stloc_1 //should work for both cleaned and uncleaned })); //var sub = ins.DelegateMethod.Find(new Code[] { // Code.Ldloc_0, Code.Castclass, Code.Callvirt, Code.Ldsfld, Code.Call, // Code.Stloc_1, Code.Br_S //}); //return sub != null // && ((IMethod)sub[4].Operand).FullName.Contains("System.UIntPtr::op_Inequality"); }
public static Boolean Is_Ldelema(this VirtualOpCode ins) { // Note: Another way to detect may be by looking at Newobj TypeDef, as // it seems specific to the Ldelema instruction type // (has 3 fields: Array, long, Type) return(ins.Matches(new Code[] { Code.Ldarg_0, Code.Newobj, Code.Stloc_0, Code.Ldloc_0, Code.Ldloc_S, Code.Callvirt, Code.Ldloc_0, Code.Ldloc_2, Code.Callvirt, Code.Ldloc_0, Code.Ldloc_3, Code.Callvirt, Code.Ldloc_0, Code.Call, Code.Ret })); }
public static Boolean Is_Brfalse(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Ldloc_0, Code.Callvirt, Code.Ldnull, Code.Ceq, Code.Stloc_1 //should work for both cleaned and uncleaned })); }
public static Boolean Is_Bge_Un(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Call, Code.Brtrue_S, Code.Ldarg_1, Code.Castclass }) && ins.MatchesIndirect(Pattern_Clt_Un)); }
public static Boolean Is_Ble(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Call, Code.Ldc_I4_0, Code.Ceq, Code.Stloc_2 }) && ins.MatchesIndirect(Pattern_Ble_Un)); }
public static Boolean Is_Bgt(this VirtualOpCode ins) { return(ins.Matches(Pattern_Br_True) && ins.MatchesIndirect(Pattern_GreaterThan)); }
public static Boolean Is_Bne_Un(this VirtualOpCode ins) { return(ins.Matches(Pattern_Br_False) && _Is_Br_Equality(ins) && _Jumps(ins)); }
public static Boolean Is_Brfalse(this VirtualOpCode ins) { return(ins.Matches(new Code[] { Code.Ldloc_0, Code.Callvirt, Code.Ldnull, Code.Ceq, Code.Stloc_1, Code.Br_S })); }