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

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

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

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

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

textual
Листинг программы
  1.     public enum MachineType : ushort
  2.     {
  3.       IMAGE_FILE_MACHINE_UNKNOWN   = 0x0,
  4.       IMAGE_FILE_MACHINE_AM33          = 0x1d3,
  5.       IMAGE_FILE_MACHINE_AMD64        = 0x8664,
  6.       IMAGE_FILE_MACHINE_ARM            = 0x1c0,
  7.       IMAGE_FILE_MACHINE_EBC            = 0xebc,
  8.       IMAGE_FILE_MACHINE_I386           = 0x14c,
  9.       IMAGE_FILE_MACHINE_IA64           = 0x200,
  10.       IMAGE_FILE_MACHINE_M32R          = 0x9041,
  11.       IMAGE_FILE_MACHINE_MIPS16       = 0x266,
  12.       IMAGE_FILE_MACHINE_MIPSFPU     = 0x366,
  13.       IMAGE_FILE_MACHINE_MIPSFPU16  = 0x466,
  14.       IMAGE_FILE_MACHINE_POWERPC    = 0x1f0,
  15.       IMAGE_FILE_MACHINE_POWERPCFP = 0x1f1,
  16.       IMAGE_FILE_MACHINE_R4000         = 0x166,
  17.       IMAGE_FILE_MACHINE_SH3            = 0x1a2,
  18.       IMAGE_FILE_MACHINE_SH3DSP       = 0x1a3,
  19.       IMAGE_FILE_MACHINE_SH4            = 0x1a6,
  20.       IMAGE_FILE_MACHINE_SH5            = 0x1a8,
  21.       IMAGE_FILE_MACHINE_THUMB        = 0x1c2,
  22.       IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169,
  23.     }
  24.  
  25.  
  26.     public static MachineType GetDllMachineType(string dllPath)
  27.     {
  28.       // See [url]http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx[/url]
  29.       // Offset to PE header is always at 0x3C.
  30.       // The PE header starts with "PE\0\0" =  0x50 0x45 0x00 0x00,
  31.       // followed by a 2-byte machine type field (see the document above for the enum).
  32.       //
  33.       FileStream fs     = new FileStream(dllPath, FileMode.Open, FileAccess.Read);
  34.       BinaryReader br = new BinaryReader(fs);
  35.  
  36.       fs.Seek(0x3c, SeekOrigin.Begin);
  37.  
  38.       Int32 peOffset   = br.ReadInt32();
  39.  
  40.       fs.Seek(peOffset, SeekOrigin.Begin);
  41.  
  42.       UInt32 peHead   = br.ReadUInt32();
  43.  
  44.       if (peHead != 0x00004550) // "PE\0\0", little-endian
  45.         {
  46.           throw new Exception("Can't find PE header");
  47.         }
  48.  
  49.       MachineType machineType = (MachineType)br.ReadUInt16();
  50.  
  51.       br.Close();
  52.       fs.Close();
  53.  
  54.       return machineType;
  55.     }
  56.  
  57.     // Returns true if the dll is 64-bit, false if 32-bit, and null if unknown
  58.     private static bool UnmanagedDllIs64Bit(string dllPath)
  59.     {
  60.       switch (GetDllMachineType(dllPath))
  61.       {
  62.         case MachineType.IMAGE_FILE_MACHINE_AMD64:
  63.         case MachineType.IMAGE_FILE_MACHINE_IA64:
  64.                                                                            return true;
  65.         case MachineType.IMAGE_FILE_MACHINE_I386:
  66.                                                                            return false;
  67.         default:
  68.                                                                            return false;
  69.       }
  70.     }

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


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

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

11   голосов , оценка 4.091 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы