Доступ к полям из объекта в PeNet API - PullRequest
0 голосов
/ 12 апреля 2019

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

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

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

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var peHeader1 = new PeNet.PeFile(@"C:\Windows\System32\kernel32.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] & (1 << offset)) != 0;    

                Console.WriteLine(isSet);

                bitPos++;
            }

            Console.ReadKey();
        }
    }
}

1 Ответ

0 голосов
/ 12 апреля 2019

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

У 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
}
...