Проверка крошечного и толстого заголовка метода.NET
Мне нужно перечислить все методы в модуле.NET и проверить, имеют ли они крошечный или толстый заголовок. Я решил использовать мощную библиотеку обработки модулей dnlib.NET.
E сть dnlib.DotNet.Writer.MethodBody
класс, который указывает заголовок метода tiny / fat (см. IsTiny()
а также IsFat()
). Тем не менее, я понятия не имею, как получить доступ к этому классу.
Класс находится в пространстве имен Writer - давайте используем Writer Listener:
public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
{
Обратите внимание, что легко перечислить все методы и получить другие MethodBody
один в Emit
Пространство имен:
foreach (TypeDef type in module.GetTypes())
{
foreach (MethodDef method in type.Methods)
{
dnlib.DotNet.Emit.MethodBody body = method.MethodBody;
}
}
}
К сожалению, этот класс не показывает ничего полезного. Я считаю, что что-то похожее на следующий псевдокод должен работать:
public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt)
{
foreach (TypeDef type in module.?)
{
foreach (? method in type.?)
{
dnlib.DotNet.Writer.MethodBody body = method.?;
}
}
}
1 ответ
После игры с dnlib я понял, что они действительно не предоставляют заголовки методов, флаги или необработанные байты методов. Используя собственный код, мне удалось прочитать сам заголовок:
class MainClass
{
public static void TestMethod() {
return;
}
public static void Main (string[] args)
{
// Load mscorlib.dll
string filename = typeof(void).Module.FullyQualifiedName;
ModuleDefMD mod = ModuleDefMD.Load(Assembly.GetExecutingAssembly().Location);
foreach (TypeDef type in mod.GetTypes()) {
Console.WriteLine("Type: {0}", type.FullName);
foreach (var method in type.Methods) {
using (var reader = mod.MetaData.PEImage.CreateFullStream()) {
reader.Position = (long)mod.MetaData.PEImage.ToFileOffset(method.RVA);
var flags = reader.ReadByte ();
Console.WriteLine (" Method: {0}, Tiny: {1}", method.Name, (flags & 3) == 2);
}
}
}
Console.WriteLine();
}
}