Благодаря комментарию Джороэна Мостерта я смог собрать воедино некоторый код.
foreach (var type in types)
{
var callsShow = false;
foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
var byteArray = method.GetMethodBody()?.GetILAsByteArray();
if (byteArray == null)
{
continue;
}
var bytes = BitConverter.ToString(byteArray);
var isMatch = Regex.IsMatch(bytes, "14-.*-28-.*-00-2B-26");
callsShow = callsShow || isMatch;
}
if (!callsShow)
{
MightBeBad(type);
}
}
Я создал экспериментальное выражение, неоднократно вызывая Friends.Show
в одном методе с различными параметрами и конфигурациями общих параметров, и искал повторяющиеся последовательности в байтах. YMMV
Из сотен исследованных классов были найдены 2 истинных положительных результата и 10 ложных положительных результатов. Ложные срабатывания звонили изнутри блоков проб и других необычных ситуаций. Тем не менее, мало, чтобы проверить вручную.
Также обратите внимание: шаблон может отличаться между сборками Debug и Release.