Доступ к полям из объекта в API PeNet

#c# #portable-executable

#c# #переносимый-исполняемый

Вопрос:

Мне нужно получить доступ к этим полям в PeNet API. Однако возвращаемое значение равно a uint16 , и я на самом деле не знаю, что с этим делать. Кто-нибудь знает, как я буду обращаться к этим полям?

Я попытался получить доступ к этим полям, однако предоставленная структура не имеет очевидных (для меня) способов доступа к ним. Я также пытался распечатать uint16 по частям, но это также не дало ничего особенно очевидного (есть 8 полей для доступа, поэтому я подумал, что это может быть либо первые 8, либо последние 8, но это не увенчалось успехом).

Любая помощь была бы очень признательна, поскольку я понятия не имею, где искать дальше: (

 using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var peHeader1 = new PeNet.PeFile(@"C:WindowsSystem32kernel32.dll");
            Console.WriteLine(peHeader1.ImageNtHeaders.OptionalHeader.DllCharacteristics.GetType());
            Console.WriteLine(peHeader1.ImageNtHeaders.OptionalHeader.DllCharacteristics);

            byte[] bytes = BitConverter.GetBytes(peHeader1.ImageNtHeaders.OptionalHeader.DllCharacteristics);

            int bitPos = 0;
            while (bitPos < 8 * bytes.Length)
            {
                int byteIndex = bitPos / 8;
                int offset = bitPos % 8;
                bool isSet = (bytes[byteIndex] amp; (1 << offset)) != 0;    

                Console.WriteLine(isSet);

                bitPos  ;
            }

            Console.ReadKey();
        }
    }
}
  

Ответ №1:

Я не уверен, что полностью понимаю вашу проблему, но здесь идет:

PeNet имеет enum функцию, которая выглядит следующим образом:

 [Flags]
enum OptionalHeaderDllCharacteristics : ushort
{
  IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE,
  IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY,
  IMAGE_DLLCHARACTERISTICS_NO_BIND,
  IMAGE_DLLCHARACTERISTICS_NO_ISOLATION,
  IMAGE_DLLCHARACTERISTICS_NO_SEH,
  IMAGE_DLLCHARACTERISTICS_NX_COMPAT,
  IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE,
  IMAGE_DLLCHARACTERISTICS_WDM_DRIVER,
}
  

Вы каким-то образом получаете значение. Это значение должно быть приведено к перечислению:

 Int16 value = 3; //This is the value you got somewhere
OptionalHeaderDllCharacteristics testEnum = (OptionalHeaderDllCharacteristics)value; //Cast it
  

После того, как вы его приведете, вы можете проверить наличие любого желаемого флага:

 if (testEnum.HasFlag(OptionalHeaderDllCharacteristics.IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY))
{
  //Do something
}