Получение информации о бинарности (x64 - x32) dll или exe файлах - C#

Узнай цену своей работы

Формулировка задачи:

Добрых день. Появилась необходимость получения информации о разрядности dll или exe файлах (или других иных бинарных файлах) . Вопрос какими средствами .NET можно это реализовать. Пишу программу на С#.

Решение задачи: «Получение информации о бинарности (x64 - x32) dll или exe файлах»

textual
Листинг программы
    public enum MachineType : ushort
    {
      IMAGE_FILE_MACHINE_UNKNOWN   = 0x0,
      IMAGE_FILE_MACHINE_AM33          = 0x1d3,
      IMAGE_FILE_MACHINE_AMD64        = 0x8664,
      IMAGE_FILE_MACHINE_ARM            = 0x1c0,
      IMAGE_FILE_MACHINE_EBC            = 0xebc,
      IMAGE_FILE_MACHINE_I386           = 0x14c,
      IMAGE_FILE_MACHINE_IA64           = 0x200,
      IMAGE_FILE_MACHINE_M32R          = 0x9041,
      IMAGE_FILE_MACHINE_MIPS16       = 0x266,
      IMAGE_FILE_MACHINE_MIPSFPU     = 0x366,
      IMAGE_FILE_MACHINE_MIPSFPU16  = 0x466,
      IMAGE_FILE_MACHINE_POWERPC    = 0x1f0,
      IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1,
      IMAGE_FILE_MACHINE_R4000         = 0x166,
      IMAGE_FILE_MACHINE_SH3            = 0x1a2,
      IMAGE_FILE_MACHINE_SH3DSP       = 0x1a3,
      IMAGE_FILE_MACHINE_SH4            = 0x1a6,
      IMAGE_FILE_MACHINE_SH5            = 0x1a8,
      IMAGE_FILE_MACHINE_THUMB        = 0x1c2,
      IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169,
    }
 
 
    public static MachineType GetDllMachineType(string dllPath)
    {
      // See [url]http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx[/url]
      // Offset to PE header is always at 0x3C.
      // The PE header starts with "PE\0\0" =  0x50 0x45 0x00 0x00,
      // followed by a 2-byte machine type field (see the document above for the enum).
      //
      FileStream fs     = new FileStream(dllPath, FileMode.Open, FileAccess.Read);
      BinaryReader br = new BinaryReader(fs);
 
      fs.Seek(0x3c, SeekOrigin.Begin);
 
      Int32 peOffset   = br.ReadInt32();
 
      fs.Seek(peOffset, SeekOrigin.Begin);
 
      UInt32 peHead   = br.ReadUInt32();
 
      if (peHead != 0x00004550) // "PE\0\0", little-endian
        {
          throw new Exception("Can't find PE header");
        }
 
      MachineType machineType = (MachineType)br.ReadUInt16();
 
      br.Close();
      fs.Close();
 
      return machineType;
    }
 
    // Returns true if the dll is 64-bit, false if 32-bit, and null if unknown
    private static bool UnmanagedDllIs64Bit(string dllPath)
    {
      switch (GetDllMachineType(dllPath))
      {
        case MachineType.IMAGE_FILE_MACHINE_AMD64:
        case MachineType.IMAGE_FILE_MACHINE_IA64:
                                                                           return true;
        case MachineType.IMAGE_FILE_MACHINE_I386:
                                                                           return false;
        default:
                                                                           return false;
      }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы