void detectHandlers(List <TypeDef> handlerTypes, CsvmInfo csvmInfo) { opCodeHandlers = new List <OpCodeHandler>(); var detected = new List <OpCodeHandler>(); foreach (var handlersList in OpCodeHandlers.opcodeHandlers) { opCodeHandlers.Clear(); foreach (var handlerType in handlerTypes) { var info = new UnknownHandlerInfo(handlerType, csvmInfo); detected.Clear(); foreach (var opCodeHandler in handlersList) { if (opCodeHandler.detect(info)) { detected.Add(opCodeHandler); } } if (detected.Count != 1) { goto next; } opCodeHandlers.Add(detected[0]); } if (new List <OpCodeHandler>(Utils.unique(opCodeHandlers)).Count == opCodeHandlers.Count) { return; } next :; } throw new ApplicationException("Could not detect all VM opcode handlers"); }
public bool detect(UnknownHandlerInfo info) { var sigInfo = OpCodeHandlerSigInfo; if (!compare(sigInfo.NumStaticMethods, info.NumStaticMethods)) return false; if (!compare(sigInfo.NumInstanceMethods, info.NumInstanceMethods)) return false; if (!compare(sigInfo.NumVirtualMethods, info.NumVirtualMethods)) return false; if (!compare(sigInfo.NumCtors, info.NumCtors)) return false; if (!compare(sigInfo.ExecuteMethodThrows, info.ExecuteMethodThrows)) return false; if (!compare(sigInfo.ExecuteMethodPops, info.ExecuteMethodPops)) return false; if (!info.hasSameFieldTypes(sigInfo.RequiredFieldTypes)) return false; if (sigInfo.ExecuteMethodLocals != null && !new LocalTypes(info.ExecuteMethod).all(sigInfo.ExecuteMethodLocals)) return false; if (Check != null) return Check(info); return true; }
public bool detect(UnknownHandlerInfo info) { var sigInfo = OpCodeHandlerSigInfo; if (!compare(sigInfo.NumStaticMethods, info.NumStaticMethods)) { return(false); } if (!compare(sigInfo.NumInstanceMethods, info.NumInstanceMethods)) { return(false); } if (!compare(sigInfo.NumVirtualMethods, info.NumVirtualMethods)) { return(false); } if (!compare(sigInfo.NumCtors, info.NumCtors)) { return(false); } if (!compare(sigInfo.ExecuteMethodThrows, info.ExecuteMethodThrows)) { return(false); } if (!compare(sigInfo.ExecuteMethodPops, info.ExecuteMethodPops)) { return(false); } if (!info.hasSameFieldTypes(sigInfo.RequiredFieldTypes)) { return(false); } if (sigInfo.ExecuteMethodLocals != null && !new LocalTypes(info.ExecuteMethod).all(sigInfo.ExecuteMethodLocals)) { return(false); } if (Check != null) { return(Check(info)); } return(true); }
void detectHandlers(List<TypeDef> handlerTypes, CsvmInfo csvmInfo) { opCodeHandlers = new List<OpCodeHandler>(); var detected = new List<OpCodeHandler>(); foreach (var handlersList in OpCodeHandlers.opcodeHandlers) { opCodeHandlers.Clear(); foreach (var handlerType in handlerTypes) { var info = new UnknownHandlerInfo(handlerType, csvmInfo); detected.Clear(); foreach (var opCodeHandler in handlersList) { if (opCodeHandler.detect(info)) detected.Add(opCodeHandler); } if (detected.Count != 1) goto next; opCodeHandlers.Add(detected[0]); } if (new List<OpCodeHandler>(Utils.unique(opCodeHandlers)).Count == opCodeHandlers.Count) return; next: ; } throw new ApplicationException("Could not detect all VM opcode handlers"); }
static bool throw_check(UnknownHandlerInfo info) { return !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodInfo System.Type::GetMethod(System.String,System.Reflection.BindingFlags)"); }
static bool ret_check(UnknownHandlerInfo info) { return DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)"); }
static bool rethrow_check(UnknownHandlerInfo info) { return info.ExecuteMethod.Body.Variables.Count == 0; }
static bool nop_check(UnknownHandlerInfo info) { return isEmptyMethod(info.ReadMethod) && isEmptyMethod(info.ExecuteMethod); }
static bool leave_check(UnknownHandlerInfo info) { return !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)") && !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Type System.Reflection.Module::ResolveType(System.Int32)") && !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MemberInfo System.Reflection.Module::ResolveMember(System.Int32)"); }
static bool throw_check(UnknownHandlerInfo info) { return(!DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodInfo System.Type::GetMethod(System.String,System.Reflection.BindingFlags)")); }
static bool rethrow_check(UnknownHandlerInfo info) { return(info.ExecuteMethod.Body.Variables.Count == 0); }
static bool ret_check(UnknownHandlerInfo info) { return(DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)")); }
static bool nop_check(UnknownHandlerInfo info) { return(isEmptyMethod(info.ReadMethod) && isEmptyMethod(info.ExecuteMethod)); }
static bool leave_check(UnknownHandlerInfo info) { return(!DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MethodBase System.Reflection.Module::ResolveMethod(System.Int32)") && !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Type System.Reflection.Module::ResolveType(System.Int32)") && !DotNetUtils.callsMethod(info.ExecuteMethod, "System.Reflection.MemberInfo System.Reflection.Module::ResolveMember(System.Int32)")); }